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的滚动消息,如此循环实现。自动滚动部分核心代码如下:

    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)即可。

 

2、使用

(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() 停止自动滚动

 

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> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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

  1. 楼主你好,请问 :1、手工滑动,从左到右滑动到最后一个页面后,能不能继续像右滑动,跳转到第一个页面?2、自动滑动,从左到右滑动到最后一个页面后,跳转到第一个的动画,能不能使继续像右滑动的动画?

  2. 我找到了你的demo了,在AutoScrollViewPagerDemo楼主引用了很多 像是cn.trinea.android.common.util.ListUtils;和cn.trinea.android.demo.adapter.ImagePagerAdapte要是用这个的话 我们也必须导入这个的library么

    • 但是我只会用viewpageradapter 之后里面的方法@Override public Fragment getItem(int position) { return null; }定义几个framgment来回切换,请问一下您这个怎么用,这个函数要怎么写,有几个图片就要建立几个fragment 么?

  3. Pingback: Android开源项目汇总列表(一) | 互联网的点点滴滴

  4. 楼主,你好,我clone了android-common和android-auto-scroll-view-pager,新建一个android项目,addlib进去,发现新项目的android dependinces中,有这个两个jar包,但是点击加号,下面没有class,只有META-INF,so,引用不到类。而viewpagerindicator,add lib 后,项目是可以引用的。

  5. 05-22 09:57:39.409: E/AndroidRuntime(6644): Caused by: java.lang.ClassNotFoundException: Didn’t find class “cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager” on path: /data/app/cn.trinea.android.demo-2.apk楼主你好,git clone 下来你的android-demo,点击AutoScrollViewPager Demo就出现这个错误,如何解决,谢谢。