利用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 {
  //点击事件 }

:)

原文地址:https://www.cnblogs.com/zh2314372037/p/13965371.html