主要介绍如何实现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
楼主你好,请问 :1、手工滑动,从左到右滑动到最后一个页面后,能不能继续像右滑动,跳转到第一个页面?2、自动滑动,从左到右滑动到最后一个页面后,跳转到第一个的动画,能不能使继续像右滑动的动画?
都可以,在google play或小米上下载最新的demo apk就知道了。示例图太老,没改
我找到了你的demo了,在AutoScrollViewPagerDemo楼主引用了很多 像是cn.trinea.android.common.util.ListUtils;和cn.trinea.android.demo.adapter.ImagePagerAdapte要是用这个的话 我们也必须导入这个的library么
只要倒入https://github.com/Trinea/android-auto-scroll-view-pager 即可
楼主 我是新手。。。能不能讲讲具体如何调用 我只把lib 导入进去了 需要弄个adapter 和正常的viewpager用法一样么?
但是我只会用viewpageradapter 之后里面的方法@Override public Fragment getItem(int position) { return null; }定义几个framgment来回切换,请问一下您这个怎么用,这个函数要怎么写,有几个图片就要建立几个fragment 么?
Pingback: Android开源项目汇总列表(一) | 互联网的点点滴滴
楼主,貌似用CirclePageIndicator无限循环就会假死,只能自己用图片代替了。
嗯,是的, CirclePageIndicator的实现要改
求助 怎么改。。。
自己跟进源码不就知道了,入口都知道,就那几个文件
不是的 我加上了circlepagerindicator.setviewadapter之后 程序就会假死,屏幕空白 什么也显示不出来 也没有error
说的就是viewpager-indicator的源码
真的不会搞,,我后来发现是在onCreateView return view当中 进去之后looper中的dispatchmessage假死在这里面,根本找不出什么问题。求帮助
求助,。。、
楼主,你这个无限循环怎么用啊,加上ViewPager的缓存有demo么?
下载最新demo https://github.com/Trinea/android-demo
楼主, 你这个也十分耗内存 , 我使用Thread 发送 msg 替换 图片index ,跟你这个占用的内存差不多.
耗内存的是你的内容好不好
楼主,你好,我clone了android-common和android-auto-scroll-view-pager,新建一个android项目,addlib进去,发现新项目的android dependinces中,有这个两个jar包,但是点击加号,下面没有class,只有META-INF,so,引用不到类。而viewpagerindicator,add lib 后,项目是可以引用的。
将trinea-android-common代码import进Eclipse,右击需要引入library的工程->properties->Android,在library中选择某个trinea-android-common工程
楼主你好,你说的这个方法,正是我使用的方式,但是仍然不能引入类文件。
project clean
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就出现这个错误,如何解决,谢谢。
https://github.com/Trinea/android-demo 里面有介绍,需要三个依赖,都需要添加进来
楼主你好,这三个库,我都已经下载,而且在android-demo的properties-android-library中,add了三个库。加入三个库后,AutoScrollViewPagerDemo中的AutoScrollViewPager报错,AutoScrollViewPager cannot be resolved to a type,然后把android-auto-scroll-view-pager这个项目,通过add projects的方式,加入到了android-demo中,这个时候,android-demo么有错误了,运行后,仍然是上面的错误。。。
重新拉下https://github.com/Trinea/android-auto-scroll-view-pager 代码,并且android-auto-scroll-view-pager不要通过add projects方式引入,通过add lib方式引入
pull了,但是还是不行,不过把android-demo中的AutoScrollViewPagerDemo单独,copy出来,重新建一个project, add lib 依赖包,就OK了。。。
楼主好像是我代码的问题,我自己代码中添加了viewpager的onClick事件,导致viewpager的onTouch事件没有作用。sorry~
嗯,没事,其他问题包括易用性及api的调用便利性都可以给我反馈
我遇到一个问题就是如果刚开始就从左向右滑动,特别容易假死机。
刚开始,你说说刚调到某个页面,立马开始滑动?
设置无限循环的条件下(getCount返回最大值),向自动滑动的逆方向滑动,滑到头就会假死。
嗯,确实是,http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.4_r2.1/android/support/v4/view/ViewPager.java#778 这地方循环次数太多了。调用viewPager.setCurrentItem(Integer.MAX_VALUE – 1);也会假死,看来getCount直接返回最大值并不好。有时间我再看看,你可以google其他无线循环方案,也欢迎告诉我
无限循环下载最新demo https://github.com/Trinea/android-demo
在设置无限循环的时候@Overridepublic int getCount() { return Integer.MAX_VALUE;}