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