前言
相信大家在開發工作中,會經常遇見某個控件被重複點選,可能就會造成一些不可預知的問題。例如:跳轉某個activity時,點選過快可能就會建立兩個相同的界面~
今天就和大家來分享下,利用 kotlin 的拓展函數和拓展屬性解決這種問題
第一步:在 res/values 目錄下建立一個 ids.xml 的檔案,定義兩個屬性:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="triggerDelayKey" type="id"/>
<item name="triggerLastTimeKey" type="id"/>
</resources>
第二步:在項目中,建立一個 .kt 檔案,添加如下函數:
/**
* get set
* 給view添加一個上次觸發時間的屬性(用來屏蔽連擊操作)
*/
private var <T : View>T.triggerLastTime: Long
get() = if (getTag(R.id.triggerLastTimeKey) != null) getTag(R.id.triggerLastTimeKey) as Long else 0
set(value) {
setTag(R.id.triggerLastTimeKey, value)
}
/**
* get set
* 給view添加一個延遲的屬性(用來屏蔽連擊操作)
*/
private var <T : View> T.triggerDelay: Long
get() = if (getTag(R.id.triggerDelayKey) != null) getTag(R.id.triggerDelayKey) as Long else -1
set(value) {
setTag(R.id.triggerDelayKey, value)
}
/**
* 判斷時間是否滿足再次點選的要求(控制點選)
*/
private fun <T : View> T.clickEnable(): Boolean {
var clickable = false
val currentClickTime = System.currentTimeMillis()
if (currentClickTime - triggerLastTime >= triggerDelay) {
clickable = true
}
triggerLastTime = currentClickTime
return clickable
}
/***
* 帶延遲過濾點選事件的 View 擴充
* @param delay Long 延遲時間,預設500毫秒
* @param block: (T) -> Unit 函數
* @return Unit
*/
fun <T : View> T.clickWithTrigger(delay: Long = 500, block: (T) -> Unit) {
triggerDelay = delay
setOnClickListener {
if (clickEnable()) {
block(this)
}
}
}
最後:代碼中使用(目前隻能在 kotlin 代碼中調用)
//指定某控件點選間隔時間:1000毫秒
view.clickWithTrigger (1000){
...
}
//預設某控件點選間隔時間:500毫秒
view.clickWithTrigger {
...
}