ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的View类。
ViewPager类需要一个PagerAdapter适配器类给它提供数据。
ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用。
ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。分三个步骤来使用它:
1.在住布局文件里加入
2.加载要显示的页卡
3.在Activity里实例化ViewPager组件,并设置它的Adapter(就是PagerAdapter,方法与ListView一样的),在这里一般需要重写PagerAdapter。
当你实现一个PagerAdapter,你必须至少覆盖以下方法:
1. instantiateItem(ViewGroup, int) //返回视图对象
2. destroyItem(ViewGroup, int, Object) //销毁视图对象
3. getCount() //视图个数
4. isViewFromObject(View, Object) //一般传入arg0==arg1.用来判断两个视图是否是等价的
XML配置
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</android.support.v4.view.ViewPager>
在res/drawable下建立选择器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:id="@+id/activity_main" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <LinearLayout 7 android:layout_width="match_parent" 8 android:layout_height="wrap_content" 9 android:orientation="vertical"> 10 <!-- <android.support.design.widget.TabLayout 11 android:id="@+id/tablelayout" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" />--> 14 15 16 <android.support.v4.view.ViewPager 17 android:id="@+id/viewPager" 18 android:layout_width="match_parent" 19 android:layout_height="match_parent"> 20 <!--系统默认PagerTabStrip和PagerTabStrip指示器的唯一区别是 21 PagerTabStrip可以点,PagerTabStrip不能点--> 22 <android.support.v4.view.PagerTabStrip 23 android:id="@+id/pts" 24 android:layout_width="match_parent" 25 android:layout_height="wrap_content"> 26 27 </android.support.v4.view.PagerTabStrip> 28 29 </android.support.v4.view.ViewPager> 30 </LinearLayout> 31 <LinearLayout 32 android:id="@+id/ll_points" 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:orientation="horizontal" 36 android:layout_alignParentBottom="true" 37 android:layout_marginBottom="50dp" 38 android:layout_centerHorizontal="true"> 39 40 </LinearLayout> 41 </RelativeLayout>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class MainActivity extends AppCompatActivity { 2 3 ViewPager viewPager; 4 Timer timer; 5 LinearLayout ll_points; 6 //TabLayout tablayout; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 13 viewPager = (ViewPager) findViewById(R.id.viewPager); 14 initPoints(); 15 16 //tablayout = (TabLayout) findViewById(R.id.tablayout); 17 18 viewPager.setAdapter(new MyPagerAdapter()); 19 20 //指示器也需要在设置适配器之后,还有默认不能设置成无限滚动,所以 21 //tablayout.setupWithViewPager(viewPager); 22 23 //必须在设置适配器之后设置默认中间页 24 //viewPager.setCurrentItem(Integer.MAX_VALUE / 2); 25 26 viewPager.setCurrentItem(Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % 6); 27 //viewPager.setCurrentItem(0); 28 //设置自动轮播 29 startAuto(); 30 31 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 32 @Override 33 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 34 //无限页 35 } 36 37 int currentIndex = 0;//一开始是第0页,已经被选中 38 @Override 39 public void onPageSelected(int position) { 40 //页面选择时 41 Toast.makeText(MainActivity.this,position+"页",Toast.LENGTH_SHORT).show(); 42 ll_points.getChildAt(currentIndex).setSelected(false); 43 ll_points.getChildAt(position % 6).setSelected(true); 44 currentIndex = position % 6; 45 } 46 47 @Override 48 public void onPageScrollStateChanged(int state) { 49 //状态改变 50 if (state == ViewPager.SCROLL_STATE_DRAGGING) { 51 //停止自动滚动 52 } else { 53 //开始滚动 54 } 55 } 56 }); 57 58 } 59 60 private void initPoints() { 61 ll_points = (LinearLayout) findViewById(R.id.ll_points); 62 for (int i = 0; i < 6; i++) { 63 View view = new View(getBaseContext()); 64 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20); 65 params.setMargins(10,10,10,10); 66 view.setBackgroundResource(R.drawable.point_selector); 67 view.setLayoutParams(params); 68 ll_points.addView(view); 69 } 70 71 //默认第0个被选中 72 ll_points.getChildAt(0).setSelected(true); 73 74 } 75 76 public void startAuto(){ 77 //计时器 78 timer = new Timer(); 79 timer.schedule(new TimerTask() { 80 @Override 81 public void run() { 82 //修改UI子线程中修改 83 runOnUiThread(new Runnable() { 84 @Override 85 public void run() { 86 viewPager.setCurrentItem(viewPager.getCurrentItem()+1); 87 } 88 }); 89 90 } 91 }, 3000, 3000); 92 } 93 94 public void stop(){ 95 if(timer != null){ 96 timer.cancel(); 97 } 98 } 99 100 class MyPagerAdapter extends PagerAdapter { 101 //每一个ViewPager就是一个页面 102 List<View> mList = new ArrayList<>(); 103 int[] imgId = new int[]{R.mipmap.img01, R.mipmap.img02, R.mipmap.img03, R.mipmap.img04, R.mipmap.img05, R.mipmap.img06}; 104 105 public MyPagerAdapter(){ 106 for(int i=0; i<6; i++){ 107 ImageView img = new ImageView(getBaseContext()); 108 img.setImageResource(imgId[i]); 109 img.setScaleType(ImageView.ScaleType.FIT_XY); 110 mList.add(img); 111 } 112 } 113 @Override 114 public int getCount() { 115 //return mList.size(); 116 //轮播设置最大值 117 return Integer.MAX_VALUE; 118 } 119 120 @Override 121 public boolean isViewFromObject(View view, Object object) { 122 //判断两页是否相同,google要求这样写 123 return view == object; 124 } 125 126 //加载视图对象,不要弄成View container的函数,这个已经是过期的了 127 @Override 128 public Object instantiateItem(ViewGroup container, int position) { 129 //添加视图到ViewGroup中 130 container.addView(mList.get(position % 6)); 131 return mList.get(position % 6); 132 } 133 134 //销毁一个视图 135 @Override 136 public void destroyItem(ViewGroup container, int position, Object object) { 137 container.removeView(mList.get(position % 6)); 138 } 139 140 String[] titles = {"第一页","第二页","第三页","第四页","第五页","第六页"}; 141 142 //给定系统的指示器的时候,需要重写getPageTitle方法 143 @Override 144 public CharSequence getPageTitle(int position) { 145 return titles[position % 6]; 146 } 147 } 148 149 }
下面是使用
android.support.design.widget.TabLayout的效果,需要导入jar studio可以远程依赖
在布局中添加TabLayout
在viewPager设置适配器后,调用setupWithViewPager(vp);但是默认不能设置无限页滚动