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