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

 

:)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM