利用Kotlin扩展函数实现任意View的点击处理(点击效果和防止快速点击)
利用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的点击处理(点击效果和防止快速点击)的更多相关文章
- 求任意长度数组的最大值(整数类型)。利用params参数实现任意长度的改变。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- [c++]大数运算---利用C++ string实现任意长度正小数、整数之间的加减法
本文为大大维原创,最早于博客园发表,转载请注明出处!!! 一.概述 C/C++中的int类型能表示的范围是-2E31-2E31–1.unsigned类型能表示的范围是0-2E32–1,即 0-4294 ...
- kotlin扩展函数
kotlin 扩展函数 https://www.kotlincn.net/docs/reference/extensions.html 扩展函数在android中的应用 fun AppCompatAc ...
- Android自定义View 画弧形,文字,并增加动画效果
一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类 B ...
- Linux脚本实现“按任意键继续/Press any key to continue”效果
此代码来自lnmp一键安装包,用于实现“按任意键继续/Press any key to continue”效果: get_char() { SAVEDSTTY=`stty -g` #隐藏终端输入显示 ...
- 利用纯CSS3实现超立体的3D图片侧翻倾斜效果
原文:利用纯CSS3实现超立体的3D图片侧翻倾斜效果 上午的时候我在jQuery论坛上看到网友分享的一款CSS3 3D图片侧翻倾斜特效,觉得效果非常棒,其实话说回来,这玩意儿的实现真的非常简单,主要是 ...
- 利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果
利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果/etc/init.d/nginxd {start/stop/restart/reload}利用if语句实现: ============= ...
- 利用SegmentedControl切换控制器的view
#import "ViewController.h" #import "OneViewController.h" #import "TwoViewCo ...
- android任意view爆炸效果--第三方开源--ExplosionField
犹如天女散花一样,爆炸散列,比较有趣.Android ExplosionField在github上的项目主页是:https://github.com/tyrantgit/ExplosionField ...
随机推荐
- Jquery特效之=》仿京东多条件筛选特效
仿京东多条件筛选特效 * { margin: 0; padding: 0; list-style-type: none } a, img { border: 0 } body { font: 12px ...
- SE第一次作业
作业一.对软件工程的初步认识 下面是我对于软件工程的认识,结合自己的理解和课上听讲的内容 软件工程=软件+工程?软件工程是否就是简单的软件+工程呢?那么我们先来看下各自的概念. 那么什么叫软件呢,既然 ...
- day70:Vue:Git&路飞学城页面效果
目录 1.Git 2.路飞学城项目页面效果 0.安装elements UI 1.顶部导航栏效果 2.轮播图效果 1.Git 什么是git?分布式版本管理工具 1.git操作 # 1 创建git本地仓库 ...
- MASM入门 (一)DOSBox的安装和使用
目录 (1)DOSBox的下载安装 (2)DOSBox的使用 (3)Tips (1)DOSBox的下载安装 DOSBox从安装到使用的过程还是有些繁琐的,所以小编直接附上免安装版本,大家下载解压后点击 ...
- 这份算法攻略,我拿到了5个大厂的offer
每个时代,都不会亏待会学习的人. 大家好,我是 yes. 我持续在 LeetCode 刷算法题将近有一年半的时间了,这一年半以来我对算法的看法改变了很多,但是实话实说支持我前进的还是面试. 在之前的文 ...
- Bitmap 创建、转换、圆角、设置透明度
指定一个色值生成bitmap public Bitmap getBackGroundBitmap(int color) { Paint p = new Paint(); p.setColor(Col ...
- MySQL设置慢查询
MySQL的慢查询日志是用来记录在MySQL中响应时间超过阀值的语句,则会被记录到慢查询日志中(运行时间超过long_query_time值的SQL语句): 慢查询相关参数: slow_query ...
- 开机自起tomcat
开机自启动Tomcat: 每次开机都要启动tomcat,网上看了好多都是用shell脚本来实现tomcat开机自启动,后来看到一种方法,直接修改系统文件来实现,已经实践过,方法有效. 1.修改脚本文件 ...
- tomcat 登录主页成功 点击Manager App 401 等问题
1.将项目部署在tomcat的安装路径webapps下(如果报404,查下该应用是否在tomcat的webapps下部署着) 2.启动tomcat成功,http://127.0.0.1:8080成功, ...
- Django( 学习第五部 Django之模板语法)
目录 模板语法 --- 传值 摸板语法 --- 过滤器 模板语法 --- 标签 自定义过滤器.标签.inclusion_tag 模板的继承 模板语法 --- 传值 {{}} 变量相关 {% ...