zoukankan      html  css  js  c++  java
  • Android ViewPager使用详解

    这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。看一下api的图片,

     ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。分三个步骤来使用它:

      1.在住布局文件里加入

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <android.support.v4.view.ViewPager    这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。  
    2.         android:id="@+id/viewpager"  
    3.         android:layout_width="wrap_content"  
    4.         android:layout_height="wrap_content"  
    5.         android:layout_gravity="center" >  

     2.加载要显示的页卡,

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. LayoutInflater lf = getLayoutInflater().from(this);  
    2.         view1 = lf.inflate(R.layout.layout1, null);  
    3.         view2 = lf.inflate(R.layout.layout2, null);  
    4.         view3 = lf.inflate(R.layout.layout3, null);  
    5.   
    6.         viewList = new ArrayList<View>();// 将要分页显示的View装入数组中  
    7.         viewList.add(view1);  
    8.         viewList.add(view2);  
    9.         viewList.add(view3);  

     3.在Activity里实例化ViewPager组件,并设置它的Adapter(就是PagerAdapter,方法与ListView一样的),在这里一般需要重写PagerAdapter。

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. PagerAdapter pagerAdapter = new PagerAdapter() {  
    2.   
    3.             @Override  
    4.             public boolean isViewFromObject(View arg0, Object arg1) {  
    5.   
    6.                 return arg0 == arg1;  
    7.             }  
    8.   
    9.             @Override  
    10.             public int getCount() {  
    11.   
    12.                 return viewList.size();  
    13.             }  
    14.   
    15.             @Override  
    16.             public void destroyItem(ViewGroup container, int position,  
    17.                     Object object) {  
    18.                 container.removeView(viewList.get(position));  
    19.   
    20.             }  
    21.   
    22.             @Override  
    23.             public int getItemPosition(Object object) {  
    24.   
    25.                 return super.getItemPosition(object);  
    26.             }  
    27.   
    28.             @Override  
    29.             public CharSequence getPageTitle(int position) {  
    30.   
    31.                 return titleList.get(position);  
    32.             }  
    33.   
    34.             @Override  
    35.             public Object instantiateItem(ViewGroup container, int position) {  
    36.                 container.addView(viewList.get(position));  
    37.                 weibo_button=(Button) findViewById(R.id.button1);  
    38.                 weibo_button.setOnClickListener(new OnClickListener() {  
    39.                       
    40.                     public void onClick(View v) {  
    41.                         intent=new Intent(ViewPagerDemo.this,WeiBoActivity.class);  
    42.                         startActivity(intent);  
    43.                     }  
    44.                 });  
    45.                 return viewList.get(position);  
    46.             }  
    47.   
    48.         };  
    49.         viewPager.setAdapter(pagerAdapter);  

      这是重写PagerAdapter的一个方法,我们还可以这样做:

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. public class MyViewPagerAdapter extends PagerAdapter{  
    2.         private List<View> mListViews;  
    3.           
    4.         public MyViewPagerAdapter(List<View> mListViews) {  
    5.             this.mListViews = mListViews;//构造方法,参数是我们的页卡,这样比较方便。  
    6.         }  
    7.   
    8.         @Override  
    9.         public void destroyItem(ViewGroup container, int position, Object object)   {     
    10.             container.removeView(mListViews.get(position));//删除页卡  
    11.         }  
    12.   
    13.   
    14.         @Override  
    15.         public Object instantiateItem(ViewGroup container, int position) {  //这个方法用来实例化页卡         
    16.              container.addView(mListViews.get(position), 0);//添加页卡  
    17.              return mListViews.get(position);  
    18.         }  
    19.   
    20.         @Override  
    21.         public int getCount() {           
    22.             return  mListViews.size();//返回页卡的数量  
    23.         }  
    24.           
    25.         @Override  
    26.         public boolean isViewFromObject(View arg0, Object arg1) {             
    27.             return arg0==arg1;//官方提示这样写  
    28.         }  
    29.     }  

      大同小异,有一定很重要,就是我们需要重写哪些方法。从上面的图片可以看到,ViewPager的适配器是PagerAdapter,它是基类提供适配器来填充页面ViewPager内部,你很可能想要使用一个更具体的实现,如FragmentPagerAdapter或FragmentStatePagerAdapter。在这里需要说明一下,其实ViewPager应该和Fragment一起使用,至少谷歌官方是这么想的,但是在3.0之下,我们没有必要这么做。下面要注意,当你实现一个PagerAdapter,你必须至少覆盖以下方法:

      从上面的例子中可以看到,我们最少也是实现了上面四个方法,当然如果你想让程序更健壮或是功能更全面,你可以重写其他的方法。下面看一下第一个完整的示例代码:
      主页面Activity:
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. package com.example.viewpagerdemo;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5. import android.os.Bundle;  
    6. import android.app.Activity;  
    7. import android.content.Context;  
    8. import android.content.Intent;  
    9. import android.support.v4.view.PagerAdapter;  
    10. import android.support.v4.view.PagerTabStrip;  
    11. import android.support.v4.view.PagerTitleStrip;  
    12. import android.support.v4.view.ViewPager;  
    13. import android.util.AttributeSet;  
    14. import android.view.LayoutInflater;  
    15. import android.view.Menu;  
    16. import android.view.View;  
    17. import android.view.View.OnClickListener;  
    18. import android.view.ViewGroup;  
    19. import android.widget.Button;  
    20.   
    21. public class ViewPagerDemo extends Activity {  
    22.   
    23.     private View view1, view2, view3;//需要滑动的页卡  
    24.     private ViewPager viewPager;//viewpager  
    25.     private PagerTitleStrip pagerTitleStrip;//viewpager的标题  
    26.     private PagerTabStrip pagerTabStrip;//一个viewpager的指示器,效果就是一个横的粗的下划线  
    27.     private List<View> viewList;//把需要滑动的页卡添加到这个list中  
    28.     private List<String> titleList;//viewpager的标题  
    29.     private Button weibo_button;//button对象,一会用来进入第二个Viewpager的示例  
    30.    private Intent intent;  
    31.     @Override  
    32.     public void onCreate(Bundle savedInstanceState) {  
    33.         super.onCreate(savedInstanceState);  
    34.         setContentView(R.layout.activity_view_pager_demo);  
    35.         initView();  
    36.     }  
    37.       /*在这里需要说明一下,在上面的图片中我们看到了,PagerTabStrip,PagerTitleStrip,他们其实是viewpager的一个指示器,前者效果就是一个横的粗的下划线,后者用来显示各个页卡的标题,当然而这也可以共存。在使用他们的时候需要注意,看下面的布局文件,要在android.support.v4.view.ViewPager里面添加 
    38. android.support.v4.view.PagerTabStrip以及android.support.v4.view.PagerTitleStrip。 
    39.  
    40.     private void initView() { 
    41.         viewPager = (ViewPager) findViewById(R.id.viewpager); 
    42.         //pagerTitleStrip = (PagerTitleStrip) findViewById(R.id.pagertitle); 
    43.         pagerTabStrip=(PagerTabStrip) findViewById(R.id.pagertab); 
    44.         pagerTabStrip.setTabIndicatorColor(getResources().getColor(R.color.gold));  
    45.         pagerTabStrip.setDrawFullUnderline(false); 
    46.         pagerTabStrip.setBackgroundColor(getResources().getColor(R.color.azure)); 
    47.         pagerTabStrip.setTextSpacing(50); 
    48.         /* 
    49.         weibo_button=(Button) findViewById(R.id.button1); 
    50.         weibo_button.setOnClickListener(new OnClickListener() { 
    51.              
    52.             public void onClick(View v) { 
    53.                 intent=new Intent(ViewPagerDemo.this,WeiBoActivity.class); 
    54.                 startActivity(intent); 
    55.             } 
    56.         }); 
    57.         */  
    58.           
    59.         view1 = findViewById(R.layout.layout1);  
    60.         view2 = findViewById(R.layout.layout2);  
    61.         view3 = findViewById(R.layout.layout3);  
    62.   
    63.         LayoutInflater lf = getLayoutInflater().from(this);  
    64.         view1 = lf.inflate(R.layout.layout1, null);  
    65.         view2 = lf.inflate(R.layout.layout2, null);  
    66.         view3 = lf.inflate(R.layout.layout3, null);  
    67.   
    68.         viewList = new ArrayList<View>();// 将要分页显示的View装入数组中  
    69.         viewList.add(view1);  
    70.         viewList.add(view2);  
    71.         viewList.add(view3);  
    72.   
    73.         titleList = new ArrayList<String>();// 每个页面的Title数据  
    74.         titleList.add("wp");  
    75.         titleList.add("jy");  
    76.         titleList.add("jh");  
    77.   
    78.         PagerAdapter pagerAdapter = new PagerAdapter() {  
    79.   
    80.             @Override  
    81.             public boolean isViewFromObject(View arg0, Object arg1) {  
    82.   
    83.                 return arg0 == arg1;  
    84.             }  
    85.   
    86.             @Override  
    87.             public int getCount() {  
    88.   
    89.                 return viewList.size();  
    90.             }  
    91.   
    92.             @Override  
    93.             public void destroyItem(ViewGroup container, int position,  
    94.                     Object object) {  
    95.                 container.removeView(viewList.get(position));  
    96.   
    97.             }  
    98.   
    99.             @Override  
    100.             public int getItemPosition(Object object) {  
    101.   
    102.                 return super.getItemPosition(object);  
    103.             }  
    104.   
    105.             @Override  
    106.             public CharSequence getPageTitle(int position) {  
    107.   
    108.                 return titleList.get(position);//直接用适配器来完成标题的显示,所以从上面可以看到,我们没有使用PagerTitleStrip。当然你可以使用。  
    109.   
    110.             }  
    111.   
    112.             @Override  
    113.             public Object instantiateItem(ViewGroup container, int position) {  
    114.                 container.addView(viewList.get(position));  
    115.                 weibo_button=(Button) findViewById(R.id.button1);//这个需要注意,我们是在重写adapter里面实例化button组件的,如果你在onCreate()方法里这样做会报错的。  
    116.                 weibo_button.setOnClickListener(new OnClickListener() {  
    117.                       
    118.                     public void onClick(View v) {  
    119.                         intent=new Intent(ViewPagerDemo.this,WeiBoActivity.class);  
    120.                         startActivity(intent);  
    121.                     }  
    122.                 });  
    123.                 return viewList.get(position);  
    124.             }  
    125.   
    126.         };  
    127.         viewPager.setAdapter(pagerAdapter);  
    128.     }  
    129.   
    130.     @Override  
    131.     public boolean onCreateOptionsMenu(Menu menu) {  
    132.         getMenuInflater().inflate(R.menu.activity_view_pager_demo, menu);  
    133.         return true;  
    134.     }  
    135.   
    136. }  
      它的布局文件:
     
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:orientation="vertical" >  
    6.   
    7.     <android.support.v4.view.ViewPager  
    8.         android:id="@+id/viewpager"  
    9.         android:layout_width="wrap_content"  
    10.         android:layout_height="wrap_content"  
    11.         android:layout_gravity="center" >  
    12.                 
    13.         <android.support.v4.view.PagerTabStrip    
    14.             android:id="@+id/pagertab"    
    15.             android:layout_width="wrap_content"    
    16.             android:layout_height="wrap_content"    
    17.             android:layout_gravity="top"/>    
    18.            
    19.     </android.support.v4.view.ViewPager>  
    20.   
    21. </LinearLayout>  
    22. <!--注意事项:     
    23.     1.这里ViewPager和 PagerTabStrip都要把包名写全了,不然会ClassNotFount    
    24.     2.API中说:在布局xml把PagerTabStrip当做ViewPager的一个子标签来用,不能拿出来,不然还是会报错    
    25.     3.在PagerTabStrip标签中可以用属性android:layout_gravity=TOP|BOTTOM来指定title的位置    
    26.     4.如果要显示出PagerTabStrip某一页的title,需要在ViewPager的adapter中实现getPageTitle(int)-->   
     这样就完成了一个简单的ViewPager的使用示例,看一下效果图:
     可以左右滑动页卡,但是仔细看一下,标题的效果不好,不能一次显示一个,而且标题还滑动。其实在api里面提供了一个pagerTabStrip.setTextSpacing()来设置标题的距离,但是我在这里设置了,没有效果不知道为什么,明白的朋友希望能够赐教一下。
      所以就有人使用下面这样的方法来仿微博的效果,
      这个标题就固定了,而且可以左右滑动,也有下面的横线,来指示页卡。方法和上面的差不多,区别在于这个横线需要我们自己来做,其实就是一个图片。这个例子是网上的一篇文章,看代码:
    主Activity:
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. package com.example.viewpagerdemo;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5. import android.app.Activity;  
    6. import android.graphics.BitmapFactory;  
    7. import android.graphics.Matrix;  
    8. import android.os.Bundle;  
    9. import android.support.v4.view.PagerAdapter;  
    10. import android.support.v4.view.ViewPager;  
    11. import android.support.v4.view.ViewPager.OnPageChangeListener;  
    12. import android.util.DisplayMetrics;  
    13. import android.view.LayoutInflater;  
    14. import android.view.View;  
    15. import android.view.View.OnClickListener;  
    16. import android.view.animation.Animation;  
    17. import android.view.animation.TranslateAnimation;  
    18. import android.view.ViewGroup;  
    19. import android.widget.ImageView;  
    20. import android.widget.TextView;  
    21. import android.widget.Toast;  
    22.   
    23. public class WeiBoActivity extends Activity {  
    24.   
    25.     private ViewPager viewPager;//页卡内容  
    26.     private ImageView imageView;// 动画图片  
    27.     private TextView textView1,textView2,textView3;  
    28.     private List<View> views;// Tab页面列表  
    29.     private int offset = 0;// 动画图片偏移量  
    30.     private int currIndex = 0;// 当前页卡编号  
    31.     private int bmpW;// 动画图片宽度  
    32.     private View view1,view2,view3;//各个页卡  
    33.     @Override  
    34.     protected void onCreate(Bundle savedInstanceState) {  
    35.         super.onCreate(savedInstanceState);  
    36.         setContentView(R.layout.weibo);  
    37.         InitImageView();  
    38.         InitTextView();  
    39.         InitViewPager();  
    40.     }  
    41.   
    42.     private void InitViewPager() {  
    43.         viewPager=(ViewPager) findViewById(R.id.vPager);  
    44.         views=new ArrayList<View>();  
    45.         LayoutInflater inflater=getLayoutInflater();  
    46.         view1=inflater.inflate(R.layout.lay1, null);  
    47.         view2=inflater.inflate(R.layout.lay2, null);  
    48.         view3=inflater.inflate(R.layout.lay3, null);  
    49.         views.add(view1);  
    50.         views.add(view2);  
    51.         views.add(view3);  
    52.         viewPager.setAdapter(new MyViewPagerAdapter(views));  
    53.         viewPager.setCurrentItem(0);  
    54.         viewPager.setOnPageChangeListener(new MyOnPageChangeListener());  
    55.     }  
    56.      /** 
    57.       *  初始化头标 
    58.       */  
    59.   
    60.     private void InitTextView() {  
    61.         textView1 = (TextView) findViewById(R.id.text1);  
    62.         textView2 = (TextView) findViewById(R.id.text2);  
    63.         textView3 = (TextView) findViewById(R.id.text3);  
    64.   
    65.         textView1.setOnClickListener(new MyOnClickListener(0));  
    66.         textView2.setOnClickListener(new MyOnClickListener(1));  
    67.         textView3.setOnClickListener(new MyOnClickListener(2));  
    68.     }  
    69.   
    70.     /** 
    71.      2      * 初始化动画,这个就是页卡滑动时,下面的横线也滑动的效果,在这里需要计算一些数据 
    72.      3 */  
    73.   
    74.     private void InitImageView() {  
    75.         imageView= (ImageView) findViewById(R.id.cursor);  
    76.         bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a).getWidth();// 获取图片宽度  
    77.         DisplayMetrics dm = new DisplayMetrics();  
    78.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
    79.         int screenW = dm.widthPixels;// 获取分辨率宽度  
    80.         offset = (screenW / 3 - bmpW) / 2;// 计算偏移量  
    81.         Matrix matrix = new Matrix();  
    82.         matrix.postTranslate(offset, 0);  
    83.         imageView.setImageMatrix(matrix);// 设置动画初始位置  
    84.     }  
    85. <img src="https://img-my.csdn.net/uploads/201211/10/1352554452_1685.jpg" alt="">  
    86.     /**  
    87.      *      
    88.      * 头标点击监听 3 */  
    89.     private class MyOnClickListener implements OnClickListener{  
    90.         private int index=0;  
    91.         public MyOnClickListener(int i){  
    92.             index=i;  
    93.         }  
    94.         public void onClick(View v) {  
    95.             viewPager.setCurrentItem(index);              
    96.         }  
    97.           
    98.     }  
    99.       
    100.     public class MyViewPagerAdapter extends PagerAdapter{  
    101.         private List<View> mListViews;  
    102.           
    103.         public MyViewPagerAdapter(List<View> mListViews) {  
    104.             this.mListViews = mListViews;  
    105.         }  
    106.   
    107.         @Override  
    108.         public void destroyItem(ViewGroup container, int position, Object object)   {     
    109.             container.removeView(mListViews.get(position));  
    110.         }  
    111.   
    112.   
    113.         @Override  
    114.         public Object instantiateItem(ViewGroup container, int position) {            
    115.              container.addView(mListViews.get(position), 0);  
    116.              return mListViews.get(position);  
    117.         }  
    118.   
    119.         @Override  
    120.         public int getCount() {           
    121.             return  mListViews.size();  
    122.         }  
    123.           
    124.         @Override  
    125.         public boolean isViewFromObject(View arg0, Object arg1) {             
    126.             return arg0==arg1;  
    127.         }  
    128.     }  
    129.   
    130.     public class MyOnPageChangeListener implements OnPageChangeListener{  
    131.   
    132.         int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量  
    133.         int two = one * 2;// 页卡1 -> 页卡3 偏移量  
    134.         public void onPageScrollStateChanged(int arg0) {  
    135.               
    136.               
    137.         }  
    138.   
    139.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
    140.               
    141.               
    142.         }  
    143.   
    144.         public void onPageSelected(int arg0) {  
    145.             /*两种方法,这个是一种,下面还有一种,显然这个比较麻烦 
    146.             Animation animation = null; 
    147.             switch (arg0) { 
    148.             case 0: 
    149.                 if (currIndex == 1) { 
    150.                     animation = new TranslateAnimation(one, 0, 0, 0); 
    151.                 } else if (currIndex == 2) { 
    152.                     animation = new TranslateAnimation(two, 0, 0, 0); 
    153.                 } 
    154.                 break; 
    155.             case 1: 
    156.                 if (currIndex == 0) { 
    157.                     animation = new TranslateAnimation(offset, one, 0, 0); 
    158.                 } else if (currIndex == 2) { 
    159.                     animation = new TranslateAnimation(two, one, 0, 0); 
    160.                 } 
    161.                 break; 
    162.             case 2: 
    163.                 if (currIndex == 0) { 
    164.                     animation = new TranslateAnimation(offset, two, 0, 0); 
    165.                 } else if (currIndex == 1) { 
    166.                     animation = new TranslateAnimation(one, two, 0, 0); 
    167.                 } 
    168.                 break; 
    169.                  
    170.             } 
    171.             */  
    172.             Animation animation = new TranslateAnimation(one*currIndex, one*arg0, 0, 0);//显然这个比较简洁,只有一行代码。  
    173.             currIndex = arg0;  
    174.             animation.setFillAfter(true);// True:图片停在动画结束位置  
    175.             animation.setDuration(300);  
    176.             imageView.startAnimation(animation);  
    177.             Toast.makeText(WeiBoActivity.this, "您选择了"+ viewPager.getCurrentItem()+"页卡", Toast.LENGTH_SHORT).show();  
    178.         }  
    179.           
    180.     }  
    181. }  
    它的布局文件:
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.    android:layout_width="fill_parent"  
    4.    android:layout_height="fill_parent"  
    5.    android:orientation="vertical" >  
    6.   
    7.    <LinearLayout  
    8.        android:id="@+id/linearLayout1"  
    9.        android:layout_width="fill_parent"  
    10.        android:layout_height="40.0dip"  
    11.        android:background="#FFFFFF" >  
    12.   
    13.        <TextView  
    14.            android:id="@+id/text1"  
    15.            android:layout_width="fill_parent"  
    16.            android:layout_height="fill_parent"  
    17.            android:layout_weight="1.0"  
    18.            android:gravity="center"  
    19.            android:text=" @我"  
    20.            android:textColor="#000000"  
    21.            android:textSize="20.0dip" />  
    22.   
    23.        <TextView  
    24.            android:id="@+id/text2"  
    25.            android:layout_width="fill_parent"  
    26.            android:layout_height="fill_parent"  
    27.            android:layout_weight="1.0"  
    28.            android:gravity="center"  
    29.            android:text="评论"  
    30.            android:textColor="#000000"  
    31.            android:textSize="20.0dip" />  
    32.   
    33.        <TextView  
    34.            android:id="@+id/text3"  
    35.            android:layout_width="fill_parent"  
    36.            android:layout_height="fill_parent"  
    37.            android:layout_weight="1.0"  
    38.            android:gravity="center"  
    39.            android:text="私信"  
    40.            android:textColor="#000000"  
    41.            android:textSize="20.0dip" />  
    42.    </LinearLayout>  
    43.   
    44.    <ImageView  
    45.        android:id="@+id/cursor"  
    46.        android:layout_width="fill_parent"  
    47.        android:layout_height="wrap_content"  
    48.        android:scaleType="matrix"  
    49.        android:src="@drawable/a" />  
    50.   
    51.    <android.support.v4.view.ViewPager  
    52.        android:id="@+id/vPager"  
    53.        android:layout_width="wrap_content"  
    54.        android:layout_height="0dp"  
    55.        android:layout_gravity="center"  
    56.        android:layout_weight="1.0"  
    57.        android:background="#000000"  
    58.        android:flipInterval="30"  
    59.        android:persistentDrawingCache="animation" />  
    60. lt;/LinearLayout>  
      效果如下:



     下面使用ViewPager来实现一个程序引导的demo:
     一般来说,引导界面是出现第一次运行时出现的,之后不会再出现。所以需要记录是否是第一次使用程序,办法有很多,最容易想到的就是使用SharedPreferences来保存。步骤如下:
      1、程序进入欢迎界面,SplashActivity,在这里读取SharedPreferences里面的变量,先设置为true。进入引导界面,然后设置为false。
      2、之后每次进入欢迎界面读取SharedPreferences里面的变量,因为是false,所以不会运行引导界面了。
    代码如下:
    SplashActivity.java,欢迎界面。
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. import android.app.Activity;  
    2. import android.content.Intent;  
    3. import android.content.SharedPreferences;  
    4. import android.os.Bundle;  
    5. import android.os.Handler;  
    6. import android.os.Message;  
    7.   
    8. /** 
    9.  
    10.  */  
    11. public class SplashActivity extends Activity {  
    12.     boolean isFirstIn = false;  
    13.   
    14.     private static final int GO_HOME = 1000;  
    15.     private static final int GO_GUIDE = 1001;  
    16.     // 延迟3秒  
    17.     private static final long SPLASH_DELAY_MILLIS = 3000;  
    18.   
    19.     private static final String SHAREDPREFERENCES_NAME = "first_pref";  
    20.   
    21.     /** 
    22.      * Handler:跳转到不同界面 
    23.      */  
    24.     private Handler mHandler = new Handler() {  
    25.   
    26.         @Override  
    27.         public void handleMessage(Message msg) {  
    28.             switch (msg.what) {  
    29.             case GO_HOME:  
    30.                 goHome();  
    31.                 break;  
    32.             case GO_GUIDE:  
    33.                 goGuide();  
    34.                 break;  
    35.             }  
    36.             super.handleMessage(msg);  
    37.         }  
    38.     };  
    39.   
    40.     @Override  
    41.     protected void onCreate(Bundle savedInstanceState) {  
    42.         super.onCreate(savedInstanceState);  
    43.         setContentView(R.layout.splash);  
    44.   
    45.         init();  
    46.     }  
    47.   
    48.     private void init() {  
    49.         // 读取SharedPreferences中需要的数据  
    50.         // 使用SharedPreferences来记录程序的使用次数  
    51.         SharedPreferences preferences = getSharedPreferences(  
    52.                 SHAREDPREFERENCES_NAME, MODE_PRIVATE);  
    53.   
    54.         // 取得相应的值,如果没有该值,说明还未写入,用true作为默认值  
    55.         isFirstIn = preferences.getBoolean("isFirstIn", true);  
    56.   
    57.         // 判断程序与第几次运行,如果是第一次运行则跳转到引导界面,否则跳转到主界面  
    58.         if (!isFirstIn) {  
    59.             // 使用Handler的postDelayed方法,3秒后执行跳转到MainActivity  
    60.             mHandler.sendEmptyMessageDelayed(GO_HOME, SPLASH_DELAY_MILLIS);  
    61.         } else {  
    62.             mHandler.sendEmptyMessageDelayed(GO_GUIDE, SPLASH_DELAY_MILLIS);  
    63.         }  
    64.   
    65.     }  
    66.   
    67.     private void goHome() {  
    68.         Intent intent = new Intent(SplashActivity.this, MainActivity.class);  
    69.         SplashActivity.this.startActivity(intent);  
    70.         SplashActivity.this.finish();  
    71.     }  
    72.   
    73.     private void goGuide() {  
    74.         Intent intent = new Intent(SplashActivity.this, GuideActivity.class);  
    75.         SplashActivity.this.startActivity(intent);  
    76.         SplashActivity.this.finish();  
    77.     }  
    78. }  
    GuideActivity.java引导界面:
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. import java.util.ArrayList;  
    2. import java.util.List;  
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.support.v4.view.ViewPager;  
    6. import android.support.v4.view.ViewPager.OnPageChangeListener;  
    7. import android.view.LayoutInflater;  
    8. import android.view.View;  
    9. import android.widget.ImageView;  
    10. import android.widget.LinearLayout;  
    11. import cn.eoe.leigo.splash.adapter.ViewPagerAdapter;  
    12.   
    13. /** 
    14.  *  
    15.  
    16.  *  
    17.  */  
    18. public class GuideActivity extends Activity implements OnPageChangeListener {  
    19.   
    20.     private ViewPager vp;  
    21.     private ViewPagerAdapter vpAdapter;  
    22.     private List<View> views;  
    23.   
    24.     // 底部小点图片  
    25.     private ImageView[] dots;  
    26.   
    27.     // 记录当前选中位置  
    28.     private int currentIndex;  
    29.   
    30.     @Override  
    31.     protected void onCreate(Bundle savedInstanceState) {  
    32.         super.onCreate(savedInstanceState);  
    33.         setContentView(R.layout.guide);  
    34.   
    35.         // 初始化页面  
    36.         initViews();  
    37.   
    38.         // 初始化底部小点  
    39.         initDots();  
    40.     }  
    41.   
    42.     private void initViews() {  
    43.         LayoutInflater inflater = LayoutInflater.from(this);  
    44.   
    45.         views = new ArrayList<View>();  
    46.         // 初始化引导图片列表  
    47.         views.add(inflater.inflate(R.layout.what_new_one, null));  
    48.         views.add(inflater.inflate(R.layout.what_new_two, null));  
    49.         views.add(inflater.inflate(R.layout.what_new_three, null));  
    50.         views.add(inflater.inflate(R.layout.what_new_four, null));  
    51.   
    52.         // 初始化Adapter  
    53.         vpAdapter = new ViewPagerAdapter(views, this);  
    54.           
    55.         vp = (ViewPager) findViewById(R.id.viewpager);  
    56.         vp.setAdapter(vpAdapter);  
    57.         // 绑定回调  
    58.         vp.setOnPageChangeListener(this);  
    59.     }  
    60.   
    61.     private void initDots() {  
    62.         LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
    63.   
    64.         dots = new ImageView[views.size()];  
    65.   
    66.         // 循环取得小点图片  
    67.         for (int i = 0; i < views.size(); i++) {  
    68.             dots[i] = (ImageView) ll.getChildAt(i);  
    69.             dots[i].setEnabled(true);// 都设为灰色  
    70.         }  
    71.   
    72.         currentIndex = 0;  
    73.         dots[currentIndex].setEnabled(false);// 设置为白色,即选中状态  
    74.     }  
    75.   
    76.     private void setCurrentDot(int position) {  
    77.         if (position < 0 || position > views.size() - 1  
    78.                 || currentIndex == position) {  
    79.             return;  
    80.         }  
    81.   
    82.         dots[position].setEnabled(false);  
    83.         dots[currentIndex].setEnabled(true);  
    84.   
    85.         currentIndex = position;  
    86.     }  
    87.   
    88.     // 当滑动状态改变时调用  
    89.     @Override  
    90.     public void onPageScrollStateChanged(int arg0) {  
    91.     }  
    92.   
    93.     // 当当前页面被滑动时调用  
    94.     @Override  
    95.     public void onPageScrolled(int arg0, float arg1, int arg2) {  
    96.     }  
    97.   
    98.     // 当新的页面被选中时调用  
    99.     @Override  
    100.     public void onPageSelected(int arg0) {  
    101.         // 设置底部小点选中状态  
    102.         setCurrentDot(arg0);  
    103.     }  
    104.   
    105. }  
    ViewPagerAdapter.java。ViewPager的适配器:
    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. import java.util.List;  
    2. import android.app.Activity;  
    3. import android.content.Context;  
    4. import android.content.Intent;  
    5. import android.content.SharedPreferences;  
    6. import android.content.SharedPreferences.Editor;  
    7. import android.os.Parcelable;  
    8. import android.support.v4.view.PagerAdapter;  
    9. import android.support.v4.view.ViewPager;  
    10. import android.view.View;  
    11. import android.view.View.OnClickListener;  
    12. import android.widget.ImageView;  
    13. import cn.eoe.leigo.splash.MainActivity;  
    14. import cn.eoe.leigo.splash.R;  
    15.   
    16. /** 
    17.  */  
    18. public class ViewPagerAdapter extends PagerAdapter {  
    19.   
    20.     // 界面列表  
    21.     private List<View> views;  
    22.     private Activity activity;  
    23.     private static final String SHAREDPREFERENCES_NAME = "first_pref";  
    24.     public ViewPagerAdapter(List<View> views, Activity activity) {  
    25.         this.views = views;  
    26.         this.activity = activity;  
    27.     }  
    28.   
    29.     // 销毁arg1位置的界面  
    30.     @Override  
    31.     public void destroyItem(View arg0, int arg1, Object arg2) {  
    32.         ((ViewPager) arg0).removeView(views.get(arg1));  
    33.     }  
    34.   
    35.     @Override  
    36.     public void finishUpdate(View arg0) {  
    37.     }  
    38.   
    39.     // 获得当前界面数  
    40.     @Override  
    41.     public int getCount() {  
    42.         if (views != null) {  
    43.             return views.size();  
    44.         }  
    45.         return 0;  
    46.     }  
    47.   
    48.     // 初始化arg1位置的界面  
    49.     @Override  
    50.     public Object instantiateItem(View arg0, int arg1) {  
    51.         ((ViewPager) arg0).addView(views.get(arg1), 0);  
    52.         if (arg1 == views.size() - 1) {  
    53.             ImageView mStartWeiboImageButton = (ImageView) arg0  
    54.                     .findViewById(R.id.iv_start_weibo);  
    55.             mStartWeiboImageButton.setOnClickListener(new OnClickListener() {  
    56.   
    57.                 @Override  
    58.                 public void onClick(View v) {  
    59.                     // 设置已经引导  
    60.                     setGuided();  
    61.                     goHome();  
    62.   
    63.                 }  
    64.   
    65.             });  
    66.         }  
    67.         return views.get(arg1);  
    68.     }  
    69.   
    70.     private void goHome() {  
    71.         // 跳转  
    72.         Intent intent = new Intent(activity, MainActivity.class);  
    73.         activity.startActivity(intent);  
    74.         activity.finish();  
    75.     }  
    76.     /** 
    77.      *  
    78.      * method desc:设置已经引导过了,下次启动不用再次引导 
    79.      */  
    80.     private void setGuided() {  
    81.         SharedPreferences preferences = activity.getSharedPreferences(  
    82.                 SHAREDPREFERENCES_NAME, Context.MODE_PRIVATE);  
    83.         Editor editor = preferences.edit();  
    84.         // 存入数据  
    85.         editor.putBoolean("isFirstIn", false);  
    86.         // 提交修改  
    87.         editor.commit();  
    88.     }  
    89.   
    90.     // 判断是否由对象生成界面  
    91.     @Override  
    92.     public boolean isViewFromObject(View arg0, Object arg1) {  
    93.         return (arg0 == arg1);  
    94.     }  
    95.   
    96.     @Override  
    97.     public void restoreState(Parcelable arg0, ClassLoader arg1) {  
    98.     }  
    99.   
    100.     @Override  
    101.     public Parcelable saveState() {  
    102.         return null;  
    103.     }  
    104.   
    105.     @Override  
    106.     public void startUpdate(View arg0) {  
    107.     }  
    108.   
    109. }  
    至于MainActivity随便了。
    效果如下:
     
     
     所以总结一下,我们可以使用ViewPager做什么:
    1.程序使用导航,外加底部圆点的效果,这个在微信示例里介绍了 
    2.页卡滑动,加上菜单的效果,不管是之前的支持手势也支持底部图标点击的微信,还是今天的微博。
     
  • 相关阅读:
    第五篇
    第四篇
    PAT Basic 1094 谷歌的招聘 (20 分)
    PAT Basic 1093 字符串A+B (20 分)
    Dubbo 04 服务化最佳实现流程
    Dubbo 03 Restful风格的API
    Dubbo 02 微信开发
    Dubble 01 架构模型&start project
    PAT Basic 1020 月饼 (25 分)
    PAT Basic 1019 数字黑洞 (20 分)
  • 原文地址:https://www.cnblogs.com/AceIsSunshineRain/p/5186411.html
Copyright © 2011-2022 走看看