前言
新闻 App 首页最上方一般会循环播放热点图片,如下图所示。
本文主要介绍了利用 ViewPager 实现轮播图片,图片下方加上小圆点指示器标记当前位置,并利用 Timer+Handler 实现了自动轮播播放。
本文链接 http://www.alijava.com/viewpager-photos/ 转载请注明出处
ViewPager展示图片
xml 布局
|
|
FrameLayout里面包含了ViewPager和LinearLayout,ViewPager 显示图片,LinearLayout是小圆点指示器区域,标记现在滑到哪张图片。
查看 xml 预览图,由于没有图片内容,当前只显示出红色矩形区域。
新建javabean
首页的图片地址是新闻的一个属性,我们新建一个ItemArticle类。
|
|
适配器 PagerAdapter
继承自 android.support.v4.view.PagerAdapter
,复写4个方法
- instantiateItem(ViewGroup, int)
- destroyItem(ViewGroup, int, Object)
- getCount()
- isViewFromObject(View, Object)
|
|
深入解析 isViewFromObject 方法
isViewFromObject(View view, Object object)的通用写法是return view == (View) object;
其中(View) object可根据具体情形替换成LinearLayout等等。
查看 ViewPager 源代码(戳这里)
isViewFromObject
是在infoForChild里被调用的,而且在该方法内会被调用mItems.size()次,mItems.size()是 ViewPager 里面图片的个数。
|
|
ViewPager里面用了一个mItems 存储每个page的信息(ItemInfo),当界面要展示或者发生变化时,需要依据page的当前信息来调整,但此时只能通过view来查找,遍历mItems通过比较view和object来找到对应的ItemInfo。
|
|
所以我们如果打印出 Log 的话,会看到isViewFromObject()被调用多次,只有1次返回 true (表示找到了对应的ItemInfo),其他返回 false。
|
|
底部小圆点指示器
图片增加小圆点
轮播图片的底部都会加上小圆点,指示当前访问图片的位置。
|
|
上面这段代码是小圆点的初始步骤,最开始是第0张图片被选中,所以是第0张小圆点是蓝色,其他小圆点是灰色。
addOnPageChangeListener小圆点动态变化
切换图片的时候,小圆点也要随着改变,这需要利用ViewPager.OnPageChangeListener,主要是下面这个方法:
public abstract void onPageSelected (int position)
This method will be invoked when a new page becomes selected. Animation is not necessarily complete.
Parameters
position Position index of the new selected page.
|
|
onPageSelected()中,利用 for 循环,将当前选中位置对应的小圆点置为蓝色,其他小圆点置为灰色。
自动播放
先定义一个 Handler,在主线程里面更新 UI
|
|
利用 Timer 实现每隔 5s 向 Handler 发送message来更新图片
|
|
为了使得滑到最后一页后能滑到首页,我们对于autoCurrIndex == headerArticles.size() - 1
进行了处理。
一些知识点
完整代码
基于上面的分析,我们实现了自动轮播图片
|
|
schedule和scheduleAtFixedRate方法
(1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后。保持间隔时间的稳定
(2)scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性 。保持执行频率的稳定。
参考文章
LoremPixel 图片资源网站,随机生成图片 http://lorempixel.com/
Android Image Slideshow using ViewPager with PagerAdapter http://codetheory.in/android-image-slideshow-using-viewpager-pageradapter/
安卓PagerAdapter中的isViewFromObject()方法有什么用? http://segmentfault.com/q/1010000000484617
Timer的schedule和scheduleAtFixedRate方法的区别解析 http://blog.csdn.net/gtuu0123/article/details/6040159
Android 仿首页广告轮播效果 http://blog.csdn.net/xiyou_android/article/details/45566129
Android Material Design之Toolbar与Palette实践 http://blog.csdn.net/bbld_/article/details/41439715