Android轮播的实现与分析

来源:互联网 发布:淘宝刷好评兼职靠谱吗 编辑:程序博客网 时间:2024/06/16 06:21

Android的轮播主要由ViewPager控件实现

轮播的实现的方法

两种

一种是对PagerAdapter的getCount方法设置为最大,使得用户看不到边界,进而达到轮播效果

取自杭州山不高的博客

另一种是利用setCurrentItem方法,如上图,mList代表需要轮播的界面,在mList的前面和后面各加上一个View,使得0号View的视图前面是3号View(0:b),3号View的视图后面是0号View(5:e),形成一个mViews,mViews是实际提供给ViewPager的数据。利用setCurrentItem方法,在到达0:b 和5: e视图后进行跳转,如此便可以实现无限循环

分析

我个人比较推荐第一种

这两种方法,一种是追求体验,一种是追求代码上的完善。

第一种,返回最大值,这种方法不是真正意义上实现轮播,只是用户一般不会滑动到最后一页而已。这种方法比较流畅,最起码比第二种方法流畅

第二种,setCurrentItem跳转,这种方法有个很大的问题,卡顿白屏,因为setCurrentItem方法跳转需要加载视图,如果不是单纯一张图片,那就很容易出现卡顿现象了。

ViewPager会把当前View和当前View的前一个,后一个View加载起来,保证滑动的流畅。因此如果在PagerAdapter里用了什么static修饰的变量(例如,View设置点击,使用static传递当前View的变量),会出错

由于ViewPager的流畅性是通过预加载实现的,那么,如果setCurrentItem方法,就会没有缓存而出现卡顿,因此,不推荐使用第二种方法

关于第一种方法,有的人可能认为把getCount设置为最大会导致高占用,影响性能(我就是在知乎上曾经看到过这说法),其实这是错的。getCount设置为最大不会有任何影响。View的加载是在被看到和即将被看到时进行的。就像上面说的那样,ViewPager只会加载3个View,不会直接把所有View都加载上。

这其实引申出一个问题,View到底是如何展现到屏幕上的呢?视图的展现一般是通过位图图像(bitmap),进行转换加载的,简单来说,加载视图的最小单位就是一个View,不会说因为只显示了View的一部分,因此只加载那一部分。

这篇博客参考了两位前辈的博客:

getCount的:http://blog.csdn.net/dyllove98/article/details/41013883/

setCurrentItem跳转:http://blog.csdn.net/gaojinshan/article/details/18038181

对于getCount的那篇博客建议认真看,很多东西值得深究,但我不推荐使用里面的优化方法,实现只要把值设置为最大就可以了

有空再把这篇博客完善起来

0 0