Android自动滚动 轮播循环的ViewPager
2016-10-13 10:15
501 查看
原文地址:http://www.trinea.cn/android/auto-scroll-view-pager/
github:https://github.com/Trinea/android-auto-scroll-view-pager
1、实现
没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去完成一次滚动,在完成一次滚动后发送另外一个delay的滚动消息,如此循环实现。自动滚动部分核心代码如下:
Java
至于ViewPager嵌套引起子ViewPager无法触摸问题是通过在子ViewPager的onTouchEvent中添加Java
禁止父控件对touch event做intercept解决的。
ViewPager滑动速度的设置是通过反射的方式重新设置ViewPager的Scroller,改变Scroller的startScroll的间隔时间完成的。调用setScrollDurationFactor(double)即可。
2、使用
(1) 引入公共库
引入Android Auto Scroll ViewPager@Github作为你项目的library(如何拉取代码及添加公共库)。
(2) 调用
仅需简单两步:
a. 布局定义
Java
代替一般的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
----------------------------以下是个人观点,与上面原文无关-----------------------------------------------------------
当viewpager处于activity中的某一个fragment中,需注意:
1,在onResume方法中调用startAutoScroll(),如果是图片url,要判断是否为空,如果为空,要再次请求数据。
2,在onPause方法中调用stopAutoScroll()。
目的:按照一般的需求,会在onResume方法里检查数据是否需要更新,如果更新了,则要重新载入数据,重启viewpager。
但是如果调用两次startAutoScroll(),则会出现滑动不正常的情况(比如连续滑动了2次),所以要在onPause的时候停止viewpager滑动,这样也可以节省内存,减少不必要的损耗。
还有一点小弟也不明白:把多个Imageview放进List<ImageView>里面,然后在instantiateItem方法里面get出来,结果不断切换fragment时,会报错,说imageview已经有parent,要先removeView,而我直接在instantiateItem方法里面new Imageview(),即时声明设置,就不会报错,这是什么原因呢?
github:https://github.com/Trinea/android-auto-scroll-view-pager
1、实现
没有通过ScheduledExecutorService或Timer定期执行某个任务实现,而是简单的通过handler发送消息去完成一次滚动,在完成一次滚动后发送另外一个delay的滚动消息,如此循环实现。自动滚动部分核心代码如下:
Java
12345678910111213141516171819202122232425 | 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; } } } |
1 | getParent().requestDisallowInterceptTouchEvent(true); |
ViewPager滑动速度的设置是通过反射的方式重新设置ViewPager的Scroller,改变Scroller的startScroll的间隔时间完成的。调用setScrollDurationFactor(double)即可。
2、使用
(1) 引入公共库
引入Android Auto Scroll ViewPager@Github作为你项目的library(如何拉取代码及添加公共库)。
(2) 调用
仅需简单两步:
a. 布局定义
Java
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" /> |
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
----------------------------以下是个人观点,与上面原文无关-----------------------------------------------------------
当viewpager处于activity中的某一个fragment中,需注意:
1,在onResume方法中调用startAutoScroll(),如果是图片url,要判断是否为空,如果为空,要再次请求数据。
2,在onPause方法中调用stopAutoScroll()。
目的:按照一般的需求,会在onResume方法里检查数据是否需要更新,如果更新了,则要重新载入数据,重启viewpager。
但是如果调用两次startAutoScroll(),则会出现滑动不正常的情况(比如连续滑动了2次),所以要在onPause的时候停止viewpager滑动,这样也可以节省内存,减少不必要的损耗。
还有一点小弟也不明白:把多个Imageview放进List<ImageView>里面,然后在instantiateItem方法里面get出来,结果不断切换fragment时,会报错,说imageview已经有parent,要先removeView,而我直接在instantiateItem方法里面new Imageview(),即时声明设置,就不会报错,这是什么原因呢?
相关文章推荐
- Android 使用ViewPager自动滚动循环轮播效果
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android自动滚动 轮播循环的ViewPager
- Android ViewPager的无限循环与自动滚动实现
- Android中级:轮播图(一):实现ViewPager的无线自动循环
- viewpager循环滚动和自动轮播的问题
- Android RecyclerView 水平滚动+自动循环轮播
- android viewpager实现无限循环自动滚动
- viewpager循环滚动和自动轮播的问题
- Android开发--ViewPager自动循环滚动,手动换页
- Android实现基于ViewPager的无限循环自动播放带指示器的轮播图CarouselFigureView控件
- Android之ViewPager自动循环播放(轮播)效果实现(超简单)
- viewpager循环滚动和自动轮播的问题
- Android ViewPager无限循环滑动并可自动滚动完整实例
- Android使用ViewPager实现图片轮播(高度自适应,左右循环,自动轮播)
- Android ViewPager巧用偷梁换柱实现自动循环滚动
- 使用ViewPager实现自动无限循环的轮播