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


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

1.在住布局文件里加入


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.加载要显示的页卡,

1. LayoutInflater lf = getLayoutInflater().from(this);  
2. null);  
3. null);  
4. null);  
5.   
6. new ArrayList<View>();// 将要分页显示的View装入数组中  
7.         viewList.add(view1);  
8.         viewList.add(view2);  
9.         viewList.add(view3);

 

 

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

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(.button1);  
38. new OnClickListener() {  
39.                       
40. public void onClick(View v) {  
41. new Intent(ViewPagerDemo.this,WeiBoActivity.class);  
42.                         startActivity(intent);  
43.                     }  
44.                 });  
45. return viewList.get(position);  
46.             }  
47.   
48.         };  
49.         viewPager.setAdapter(pagerAdapter);

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

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. //删除页卡  
11.         }  
12.   
13.   
14. @Override  
15. public Object instantiateItem(ViewGroup container, int position) {  //这个方法用来实例化页卡         
16. 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,你必须至少覆盖以下方法:

  • instantiateItem(ViewGroup, int)
  • destroyItem(ViewGroup, int, Object)
  • getCount()
  • isViewFromObject(View, Object)

  从上面的例子中可以看到,我们最少也是实现了上面四个方法,当然如果你想让程序更健壮或是功能更全面,你可以重写其他的方法。下面看一下第一个完整的示例代码:

  主页面Activity:


1. package com.example.viewpagerdemo;  
2.   
3. import java.util.ArrayList;  
4. import java.util.List;  
5. import android.os.Bundle;  
6. import .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(.viewpager);
42.         //pagerTitleStrip = (PagerTitleStrip) findViewById(.pagertitle);
43.         pagerTabStrip=(PagerTabStrip) findViewById(.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(.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. this);  
64. null);  
65. null);  
66. null);  
67.   
68. new ArrayList<View>();// 将要分页显示的View装入数组中  
69.         viewList.add(view1);  
70.         viewList.add(view2);  
71.         viewList.add(view3);  
72.   
73. new ArrayList<String>();// 每个页面的Title数据  
74. "wp");  
75. "jy");  
76. "jh");  
77.   
78. 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. //这个需要注意,我们是在重写adapter里面实例化button组件的,如果你在onCreate()方法里这样做会报错的。  
116. new OnClickListener() {  
117.                       
118. public void onClick(View v) {  
119. 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. }

  它的布局文件:

1. <?xml version="1.0" encoding="utf-8"?>  
2. <LinearLayout xmlns:android="http:///apk/res/android"  
3. "fill_parent"  
4. "fill_parent"  
5. "vertical" >  
6.   
7.     <android.support.v4.view.ViewPager  
8. "@+id/viewpager"  
9. "wrap_content"  
10. "wrap_content"  
11. "center" >  
12.                 
13.         <android.support.v4.view.PagerTabStrip    
14. "@+id/pagertab"    
15. "wrap_content"    
16. "wrap_content"    
17. "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)-->

 可以左右滑动页卡,但是仔细看一下,标题的效果不好,不能一次显示一个,而且标题还滑动。其实在api里面提供了一个pagerTabStrip.setTextSpacing()来设置标题的距离,但是我在这里设置了,没有效果不知道为什么,明白的朋友希望能够赐教一下。

  所以就有人使用下面这样的方法来仿微博的效果,


  这个标题就固定了,而且可以左右滑动,也有下面的横线,来指示页卡。方法和上面的差不多,区别在于这个横线需要我们自己来做,其实就是一个图片。这个例子是网上的一篇文章,看代码:

主Activity:


    1. package com.example.viewpagerdemo;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5. import .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(.vPager);  
    44. new ArrayList<View>();  
    45.         LayoutInflater inflater=getLayoutInflater();  
    46. null);  
    47. null);  
    48. null);  
    49.         views.add(view1);  
    50.         views.add(view2);  
    51.         views.add(view3);  
    52. new MyViewPagerAdapter(views));  
    53. 0);  
    54. new MyOnPageChangeListener());  
    55.     }  
    56. /**
    57.       *  初始化头标
    58.       */  
    59.   
    60. private void InitTextView() {  
    61.         textView1 = (TextView) findViewById(.text1);  
    62.         textView2 = (TextView) findViewById(.text2);  
    63.         textView3 = (TextView) findViewById(.text3);  
    64.   
    65. new MyOnClickListener(0));  
    66. new MyOnClickListener(1));  
    67. new MyOnClickListener(2));  
    68.     }  
    69.   
    70. /**
    71.      2      * 初始化动画,这个就是页卡滑动时,下面的横线也滑动的效果,在这里需要计算一些数据
    72.      3 */  
    73.   
    74. private void InitImageView() {  
    75.         imageView= (ImageView) findViewById(.cursor);  
    76. // 获取图片宽度  
    77. new DisplayMetrics();  
    78.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
    79. int screenW = dm.widthPixels;// 获取分辨率宽度  
    80. 3 - bmpW) / 2;// 计算偏移量  
    81. new Matrix();  
    82. 0);  
    83. // 设置动画初始位置  
    84.     }  
    85. <img src="//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. 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. new TranslateAnimation(one*currIndex, one*arg0, 0, 0);//显然这个比较简洁,只有一行代码。  
    173.             currIndex = arg0;  
    174. true);// True:图片停在动画结束位置  
    175. 300);  
    176.             imageView.startAnimation(animation);  
    177. this, "您选择了"+ viewPager.getCurrentItem()+"页卡", Toast.LENGTH_SHORT).show();  
    178.         }  
    179.           
    180.     }  
    181. }


    1. <?xml version="1.0" encoding="utf-8"?>  
    2. lt;LinearLayout xmlns:android="http:///apk/res/android"  
    3. "fill_parent"  
    4. "fill_parent"  
    5. "vertical" >  
    6.   
    7.    <LinearLayout  
    8. "@+id/linearLayout1"  
    9. "fill_parent"  
    10. "40.0dip"  
    11. "#FFFFFF" >  
    12.   
    13.        <TextView  
    14. "@+id/text1"  
    15. "fill_parent"  
    16. "fill_parent"  
    17. "1.0"  
    18. "center"  
    19. " @我"  
    20. "#000000"  
    21. "20.0dip" />  
    22.   
    23.        <TextView  
    24. "@+id/text2"  
    25. "fill_parent"  
    26. "fill_parent"  
    27. "1.0"  
    28. "center"  
    29. "评论"  
    30. "#000000"  
    31. "20.0dip" />  
    32.   
    33.        <TextView  
    34. "@+id/text3"  
    35. "fill_parent"  
    36. "fill_parent"  
    37. "1.0"  
    38. "center"  
    39. "私信"  
    40. "#000000"  
    41. "20.0dip" />  
    42.    </LinearLayout>  
    43.   
    44.    <ImageView  
    45. "@+id/cursor"  
    46. "fill_parent"  
    47. "wrap_content"  
    48. "matrix"  
    49. "@drawable/a" />  
    50.   
    51.    <android.support.v4.view.ViewPager  
    52. "@+id/vPager"  
    53. "wrap_content"  
    54. "0dp"  
    55. "center"  
    56. "1.0"  
    57. "#000000"  
    58. "30"  
    59. "animation" />  
    60. lt;/LinearLayout>


     下面使用ViewPager来实现一个程序引导的demo:

     一般来说,引导界面是出现第一次运行时出现的,之后不会再出现。所以需要记录是否是第一次使用程序,办法有很多,最容易想到的就是使用SharedPreferences来保存。步骤如下:

      1、程序进入欢迎界面,SplashActivity,在这里读取SharedPreferences里面的变量,先设置为true。进入引导界面,然后设置为false。

      2、之后每次进入欢迎界面读取SharedPreferences里面的变量,因为是false,所以不会运行引导界面了。

    代码如下:

    SplashActivity.java,欢迎界面。


      1. import .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", 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. new Intent(SplashActivity.this, MainActivity.class);  
      69. this.startActivity(intent);  
      70. this.finish();  
      71.     }  
      72.   
      73. private void goGuide() {  
      74. new Intent(SplashActivity.this, GuideActivity.class);  
      75. this.startActivity(intent);  
      76. this.finish();  
      77.     }  
      78. }
      1. import java.util.ArrayList;  
      2. import java.util.List;  
      3. import .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. this);  
      44.   
      45. new ArrayList<View>();  
      46. // 初始化引导图片列表  
      47. null));  
      48. null));  
      49. null));  
      50. null));  
      51.   
      52. // 初始化Adapter  
      53. new ViewPagerAdapter(views, this);  
      54.           
      55.         vp = (ViewPager) findViewById(.viewpager);  
      56.         vp.setAdapter(vpAdapter);  
      57. // 绑定回调  
      58. this);  
      59.     }  
      60.   
      61. private void initDots() {  
      62.         LinearLayout ll = (LinearLayout) findViewById(.ll);  
      63.   
      64. new ImageView[views.size()];  
      65.   
      66. // 循环取得小点图片  
      67. for (int i = 0; i < views.size(); i++) {  
      68.             dots[i] = (ImageView) ll.getChildAt(i);  
      69. true);// 都设为灰色  
      70.         }  
      71.   
      72. 0;  
      73. 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. false);  
      83. 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. }


      1. import java.util.List;  
      2. import .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. 0);  
      52. if (arg1 == views.size() - 1) {  
      53.             ImageView mStartWeiboImageButton = (ImageView) arg0  
      54.                     .findViewById(.iv_start_weibo);  
      55. 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. 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. "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. }

      效果如下:

      android 启动桌面图标 安卓启动设置界面图片_java

      android 启动桌面图标 安卓启动设置界面图片_java_02



      android 启动桌面图标 安卓启动设置界面图片_java_03

      android 启动桌面图标 安卓启动设置界面图片_android 启动桌面图标_04


       


       所以总结一下,我们可以使用ViewPager做什么:

      1.程序使用导航,外加底部圆点的效果,这个在微信示例里介绍了 

      2.页卡滑动,加上菜单的效果,不管是之前的支持手势也支持底部图标点击的微信,还是今天的微博。


        

      代码下载连接