主要介绍如何实现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
请问下一博主,我使用了您的这个Android Auto Scroll ViewPager 并且把他作为了ListView的一个item 在 Auto Scroll ViewPager属性里面设置了禁止获得焦点和点击,但是listview依旧无法获得获得点击事件 这是为什么? 如果要用您的这个指定控件 那么onclicklistner应该设置在哪里?
怎么就一个java文件,没有能跑得起的demo吗?
先学习学习 GithHub 怎么用
楼主,我运行之后怎么不跟效果图一样呢,我想家效果图里面的圆圈怎么添加呢?
指示器用的是 ViewPagerIndicator,不过 ViewPagerIndicator 不能和无线循环同时使用,都需要的话得自己写
应该加上顺序播完,然后倒序播放!这样体验会更好。 例如 1234 — 4321 这样自由设置。博主有时间的话可以改改,我改了半天没成功
这个库本来还有后续一些增强功能,没时间去完善目前
博主,子view添加OnClick点击事件后,就无法触发viewpager的OnTouchEvent了
请问如何给pager中的图片添加点击事件?
重写adpter的方法 instantiateItem,里面控制
Pingback: Android开源项目分类汇总iSmart Studio | iSmart Studio
Pingback: Android开源项目分类汇总 | IT Share网
Pingback: android开源项目金库分类汇总_学习必备 | 安卓开发 | android学习 – android开源码 – 移动互联网
Thanks for your great code.I used AutoScrollViewPager, but smooth scroll doesn’t work and mViewPagerRecommend.setStopScrollWhenTouch(true) doesn’t work too.I used this as header view of girdView.Would you like to help me?
Please see https://github.com/Trinea/android-demo/blob/master/src/cn/trinea/android/demo/AutoScrollViewPagerDemo.java by yourself