利用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. 用ASP创建API。NET Core (Day2):在ASP中创建API。网络核心

    下载PDF article - 1.5 MB 下载source - 152.4 KB 下载source - 206.3 KB 下载source code from GitHub 表的内容 中间件路线图 ...

  2. 【idea】重装系统(格式化C盘后)idea无法导入maven(jdk重装了,版本不同),结果报错!

    [以下部分截图]2019-11-25 09:48:49,045 [ 108964]   WARN -      #org.jetbrains.idea.maven - Cannot open inde ...

  3. 【CodeForces】835F Roads in the Kingdom

    一.题目 题目描述 王国有\(n\)座城市与\(n\)条有长度的街道,保证所有城市直接或间接联通,我们定义王国的直径为所有点对最短距离中的最大值,现因财政危机需拆除一条道路并同时要求所有城市仍然联通, ...

  4. es 讲义

    链接: https://pan.baidu.com/s/193jObXs85OZcvAHDycUXlw 提取码: ewbp

  5. 如何快速在vscode配置C/C++环境

    目录 1.卸载重装vscode 2.下载vscode 3.下载MinGW 4.配置环境变量 5.配置c/c++环境 6.超完整的配置文件 7.常用扩展推荐 8.注意 9.后记 相信许多刚开始使用vsc ...

  6. java之集合容器(Collection,Map)

    首先我们要了解什么是集合? 正所谓容器,比如说杯子是装水的容器,衣柜是装衣服的容器,那么集合就是装数据的容器. 集合有什么特点呢? 1.集合长度是可变的 2.集合用来存储对象 集合和数组有什么区别呢? ...

  7. Stream(一)

    public class Test06 { /* * StreamAPI: * StreamAPI是用来处理数据,处理集合等容器中的数据,处理操作有:查询.筛选.删除.过滤.统计.映射等. * 希望能 ...

  8. Lambda表达式(一)

    Lambda表达式其实就是实现SAM接口的语法糖,作用就是简化代码的冗余,同时可读性也好过匿名内部类. 以下先一步步演示是如何把大段的代码变成一句代码的,加强理解! 第一种正常的写法 1 public ...

  9. VS 2019 远程调试

    一.简介 今天遇到一个问题,本地调试无任何问题,但是发布后代码服务器端响应总是不对.所以想调试下.故搞个远程调试.现在先配置下工具.步骤如下. 二.步骤 2.1.远程访问工具下载 地址:https:/ ...

  10. Tensorflow学习笔记No.9

    模型的保存与恢复 介绍一些常见的模型保存与恢复方法,以及如何使用回调函数保存模型. 1.保存完整模型 model.save()方法可以保存完整的模型,包括模型的架构.模型的权重以及优化器. model ...