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下建立选择器

  1. point_selector.xml 
  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. <android.support.v4.view.ViewPager
  16. android:id="@+id/viewPager"
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent">
  19. <!--系统默认PagerTabStrip和PagerTabStrip指示器的唯一区别是
  20. PagerTabStrip可以点,PagerTabStrip不能点-->
  21. <android.support.v4.view.PagerTabStrip
  22. android:id="@+id/pts"
  23. android:layout_width="match_parent"
  24. android:layout_height="wrap_content">
  25.  
  26. </android.support.v4.view.PagerTabStrip>
  27.  
  28. </android.support.v4.view.ViewPager>
  29. </LinearLayout>
  30. <LinearLayout
  31. android:id="@+id/ll_points"
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:orientation="horizontal"
  35. android:layout_alignParentBottom="true"
  36. android:layout_marginBottom="50dp"
  37. android:layout_centerHorizontal="true">
  38.  
  39. </LinearLayout>
  40. </RelativeLayout>

activity_main.xml

  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. }

MainActivity.java

下面是使用

  1.   android.support.design.widget.TabLayout的效果,需要导入jar studio可以远程依赖

  在布局中添加TabLayout
  在viewPager设置适配器后,调用setupWithViewPager(vp);但是默认不能设置无限页滚动

Android ViewPager PagerAdapter 图片轮播的更多相关文章

  1. Android Viewpager实现图片轮播(仿优酷效果)

    1 http://blog.csdn.net/t12x3456/article/details/8160128 2 http://www.cnblogs.com/androidez/archive/2 ...

  2. 通过ViewPager 实现图片轮播

    通过ViewPager 实现图片轮播 首先来个效果图 布局文件: LinearLayout 用来存放下方的几个小白点. <?xml version="1.0" encodin ...

  3. 用viewpager实现图片轮播

    应用中常常遇到图片轮播的需求,这时候就需要用到viewpager这个组件.viewpager是android support v4 中提供的一个组件.viewpager使用需要以下几步骤: 1.在布局 ...

  4. Android ViewPager实现图片标题轮播和点击事件

    我看别人的文章,最喜欢看有图的.然后先找图看. 那我就先上效果图: 实现了图片自动轮播,手动滑动,轮播标题,以及点击事件.下面开始: 一.资源文件: 首先是布局: <?xml version=& ...

  5. android ViewPager实现的轮播图广告自定义视图,网络获取图片和数据

    public class SlideShowAdView extends FrameLayout { //轮播图图片数量    private static int IMAGE_COUNT = 3;  ...

  6. Viewpager实现图片轮播

    //-------------主布局文件------------------------------------- <LinearLayout xmlns:android="http: ...

  7. Android 使用ViewPager 做的半吊子的图片轮播

    Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...

  8. Android 图片轮播(最简单的)

    布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android ...

  9. Android学习笔记之图片轮播...

    PS:一个bug又折腾了一个下午....哎... 学习内容: 1.Android利用ViewPager和PagerAdapter实现图片轮播... 2.使用反射机制获取Android的资源信息... ...

随机推荐

  1. iOS打包ipa 让别人设备安装你的App

    首先推荐一本书<一步一步学习iOS 5编程(第二版) – PDF 中文版>在一本学习IOS入门很不错的书籍,目前,这是第一本介绍iOS 5.x 和 Xcode 4.3 的中文版书籍,尤其适 ...

  2. Jquery 简单的Tab选项卡特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. python模块之socket

    43.python模块之socket:       Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式 UDP通讯: Server: import socket port=8081 ...

  4. WinPcap编程(一)

    0. 按着文档顺序写的. 开发环境:win10+VS2013. 配置WinPcap环境就不多说.直接给网址:http://blog.sina.com.cn/s/blog_57432f380101qh3 ...

  5. cut 命令使用

    cut -d -f cut -c cut -d分隔符 -f分割后取的第几个字符串 cut -c从哪个字符开始取

  6. matlab取整

    matlab取整 Matlab取整函数有: fix, floor, ceil, round.取整函数在编程时有很大用处.一.取整函数1.向零取整(截尾取整)fix-向零取整(Round towards ...

  7. Important Programming Concepts (Even on Embedded Systems) Part V: State Machines

    Earlier articles in this series: Part I: Idempotence Part II: Immutability Part III: Volatility Part ...

  8. maven jetty plugin

    转载:http://blog.163.com/xueling1231989@126/blog/static/1026408072013101311395492/ 前言: 在 maven 下测试调试时, ...

  9. Delphi重载,覆盖,多态

    一.override 重载 type TFigure = class procedure Draw; virtual;//(我的理解是)父类中可以使用父类的,子类中使用子类的.与“四”是有区别的. e ...

  10. Pearls DP

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6647   Accepted: 3241 Description In Pe ...