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