Android Banner - ViewPager

news2024/11/15 8:23:01

现在来给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()
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ansible】Ansible自动化运维工具的应用与常用命令

ansible自动化运维工具 一、ansible 的概述1. ansible 的概念2. ansible 的特性 二、ansible 的部署与命令1. ansible 的部署1.1 服务器ip地址设置1.2 ansible 服务器部署 2. ansible 命令行模块2.1 command 模块2.2 shell 模块2.3 cron 模块2.4 user 模块2.5 group 模块2.6 co…

Spring Batch教程(三)示例:从mysql中读取数据写入文本和从多个文本中读取内容写入mysql

Spring batch 系列文章 Spring Batch教程&#xff08;一&#xff09; 简单的介绍以及通过springbatch将xml文件转成txt文件 Spring Batch教程&#xff08;二&#xff09;示例&#xff1a;将txt文件转成xml文件以及读取xml文件内容存储到数据库mysql Spring Batch教程&#xff…

在CSDN的几年,我的Python书籍,第三次重印了!

大家好&#xff0c;我是黄伟&#x1f92d; 我的书籍《快学Python&#xff1a;自动化办公轻松实战》第3次重印了&#xff0c;感谢大家的支持。 这本书干货多多&#xff0c;零基础教你Python自动化办公&#xff0c;让你工作效率提升10倍&#xff0c;提前1小时下班。 因此&#…

2018年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

2018年1月真题 四、写作&#xff1a;第56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35分。 56.论证有效性分析&#xff1a; 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该论证的有…

「开源项目」现代化开源Linux服务器运维管理面板-1Panel

1Panel 基本介绍 1Panel 是新一代的 Linux 服务器运维管理面板 产品优势 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b; 高效管理&#xff1a;通过 Web 端轻松管理 Linux 服务器&#xff0c;包括应用管理、主机监控…

二分图算法(染色法 匈牙利算法)

目录 二分图算法总览二分图的概念1.二分图的定义2.二分图的特点3.二分图的应用 染色法&#xff08;判断二分图&#xff09;算法步骤算法运用染色法判定二分图 匈牙利算法&#xff08;计算二分图的最大匹配&#xff09;二分图的匹配算法步骤算法应用二分图的最大匹配 二分图算法…

Jmeter并发测试

基本步骤 1、新建线程组 测试计划右键——>添加——>线程&#xff08;用户&#xff09;——>线程组 2、 添加HTTP请求 线程组右键——>添加——>取样器——>HTTP请求 3、 添加HTTP信息头管理器 线程组右键——>添加——>配置元件——>HTTP信息头…

【观察】以超融合创新架构,加速企业应用现代化

我们知道&#xff0c;数字化转型的不断加速&#xff0c;核心就是应用的加速。在整个数字化体系中&#xff0c;软件应用是让一切发挥价值的落地路径。在应用发挥能力之前&#xff0c;企业需要进行大量软硬件准备以及应用开发工作&#xff1b;在应用开始发挥能力之&#xff0c;企…

牛客小白月赛75F题解

文章目录 [ 打牌](https://ac.nowcoder.com/acm/contest/60063/F)问题建模问题分析代码 打牌 问题建模 给出三个长度为3的字符串&#xff0c;每个字符串仅由’w’,‘i’,‘n’三种字符组成&#xff0c;以及回合数n&#xff0c;每一个回合每一个字符串选择一个字符向其下一个字…

【Android】底层逻辑深入了解(学习笔记)(未完)

step by step. 目录 init启动 Zygote进程&#xff1a; SystemServer处理过程 Binder&#xff1a; Launcher启动过程 Android系统启动流程 四大组件 Activity Service BroadcastReceiver广播 ContentProvider内容提供者&#xff08;进程内和进程间的数据共享&#xff…

Latex | 使用MATLAB生成.eps矢量图并导入Latex中的方法

一、问题描述 用Latex时写paper时&#xff0c;要导入MATLAB生成的图进去 二、解决思路 &#xff08;1&#xff09;在MATLAB生成图片的窗口中&#xff0c;导出.eps矢量图 &#xff08;2&#xff09;把图上传到overleaf的目录 &#xff08;3&#xff09;在文中添加相应代码 三…

深度学习100例 | 第31天-卷积神经网络(DenseNet)识别生活物品

&#x1f680; 我的环境&#xff1a; 语言环境&#xff1a;Python3.6.5编译器&#xff1a;jupyter notebook深度学习环境&#xff1a;TensorFlow2.4.1显卡&#xff08;GPU&#xff09;&#xff1a;NVIDIA GeForce RTX 3080数据&#xff1a;&#x1f4cc;【传送门】 &#x1f…

Gradle和Maven的区别

Gradle和Maven 当涉及到构建和管理项目时&#xff0c;Gradle和Maven是两个非常流行的选项。本文将讨论Gradle和Maven之间的区别以及它们的配置信息差异。 1. Gradle和Maven的区别 1.1 构建脚本语言 Maven使用XML作为构建脚本语言&#xff0c;而Gradle使用基于Groovy的DSL&…

HashMap查找

文章目录 1 哈希表的基本概念1.1 两个例子1.2 如何查找1.3 若干术语 2 哈希函数的构造方法2.1 直接定址法2.2 除留余数法 3 处理冲突的方法3.1 开放地址法3.1.1 线性探测法3.1.2 二次探测法3.1.3 伪随机探测法 3.2 链地址法&#xff08;拉链法&#xff09;3.2.1 创建步骤3.2.2 …

STM32-风速传感器(ADC)

目录 0 说明 1 传感器介绍 2 代码说明 2.1 ADC.c 2.2 adc.h 2.3 main.c 0 说明 本篇文章主要是说明怎么使用STM32单片机读取风速传感器采集到的数据&#xff0c;读取方式是ADC&#xff0c;并且附带着STM32所需要的全部代码&#xff0c;所使用的风速传感器如下图所示。 附&am…

Redis—相关背景

Redis—相关背景 &#x1f50e;Redis—特性In-memory data structures—在内存中存储数据Programmability—可编程性Extensibility—可扩展性Persistence—持久化Clustering—集群High availability—高可用 &#x1f50e;Redis 为什么快&#x1f50e;Redis 的使用场景Real-tim…

看看ChatGPT的Embedding接口都完成哪些任务

调用Embedding接口完成文本分类 前面博客介绍了如何调用ChatGPT的Embedding接口完成文本聚类任务&#xff0c;实现过程入下图所示&#xff1a; 除了完成文本分类&#xff0c;调用Embedding接口还可完成聚类任务。 调用Embedding接口完成聚类任务 聚类任务是一种无监督学习任…

tinymce实现将word中内容(文字图片等)直接粘贴至编辑器中——利用插件tinymce-powerpaste-plugin

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&#xff1a; 开源可商用&#xff0c;基于LGPL2.1 插件丰富&#xff0c;自带插件基本涵盖日常…

活字格性能优化技巧——如何利用数据库主键提升访问性能

大家都知道&#xff0c;活字格作为企业级低代码开发平台&#xff0c;拥有6大引擎&#xff0c;3大能力&#xff0c;能够高效落地企业级应用。在每年的应用大赛中也能看到很多格友利用活字格做了很多复杂的应用&#xff0c;例如2021年企业级低代码应用大赛中宁波聚轩利用活字格做…

vue使用qrcodejs2-fix或者qrcodejs2插件生成二维码

1. vue2安装 npm i qrcodejs2 1.1. vue3安装 npm install qrcodejs2-fix 2. 组件中引入并封装成公共组件&#xff0c;vue3版 <template><!-- 二维码生成 --><div class"body-div"><div style"width: 100%;height: 100%;" :id&quo…