利用Kotlin扩展函数实现View的点击处理(点击效果和防止快速点击)

kotlin经典写法:

        view?.setOnClickListener {
//实现
}

项目实践证明,这种写法存在问题

例如:项目中有支付功能,发起支付时会向后台提交数据,如果此时用户手抖(狗头)就会多次提交,可能创建了2个订单

例如:需要点击跳转页面时由于点击抖动,跳转了不止一次

优化抖动写法:

val minTime = 500L//这是间隔多少毫秒
var lastTime = 0L
val tmpTime = System.currentTimeMillis()
if (tmpTime - lastTime > minTime) {
lastTime = tmpTime
listener.invoke(this)
} else {
LogZ.d("点击过快,取消触发")
}

再优化写成kotlin扩展函数ext.kt:

/***
* 防止快速点击
*/
fun View.click(listener: (view: View) -> Unit) {
val minTime = 500L
var lastTime = 0L
this.setOnClickListener {
val tmpTime = System.currentTimeMillis()
if (tmpTime - lastTime > minTime) {
lastTime = tmpTime
listener.invoke(this)
} else {
LogZ.d("点击过快,取消触发")
}
}
}

以上是处理点击抖动

仔细一看,这里可以拿到View对象,既然这样,我们可以尝试在View点击事件中加点东西

项目中,一般可以点击的地方都需要点击效果(置灰改变透明度等),常规写法是写Drawable文件,然后android:background="xxxx"

但是这种写法很繁琐,每个不同类型控件都需要写Drawable然后xml里写android:background="xxxx",针对不同类型控件处理方法也不一样,例如:TextView,ImageView,ViewGroup等等

下面可以简单实现防止点击抖动+点击效果(改变alpha只是一种方式,可以自己实现更炫酷的效果)

增加点击效果ext.kt

/***
* 防止快速点击-并且添加按下变暗效果
*/
fun View.click(listener: (view: View) -> Unit) {
val minTime = 500L
var lastTime = 0L
this.setOnClickListener {
val tmpTime = System.currentTimeMillis()
if (tmpTime - lastTime > minTime) {
lastTime = tmpTime
listener.invoke(this)
} else {
LogZ.d("点击过快,取消触发")
}
}
this.setOnTouchListener { view, motionEvent ->
if (motionEvent.action == MotionEvent.ACTION_DOWN) {
view.alpha = 0.7f//这里改变前,可以存储原view.alpha值,这样不会影响设置了alpha的view
            Log.d("点击----","ACTION_DOWN")
} else if (motionEvent.action == MotionEvent.ACTION_UP) {
view.alpha = 1f//存储了alpha,取出值
Log.d("点击----","ACTION_UP")
} else if (motionEvent.action == MotionEvent.ACTION_CANCEL) {
view.alpha = 1f
Log.d("点击----","ACTION_CANCEL")
}
return@setOnTouchListener false
}
}

使用扩展函数:

     view.click {
     //点击事件
   }

 

利用Kotlin扩展函数实现任意View的点击处理(点击效果和防止快速点击)的更多相关文章

  1. 求任意长度数组的最大值(整数类型)。利用params参数实现任意长度的改变。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. [c++]大数运算---利用C++ string实现任意长度正小数、整数之间的加减法

    本文为大大维原创,最早于博客园发表,转载请注明出处!!! 一.概述 C/C++中的int类型能表示的范围是-2E31-2E31–1.unsigned类型能表示的范围是0-2E32–1,即 0-4294 ...

  3. kotlin扩展函数

    kotlin 扩展函数 https://www.kotlincn.net/docs/reference/extensions.html 扩展函数在android中的应用 fun AppCompatAc ...

  4. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  5. Linux脚本实现“按任意键继续/Press any key to continue”效果

    此代码来自lnmp一键安装包,用于实现“按任意键继续/Press any key to continue”效果: get_char() { SAVEDSTTY=`stty -g` #隐藏终端输入显示 ...

  6. 利用纯CSS3实现超立体的3D图片侧翻倾斜效果

    原文:利用纯CSS3实现超立体的3D图片侧翻倾斜效果 上午的时候我在jQuery论坛上看到网友分享的一款CSS3 3D图片侧翻倾斜特效,觉得效果非常棒,其实话说回来,这玩意儿的实现真的非常简单,主要是 ...

  7. 利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果

    利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果/etc/init.d/nginxd {start/stop/restart/reload}利用if语句实现: ============= ...

  8. 利用SegmentedControl切换控制器的view

    #import "ViewController.h" #import "OneViewController.h" #import "TwoViewCo ...

  9. android任意view爆炸效果--第三方开源--ExplosionField

    犹如天女散花一样,爆炸散列,比较有趣.Android ExplosionField在github上的项目主页是:https://github.com/tyrantgit/ExplosionField ...

随机推荐

  1. python -re库

    正则表达式的语法 正则表达式语法由字符和操作符构成 正则表达式的常用操作符: print("--正则表达式常用操作符--") mata="11356352135 abcd ...

  2. 机器学习 KNN算法原理

    K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.比如:判断一个人的人品,只需要观察 ...

  3. 学习go语言并完成第一个作品

    之前有使用C#写一个Windows下的发送邮件的命令行工具,方便一些脚本出现异常时向我的邮箱发送邮件提醒.但这并没有被我频繁使用,因为我的有些脚本还是在linux下面运行,因此我又有一篇文章用linu ...

  4. oracle 查询当前数据库环境

    select SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE')用户的认证类型 from dual;--用户的认证类型select SYS_CONTEXT('US ...

  5. 数据查询语句:DQL(Data Query Language)

    一.基础查询 1.语法:select 查询列表 from 表名; 2.特点:1.通过select查询完的结果,是一个虚拟的表格,不是真实存在   2.查询列表可以是:字段.表达式.常量.函数等   3 ...

  6. windows 快速安装Python3.7.2

    1.官方下载地址:https://www.python.org/downloads/release/python-372/ 其他地址:http://www.uzzf.com/soft/449550.h ...

  7. 利用Docker搭建开发环境

    一. 前言 随着平台的不断壮大,项目的研发对于开发人员而言,对于外部各类环境的依赖逐渐增加,特别是针对基础服务的依赖.这些现象导致开 发人员常常是为了简单从而直接使用公有的基础组件进行协同开发,在出现 ...

  8. BGP - 不同 AS 间运行的协议

    在之前介绍的网络场景中,ERGRP,OPSF,RIP 等都是运行在单独一个 AS(自治系统之间).这些协议统称为 IGP - 内部网关协议 ,目的主要是为自治系统内发现邻居和计算路由,从而找到合适的路 ...

  9. 对于某东平台XX娃娃的用户体验进行(严肃、限速)数据分析

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本次的爬取目标是某东的一个商品,但从来没有用过,所以本人很好奇.我们就采集这 ...

  10. offer_JZ25

    offer_JZ25 题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点.(注意,输 ...