ViewPager也算是Android自带的常用控件之一,但是有可能会无法直接调用,所以只需要将工程目录里/libs/android-support-v4.jar该jarAdd to Build Path就可以了。

先来看看效果图吧:

                                                          

一、首先完成布局文件:

从效果图可以分析出,整体的布局为一个RelativeLayout布局,上面是一个ViewPager,下面是一个LinearLayout,在LinearLayout里面,有一个TextView 和 几个小圆点,所以可以很容易的写出布局文件了。

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity" >
  6.  
  7. <android.support.v4.view.ViewPager
  8. android:id="@+id/viewpager"
  9. android:layout_width="match_parent"
  10. android:layout_height="200dip" />
  11.  
  12. <LinearLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:layout_alignBottom="@id/viewpager"
  16. android:background="#33000000"
  17. android:orientation="vertical" >
  18.  
  19. <TextView
  20. android:id="@+id/image_desc"
  21. android:layout_width="match_parent"
  22. android:layout_height="wrap_content"
  23. android:gravity="center"
  24. android:text="@string/app_name"
  25. android:textColor="@android:color/white"
  26. android:textSize="18sp" />
  27.  
  28. <LinearLayout
  29. android:id="@+id/point_group"
  30. android:layout_width="wrap_content"
  31. android:layout_height="wrap_content"
  32. android:layout_gravity="center_horizontal"
  33. android:orientation="horizontal" />
  34.  
  35. </LinearLayout>
  36.  
  37. </RelativeLayout>

二、在MainActivity中加载布局文件

1.通过ID查找出各个控件。

  1. ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
  2. LinearLayout pointGroup = (LinearLayout) findViewById(R.id.point_group);
  3. TextView imageDesc = (TextView) findViewById(R.id.image_desc);

2.初始化图片资源和指示点。

  1. ArrayList<ImageView> imageList = new ArrayList<ImageView>();
  2. for(int i = 0; i<imageIds.length;i++) {
  3.  
  4. // 初始化图片资源
  5. ImageView image = new ImageView(this);
  6. image.setBackgroundResource(imageIds[i]);
  7. imageList.add(image);
  8.  
  9. // 添加指示点
  10. ImageView point = new ImageView(this);
  11. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(5, 5);
  12. params.rightMargin = 20;
  13. point.setLayoutParams(params);
  14.  
  15. point.setBackgroundResource(R.drawable.point_bg);
  16. if(i==0) {
  17. point.setEnabled(true);
  18. } else {
  19. point.setEnabled(false);
  20. }
  21. pointGroup.addView(point);
  22. }

这个代码,先是创建了一个ArrayList来保存图片资源,然后通过一个循环,将每一张图片加载进入imageList,在加载图片的同时,也将指示点添加进入pointGroup指示点的资源ID--R.drawable.point_bg,是通过自己在/res/drawable中自己创建得来的,在drawable文件夹中,创建了三个XML文件,分别用来绘制不同状态的指示点。

其中point_bg.xml文件代码为:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" >
  3.  
  4. <item android:drawable="@drawable/point_nomal" android:state_enabled="false"></item>
  5. <item android:drawable="@drawable/point_focured" android:state_enabled="true"></item>
  6.  
  7. </selector>

point_nomal.xml文件代码为:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shape="oval">
  4.  
  5. <size android:width="5dip"
  6. android:height="5dip"/>
  7. <solid android:color="#55000000"/>
  8.  
  9. </shape>

point_focured.xml文件代码为:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shape="oval">
  4.  
  5. <size android:width="5dip"
  6. android:height="5dip"/>
  7. <solid android:color="#aaFFFFFF"/>
  8.  
  9. </shape>

3.将资源添加进入viewPager。

  1. viewPager.setAdapter(new MyPagerAdapter());
  2. private class MyPagerAdapter extends PagerAdapter {
  3.  
  4. /**
  5. * 获得页面的总数
  6. */
  7. @Override
  8. public int getCount() {
  9. return Integer.MAX_VALUE; // 因为需要无限循环,所以这里就不写imageList.size()
  10. }
  11.  
  12. /**
  13. * 获得相应位置上的view
  14. * container view的容器,其实就是viewpager自身
  15. * position 相应的位置
  16. */
  17. @Override
  18. public Object instantiateItem(ViewGroup container, int position) {
  19. // 给container添加内容
  20. container.addView(imageList.get(position%imageList.size()));
  21.  
  22. return imageList.get(position%imageList.size());
  23. }
  24.  
  25. /**
  26. * 判断view和object的对应关系
  27. */
  28. @Override
  29. public boolean isViewFromObject(View view, Object object) {
  30. return view == object;
  31. }
  32.  
  33. /**
  34. * 销毁对应位置上的object
  35. */
  36. @Override
  37. public void destroyItem(ViewGroup container, int position, Object object) {
  38. container.removeView((View) object);
  39. object = null;
  40. }
  41. }

现在就完成了基本的设置了,可以运行程序看一下效果了,现在已经可以循环的左右切换了。

三、增加自动切换

想要实现自动切换的方法比较多,大概分为:使用定时器;开启子线程;使用ColckManager;用handler发送延时信息。在此我们采用比较简单的方式--用handler发送延时信息。

  1. // 判断是否执行动画
  2. private boolean isRunning = false;
  3. private Handler handler = new Handler(){
  4. public void handleMessage(android.os.Message msg) {
  5. // 滑动到下一页
  6. viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
  7.  
  8. if(isRunning) {
  9. handler.sendEmptyMessageDelayed(0, 2000);
  10. }
  11. };
  12. };
  1.  

以上代码建立在onCreate()外,用于判断是否接收到了handler发送来的信息,如果接收到了,就将viewpager的显示后移一位延时2000毫秒后再发送出去。

然后在onCreate()方法中添加:

  1. isRunning = true;
  2. handler.sendEmptyMessageDelayed(0, 2000);

这样就完成了viewPager中图片的自动切换,但是在运行程序后发现,图片下面的Text和指示点并没有跟着切换,所以还需要添加一下代码:

  1. viewPager.setOnPageChangeListener(new OnPageChangeListener() {
  2.  
  3. /**
  4. * 页面切换后调用
  5. * postion 新的页面位置
  6. */
  7. @Override
  8. public void onPageSelected(int position) {
  9.  
  10. position = position%imageList.size();
  11.  
  12. // 设置文字描述内容
  13. imageDesc.setText(imageDescriptions[position]);
  14. // 改变指示点的状态
  15. pointGroup.getChildAt(position).setEnabled(true);
  16. pointGroup.getChildAt(lastPointPosition).setEnabled(false);
  17. lastPointPosition = position;
  18. }
  19.  
  20. /**
  21. * 当页面正在滚动的时候
  22. */
  23. @Override
  24. public void onPageScrolled(int position, float positionOffset, int arg2) {
  25.  
  26. }
  27.  
  28. /**
  29. * 当页面状态发生变化的时候
  30. */
  31. @Override
  32. public void onPageScrollStateChanged(int arg0) {
  33.  
  34. }
  35. });

setOnPageChangeListener()是一个监听ViewPager页面变化的方法,其实的onPageSelected()是 当页面切换后调用的,在此我们重写了该方法。当切换到新的一页的时候,Text 和 指示点也跟着变换。

四、Demo下载

点我下载Demo          o(︶︿︶)o

ViewPager的基本使用--可左右循环切换也可自动切换的更多相关文章

  1. JavaScript、tabel切换完整版—自动切换—鼠标移入停止-移开运行

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. ViewPager,实现真正的无限循环(定时+手动)

    利用定时器,实现循环轮播,很简单:只需在定时器的消息里加如下代码即可: int count = adapter.getCount(); if (count > 1) { // 多于1个,才循环 ...

  3. Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。

    实现真正的ViewPager[平滑过渡]+[循环滚动]!!!顺带还有[末页跳转]. 首先呢, 我要对网上常见的3种ViewPager的循环滚动方法做个概述.急需看真正实现方法的同志请选择性忽略下面这一 ...

  4. 封装一个ViewPager真正的实现图片无限循环滚动带导航点

    效果图: 大家在写项目的过程中常常会碰到须要实现Viewpager里面载入几张图片来循环自己主动轮播的效果,假设不封装一下的话代码分散在activity里面会显得非常乱.并且也不利于我们下次复用,所以 ...

  5. swiper轮播图(逆向自动切换类似于无限循环)

    swiper插件轮播图,默认的轮播循序是会从右向左,第一张,第二张,第三张,然后肉眼可见是的从第三张从左到右倒回第一张,这样就会有些视觉体验不高, ,不过还是能够用swiper本身的特性更改成无限循环 ...

  6. Android借助Handler,实现ViewPager中页面的自动切换(转)

    在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图:           实现一个自动 ...

  7. 广告banner:手动滑动切换,自动切换,点击跳转,异步加载网络图片

    效果图: 该banner功能有自动切换图片,点击图片可以自定义事件,手动滑动切换,异步加载图片 代码说话: 布局文件: <!-- 广告位 --> <FrameLayout andro ...

  8. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  9. ios基础篇(二十三)—— 定时器NSTimer与图片的自动切换

    一.NSTimer NSTimer是一个能在从现在开始到后面的某一个时刻或者周期性的执行我们指定的方法的对象.可以按照一定的时间间隔,将制定的信息发送给目标对象.并更新某个对象的行为.你可以选择在未来 ...

随机推荐

  1. sqlserver表分区与调优与行列转换

    转自: http://www.cnblogs.com/knowledgesea/p/3696912.html http://www.open-open.com/lib/view/open1418462 ...

  2. get_template_part() 函数详解备忘(转)

    最近研究官方主题 Twenty Eleven ,有一些东西网上现成的中文资料不好找,在博客里记载下来,算是分享,也算是备忘,wordpress 3.0 以后就开始便有了get_template_par ...

  3. WinForm开发浏览器,WebBrowser获取页面内容,如何解决中文乱码

    WebBrowser的编码可以从文档对象中获得,将代码改为如下即可. System.IO.StreamReader getReader = new System.IO.StreamReader(thi ...

  4. PostgreSQL的 initdb 源代码分析之十四

    继续分析: /* * Make the per-database PG_VERSION for template1 only after init'ing it */ write_version_fi ...

  5. Diskpart挂载/卸载VHD

    #Diskpart挂载VHD $DriveLetter = "X"$VHD_File = "e:\vhd\test\win2008r2.vhdx"$Curren ...

  6. 【M8】了解各种不同意义的new和delete

    1.首先考虑new operator,new operator 可以认为做了三件事情:a.调用operator new分配一块内存:b.在这块内存上调用构造方法构造对象:返回指针. 2.operato ...

  7. SPOJ 1557. Can you answer these queries II 线段树

    Can you answer these queries II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://www.spoj.com/pr ...

  8. Codeforces Round #330 (Div. 1) A. Warrior and Archer 贪心 数学

    A. Warrior and Archer Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/594 ...

  9. Java多线程模式(二)

    Guarded Suspension Pattern      该模式描述的是当一个线程在执行某个操作时,但由于其他资源还没有准备好,需要等待,那么就等待资源准备好才开始自己的操作.我们直接看代码例子 ...

  10. 安卓模拟器BlueStacks 安装使用教程(图解)

    系统要求 操作系统 Win XP SP3/Vista/Win 7/Win 8/Win 8.1 所需的运行环境 Win XP用户请先升级到SP3 并安装Windows Installer 4.5 Win ...