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 ...
随机推荐
- fpga 通过vga模块使电脑显示图片
对vga模块搞了好几天,vga接口时序不难,就是行计数,列计数,对应到每一个像素上去.这里我先把vga控制模块的程序付上.采用的是小梅哥的程序.屏幕是800X600,配置的时钟是40M.注意改变屏幕尺 ...
- node 版本管理
32位版本的node,运行较大的项目,会内存溢出.所以建议安装64位的版本,且运行速度比32位快.node14以下的版本支持node-sass,版本node16以上的不再支持node-sass,而sa ...
- Django框架搭建web项目(三)
参考官网文档:https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial02/ 在生成的app中进行数据库表设计. 1.在路径H:\myproj ...
- 20200921--同行列对角线的格(奥赛一本通P89 2 二维数组)
输入三个自然数n,i,j(1<=i<=n,1<=j<=n),输出在一个n*n格的棋盘中(行列均从1开始编号),与格子(i,j)同行,同列,同一对角线的所有格子的位置. 如:n= ...
- software Engineering homework 4
博客信息 沈阳航空航天大学计算机学院2020软件工程作业 作业要求 https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/1068 ...
- LoadRunner压力测试(web)
1.打开Virtual User Generator->新建脚本->选择创建新脚本类型,web-HTTP,HTML->创建 2.录制脚本 3.停止脚本录制 4.创建controlle ...
- 关于 用鼠标移动拖放 TabControl 标签 操作 实现 类
1.相关说明已有 2.本类有可以改进的地方,如更进,希望交流 3.对多行标签的支持没做特别解决,效果不太好 4.初学者使用,即可通过其构造函数直接加载需要赋予此拖放功能的 TabControl 即可实 ...
- 我做的mysql 一些题 里面大部分都是mysql的方法
基础题:-- 1. 查询Student表中的所有记录的Sname.Ssex和Class列.1 select sname,ssex,class from student;-- 2. 查询教师所有的单位即 ...
- ggplot2: display every nth value on discrete axis
every_nth = function(n) { return(function(x) {x[c(TRUE, rep(FALSE, n - 1))]}) } ggplot(mpg, aes(x = ...
- 005Java开发环境搭建
005Java开发环境搭建 1.JDK下载与安装 (1)卸载 首先我们先来学习一下如何卸载JDK. 删除Java的安装目录(jdk整个包). 删除环境变量里的"JAVA_HOME" ...