主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用。顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题。java
项目已开源Android Auto Scroll ViewPager@Github,欢迎star和fork。android
示例APK可从这些地址下载:Google Play, 360手机助手, 百度手机助手, 小米应用商店, 豌豆荚git
示例代码地址见AutoScrollViewPagerDemo,效果图以下:github
一、实现app
没有经过ScheduledExecutorService或Timer按期执行某个任务实现,而是简单的经过handler发送消息去完成一次滚动,在完成一次滚动后发送另一个delay的滚动消息,如此循环实现。自动滚动部分核心代码以下:ide
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中添加布局
getParent().requestDisallowInterceptTouchEvent(true);
禁止父控件对touch event作intercept解决的。动画
ViewPager滑动速度的设置是经过反射的方式从新设置ViewPager的Scroller,改变Scroller的startScroll的间隔时间完成的。调用setScrollDurationFactor(double)便可。google
二、使用spa
(1) 引入公共库
引入Android Auto Scroll ViewPager@Github做为你项目的library(如何拉取代码及添加公共库)。
(2) 调用
仅需简单两步:
a. 布局定义
<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() 中止自动滚动
三、设置
setInterval(long) 设置自动滚动的间隔时间,单位为毫秒
setDirection(int) 设置自动滚动的方向,默认向右
setCycle(boolean) 是否自动循环轮播,默认为true
setScrollDurationFactor(double) 设置ViewPager滑动动画间隔时间的倍率,达到减慢动画或改变更画速度的效果
setStopScrollWhenTouch(boolean) 当手指碰到ViewPager时是否中止自动滚动,默认为true
setSlideBorderMode(int) 滑动到第一个或最后一个Item的处理方式,支持没有任何操做、轮播以及传递到父View三种模式
setBorderAnimation(boolean) 设置循环滚动时滑动到从边缘滚动到下一个是否须要动画,默认为true
四、其余
(1) 指示器,圆形或是方形指示器请配合ViewPagerIndicator使用
(2)无限循环,若是但愿在最后一张继续播放第一张而不是退回到第一张,请参考AutoScrollViewPagerSingleDemo.java,注意这个特性不能和 ViewPagerIndicator 使用