Android Banner - ViewPager 02

现在来给viewpager实现的banenr加上自动轮播

自动轮播的原理,使用handler的延迟消息来实现。

自动轮播实现如下内容

  1. 开始轮播&停止轮播

  2. 可配置轮播时长、轮播方向

  3. 通过自定义属性来配置轮播时长,方向

  4. 感知生命周期,可见时开始轮播,不可见时停止轮播

  5. 感知手指触摸,触摸按下时停止轮播,抬起重新计时

开始&停止轮播

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的更多相关文章

  1. Android中viewPager的一两点使用

    Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...

  2. Android Testing学习02 HelloTesting 项目建立与执行

    Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...

  3. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  4. android之ViewPager

    在android中ViewPager是非常常用的控件.它在android.support.v4.view.ViewPager下.你们自己可以进http://developer.android.com/ ...

  5. Android listview viewpager解决冲突 滑动

    Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决   在listview 上使用 addHeaderView 在第 ...

  6. Android 使用ViewPager实现左右循环滑动图片

    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1.    首先看一 ...

  7. android 解决ViewPager双层嵌套的滑动问题

    解决ViewPager双层嵌套的滑动问题 今天我分享一下ViewPager的双层嵌套时影响内部ViewPager的触摸滑动问题 之前在做自己的一个项目的时候,遇到广告栏图片动态切换,我第一时间想到的就 ...

  8. android使用ViewPager实现欢迎引导页

    android使用ViewPager实现欢迎引导页 大多数APP第一次启动的时候,都会有一个引导界面,左右滑动,到最后一张,用户点击才再次进入主界面.当第二次启动的时候,则直接进入主界面. 这种效果一 ...

  9. android下ViewPager的使用,带下部选项栏的切换动画

    (文章针对类似我这种初学者,大神看到不要嘲笑) 演示 我的规矩是先上GIF动画效果(Linux下用转的GIF,清晰度还可以但是不知道为什么放博客上,界面会这么大): 代码: android中有View ...

  10. Android Service总结02 service介绍

    Android Service总结02 service介绍 版本 版本说明 发布时间 发布人 V1.0 介绍了Service的种类,常用API,生命周期等内容. 2013-03-16 Skywang ...

随机推荐

  1. 上分准备 VP Codeforces Round #762 (Div. 3) 4题ABCE

    +00:02 +00:16 +01:08   +02:07 VP 情况  4/8 ABCE ,赛时排名可以到823,什么时候我可以上个青 B 本想写个map的二分的,发现自己不会,写了个普普通通的二分 ...

  2. git commit --amend适用场景详解

    适用场景: 场景1.本地开发代码已提交,提交后发现这次提交的代码有问题,或者漏提交了一些文件,此时,希望达到以下目的: ①修改有问题的代码. ②补足漏提交的文件(一般是新增的文件没有git add . ...

  3. MySQL数据库本地连接失败

    前提: MySQL5.5 + SQLyog软件,从安装开始一直可以正常使用 现象: 用SQLyog软件登录,显示本地连接失败.怀疑可能是MySQL服务没有开启,结果发现服务里面找不到MySQL这一条( ...

  4. Spring Boot中开启Spring Security

    Spring Boot中开启Spring Security Spring Security是一款基于Spring的安全框架,主要包含认证和授权两大安全模块,和另外一款流行的安全框架Apache Shi ...

  5. 字节过滤流->缓冲流 BufferedOutputStream 用法:

    1创建字节输出节点流 :FileoutputStream fos = new FileoutputStream("文件输入的路径",true);(true表示追加,false表示覆 ...

  6. K8SPod进阶资源限制以及探针

    一.Pod 进阶 1.资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量. 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源. 当为 Pod 中的容器指定了 reque ...

  7. auto 类型说明符

    编程时常常需要把表达式的值赋给变量,这就要求在声明变量时清楚地知道表达式的类型.然而做到这一点并非那么容易,有时候甚至根本做不到.为了解决这个问题,c++11新标准引入了auto类型说明符,用它就能让 ...

  8. R grep

    SAIN<-FAIN[grepl("HE-H$",FAIN$rDD),,drop=TRUE]

  9. 02 HTML基础-图片和音视频

    1.HTML中的图片 HTML5的<figure>和<figcaption>为图片提供了一个语义容器,在标题和图片之间建立了清晰的联系.<figcaption>元素 ...

  10. TFlite 多线程并行

    import numpy as np from multiprocessing import Process, Queue def process_data(data, model_TSNet, ts ...