Android Banner - ViewPager 02
Android Banner - ViewPager 02
现在来给viewpager实现的banenr加上自动轮播
自动轮播的原理,使用handler的延迟消息来实现。
自动轮播实现如下内容
开始轮播&停止轮播
可配置轮播时长、轮播方向
通过自定义属性来配置轮播时长,方向
感知生命周期,可见时开始轮播,不可见时停止轮播
感知手指触摸,触摸按下时停止轮播,抬起重新计时
开始&停止轮播
banner对外提供接口,开始轮播
fun startLoop(){
}
fun stopLoop(){
}
定义handler实现轮播
// 创建handler
fun startLoop() {
if (loopHandler == null) {
loopHandler = Handler(Looper.getMainLooper()) { message ->
return@Handler when (message.what) {
LOOP_NEXT -> {
// 定义消息处理
loopNext()
true
}
else -> false
}
}
}
// 移除正在轮播的消息
loopHandler?.removeMessages(LOOP_NEXT)
// 发送延迟轮播的消息
loopHandler?.sendEmptyMessageDelayed(LOOP_NEXT, mLoopDuration)
}
private fun loopNext() {
val count = adapter?.count ?: 0
// 当pager数量为0或者1时,不用轮播
if (count in 0..1) return
val curr = when (currentItem) {
in 0..count - 2 -> {
currentItem + 1
}
count - 1 -> 0
else -> 0
}
setCurrentItem(curr, true)
loopHandler?.sendEmptyMessageDelayed(LOOP_NEXT, mLoopDuration)
}
可配置轮播时长、轮播方向
定义接口
/**
* 设置轮播时长,有效数据必须大于0,否则使用默认数据5S
* @param duration Long
*/
fun setLoopDuration(duration: Long) {
if (duration < 0) {
// 小于0的数据认为是非法数据,使用默认设置
return
}
this.mLoopDuration = duration
}
/**
* 设置轮播方向,默认[LoopOrientation.LTR]
* @param orientation Int
*/
fun setLoopOrientation(@LoopOrientation orientation: Int) {
this.mLoopOrientation = orientation
}
轮播处理参数
private fun loopNext() {
val count = adapter?.count ?: 0
// 当pager数量为0或者1时,不用轮播
if (count in 0..1) return
val curr = when (mLoopOrientation) {
LoopOrientation.RTL -> {
when (currentItem) {
in 1..count - 1 -> {
currentItem - 1
}
else -> count - 1 // 0
}
}
else -> {
when (currentItem) {
in 0..count - 2 -> {
currentItem + 1
}
else -> 0 // count - 1
}
}
}
setCurrentItem(curr, true)
mLoopHandler?.sendEmptyMessageDelayed(LOOP_NEXT, mLoopDuration)
}
通过自定义属性来配置轮播时长,方向
<resources>
<declare-styleable name="VPBanner">
<attr name="vp_loop_duration" format="integer" />
<attr name="vp_loop_orientation" format="enum" >
<enum name="ltr" value="1" />
<enum name="rtl" value="0" />
</attr>
<attr name="vp_auto_loop" format="boolean" />
</declare-styleable>
</resources>
读取属性
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
// 读取自定义的属性
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.VPBanner)
this.mLoopDuration = typedArray.getInt(
R.styleable.VPBanner_vp_loop_duration,
DEFAULT_LOOP_DURATION
).toLong()
this.mAutoLoop = typedArray.getBoolean(R.styleable.VPBanner_vp_auto_loop, false)
this.mLoopOrientation =
typedArray.getInt(R.styleable.VPBanner_vp_loop_orientation, LoopOrientation.LTR)
Log.d("VPBanner","ld:${this.mLoopDuration},al:$mAutoLoop,lo:$mLoopOrientation")
typedArray?.recycle()
}
感知生命周期,可见时开始轮播,不可见时停止轮播
实现生命周期感知
class VPBanner : ViewPager, DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
Log.d(TAG, "onResume")
if (this.mAutoLoop) {
startLoop()
}
}
override fun onPause(owner: LifecycleOwner) {
Log.d(TAG, "onResume")
stopLoop()
}
}
感知手指触摸,触摸按下时停止轮播,抬起重新计时
重写onTouchEvent方法
override fun onTouchEvent(ev: MotionEvent?): Boolean {
when (ev?.action) {
MotionEvent.ACTION_DOWN -> stopLoop()
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
prepareLoop()
}
}
return super.onTouchEvent(ev)
}
private fun prepareLoop() {
if (this.mAutoLoop && this.mResumed) {
startLoop()
}
}
Android Banner - ViewPager 02的更多相关文章
- Android中viewPager的一两点使用
Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...
- Android Testing学习02 HelloTesting 项目建立与执行
Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- android之ViewPager
在android中ViewPager是非常常用的控件.它在android.support.v4.view.ViewPager下.你们自己可以进http://developer.android.com/ ...
- Android listview viewpager解决冲突 滑动
Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第 ...
- Android 使用ViewPager实现左右循环滑动图片
ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一 ...
- android 解决ViewPager双层嵌套的滑动问题
解决ViewPager双层嵌套的滑动问题 今天我分享一下ViewPager的双层嵌套时影响内部ViewPager的触摸滑动问题 之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就 ...
- android使用ViewPager实现欢迎引导页
android使用ViewPager实现欢迎引导页 大多数APP第一次启动的时候,都会有一个引导界面,左右滑动,到最后一张,用户点击才再次进入主界面.当第二次启动的时候,则直接进入主界面. 这种效果一 ...
- android下ViewPager的使用,带下部选项栏的切换动画
(文章针对类似我这种初学者,大神看到不要嘲笑) 演示 我的规矩是先上GIF动画效果(Linux下用转的GIF,清晰度还可以但是不知道为什么放博客上,界面会这么大): 代码: android中有View ...
- Android Service总结02 service介绍
Android Service总结02 service介绍 版本 版本说明 发布时间 发布人 V1.0 介绍了Service的种类,常用API,生命周期等内容. 2013-03-16 Skywang ...
随机推荐
- 记录Echarts官网打开慢的解决方法
进入C:\Windows\System32\drivers\etc: 在hosts文件里添加 151.101.2.132 echarts.apache.org
- Educational Codeforces Round 1 个人总结A-E
Educational Codeforces Round 1 A. Tricky Sum 数学,求\(1 \dots n\)的和减去 小于等于n的二次幂乘2之和 LL f[40]; void solv ...
- 上分准备 VP Codeforces Round #762 (Div. 3) 4题ABCE
+00:02 +00:16 +01:08 +02:07 VP 情况 4/8 ABCE ,赛时排名可以到823,什么时候我可以上个青 B 本想写个map的二分的,发现自己不会,写了个普普通通的二分 ...
- RabbitMq的部署(docker)和操作(python)详解
一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信. ...
- JavaScript常见事件记录
JavaScript常见事件记录 onblur: 元素失去焦点 onfocus: 元素获得焦点 onchange: 用户改变域的内容 onclick: 鼠标点击某个对象 ondblclick: 鼠标双 ...
- 创建sqlSession对象操作数据库
1.加载核心配置文件 //加载mybatis核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; I ...
- connect及bind、listen、accept背后的三次握手
如图所示打上断点,分别找出connect() bind() listen() accpet()对应的函数 源码在上一次作业中已经分析过了 https://www.cnblogs.com/qwertyu ...
- NX二次开发VS环境搭建
1.安装VS2019(直接安装高版本:与NX匹配时向下兼容,不需要纠结) 2.安装习惯使用的NX(建议直接上NX1980,新版不管是功能还是界面都比低版好用得多.很多人说新版不好用,这只是个人习惯和接 ...
- 安装opencv相关
1.查看当前OpenCV的版本 pkg-config --modversion opencv 2.查找有关OpenCV文件 find / -iname "*opencv*" //- ...
- element表格样式的修改
修改表格头部背景 .el-table th{ background: #f00; } 修改表格行背景 .el-table tr{ background: #f00; } 修改斑马线表格的背景 .el- ...