02/28
2014

Android自动滚动 轮播循环的ViewPager

主要介绍如何实现ViewPager自动播放,循环滚动的效果及使用。顺便解决ViewPager嵌套(ViewPager inside ViewPager)影响触摸滑动及ViewPager滑动速度设置问题

 

项目已开源Android Auto Scroll ViewPager@Github,欢迎star和fork。

更多自动滚动轮播的开源项目可见:自动滚动 ViewPager

 

Demo APK 可以方便的查看效果,在各大应用商店搜索 trinea android 下载即可,如:Google Play

示例代码地址见AutoScrollViewPagerDemo,效果图如下:

android auto scroll viewpager

1、实现

没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去完成一次滚动,在完成一次滚动后发送另外一个delay的滚动消息,如此循环实现。自动滚动部分核心代码如下:

 

至于ViewPager嵌套引起子ViewPager无法触摸问题是通过在子ViewPager的onTouchEvent中添加

禁止父控件对touch event做intercept解决的。

 

ViewPager滑动速度的设置是通过反射的方式重新设置ViewPager的Scroller,改变Scroller的startScroll的间隔时间完成的。调用setScrollDurationFactor(double)即可。

 

2、使用

(1) 引入公共库
引入Android Auto Scroll ViewPager@Github作为你项目的library(如何拉取代码及添加公共库)。

 

(2) 调用
仅需简单两步:

a. 布局定义

代替一般的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

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

163 thoughts on “Android自动滚动 轮播循环的ViewPager

      • demo经测试木有问题~ 自己写的时候就有问题了,上代码: AutoScrollViewPager viewPager = (AutoScrollViewPager) view.findViewById(R.id.vp_banner);viewPager.setAdapter(new BannerPagerAdapter(viewPager, banners));viewPager.setCycle(true);viewPager.setDirection(AutoScrollViewPager.RIGHT);viewPager.setInterval(4000);viewPager.setSlideBorderMode(AutoScrollViewPager.SLIDE_BORDER_MODE_CYCLE);viewPager.setStopScrollWhenTouch(true);viewPager.setCurrentItem(0, true); viewPager.startAutoScroll();请楼主过目,看是啥问题?多谢啦~

  1. 这个setStopScrollWhenTouch(boolean) 当手指碰到ViewPager时是否停止自动滚动,默认为true,不起作用,我手指放上去还是自动滚动,还有为什么向右滚动到最后一个了在返回到第一个却是向左滚动的,很别扭

  2. 楼主好,一直对楼主的博文都非常膜拜,今天在项目中用了轮播的viewpager,总是时不时的报错,具体错误信息如下:java.lang.NullPointerException at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:801) at android.support.v4.app.FragmentStatePagerAdapter.setPrimaryItem(FragmentStatePagerAdapter.java:152) at android.support.v4.view.ViewPager.populate(ViewPager.java:1009) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:522) at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:494) at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:486) at cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager.scrollOnce(AutoScrollViewPager.java:157) at cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager$MyHandler.handleMessage(AutoScrollViewPager.java:220) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:4945) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method)

  3. 请问博主使用Android Auto Scroll ViewPager和其他方法(Timer,ScheduledExecutorService,Thread等),较其性能或者其他方面有何优势呢?能否谈谈。还有如果要实现自动滑动,且滑动中实现滑动动画,可以实现么?如何实现或者思路呢?