主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用。顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题。
项目已开源Android Auto Scroll ViewPager@Github,欢迎star和fork。
更多自动滚动轮播的开源项目可见:自动滚动 ViewPager。
Demo APK 可以方便的查看效果,在各大应用商店搜索 trinea android 下载即可,如:Google Play。
示例代码地址见AutoScrollViewPagerDemo,效果图如下:
1、实现
没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去完成一次滚动,在完成一次滚动后发送另外一个delay的滚动消息,如此循环实现。自动滚动部分核心代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public void startAutoScroll() { isAutoScroll = true; sendScrollMessage(interval); } private void sendScrollMessage(long delayTimeInMills) { /** remove messages before, keeps one message is running at most **/ handler.removeMessages(SCROLL_WHAT); handler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills); } private class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SCROLL_WHAT: scrollOnce(); sendScrollMessage(interval); break; } } } |
至于ViewPager嵌套引起子ViewPager无法触摸问题是通过在子ViewPager的onTouchEvent中添加
1 |
getParent().requestDisallowInterceptTouchEvent(true); |
禁止父控件对touch event做intercept解决的。
ViewPager滑动速度的设置是通过反射的方式重新设置ViewPager的Scroller,改变Scroller的startScroll的间隔时间完成的。调用setScrollDurationFactor(double)即可。
2、使用
(1) 引入公共库
引入Android Auto Scroll ViewPager@Github作为你项目的library(如何拉取代码及添加公共库)。
(2) 调用
仅需简单两步:
a. 布局定义
1 2 3 4 |
<cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="wrap_content" /> |
代替一般的ViewPager定义
b. 启动ViewPager自动滚动
startAutoScroll() 启动自动滚动
stopAutoScroll() 停止自动滚动
3、设置
setInterval(long) 设置自动滚动的间隔时间,单位为毫秒
setDirection(int) 设置自动滚动的方向,默认向右
setCycle(boolean) 是否自动循环轮播,默认为true
setScrollDurationFactor(double) 设置ViewPager滑动动画间隔时间的倍率,达到减慢动画或改变动画速度的效果
setStopScrollWhenTouch(boolean) 当手指碰到ViewPager时是否停止自动滚动,默认为true
setSlideBorderMode(int) 滑动到第一个或最后一个Item的处理方式,支持没有任何操作、轮播以及传递到父View三种模式
setBorderAnimation(boolean) 设置循环滚动时滑动到从边缘滚动到下一个是否需要动画,默认为true
4、其他
(1) 指示器,圆形或是方形指示器请配合ViewPagerIndicator使用
(2)无限循环,如果希望在最后一张继续播放第一张而不是退回到第一张,请参考AutoScrollViewPagerSingleDemo.java,注意这个特性不能和 ViewPagerIndicator 使用
(3)更多自动滚动轮播的开源项目可见:自动滚动 ViewPager
楼主,我用了你的控件之后。偶尔会出现白屏的现象。但是定时翻页还存在,getview里也在跑,拿到数据了。不知道为什么就是偶尔出现白屏,左右拖动很多张后会有图,但时有时无。不知道楼主和其他朋友有没有这一现象
可以试试这个: https://github.com/benniaobuguai/android-auto-scroll-viewpager
我也遇到这个问题,请问是怎么解决的?
同遇到啊
白屏的能处理么
楼主,我发现不能和viewpagerindiator中的cricleindiator搭配啊。我这里只要 设置indiactor.setViewPager(viewPager);app就假死,然后闪退
嗯,本文最后提到了。可以试试改进版 https://github.com/lightSky/InfiniteIndicator
好的,谢谢哈
改进版中 图片只能add 无法remove,希望能早点解决
Pingback: Android开源项目分类汇总 | 一世浮华一场空
你好!感谢楼主的分享,最近使用楼主的这个共享类库,发现一个问题,就是点击ViewPager的第一个item,ActionDown事件无法停止,应该停止但是却继续滑动,除了第一个item按下事件未停止,其他都可以停止,尝试做了些修改,但是都没有解决,请问楼主如何解决?
暂时没时间维护,可以试试改造版 https://github.com/lightSky/InfiniteIndicator
Pingback: 爱编程 | Android开源项目分类汇总
新手,不会用,导入进库了,但运行时报XML错误,XML中也加了你刚说的那个标签java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hdp/com.example.hdp.MainActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager
Pingback: Android开源项目分类汇总【畜生级别】 | forlong401的分享
Pingback: android开源框架集锦 最丰富的开源 - 合智社区
循环播放的时候,异步加载网络图片,设置viewPager.setCurrentItem(Integer.MAX_VALUE / 2 – Integer.MAX_VALUE /2% IMAGE_COUNT);这句程序会假死,请问这个如何解决啊?
不能和 ViewPagerIndicator 使用
没有使用ViewPagerIndicator ,只是用universal-image-loader加载图片,应该是加载Integer.MAX_VALUE这么多图片,造成假死
Pingback: 大姑爷的博客 | Android开源组件之:github上那些火热的开源项目-第一部分 个性化控件(View)