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