一些常量:
object ViewClickDelay {
var hash: Int = 0
var lastClickTime: Long = 0
var SPACE_TIME: Long = 600
var DOUBLE_TIME: Long = 500
}
防止多次点击:防抖
fun View.setOnClickDelay(clickAction: (View) -> Unit) {
this.setOnClickListener {
try {
//第一次进来肯定不一样,走这里
if (this.hashCode() != hash) {
hash = this.hashCode()
lastClickTime = System.currentTimeMillis()
clickAction(it)
} else {
//第二次走这里
val currentTime = System.currentTimeMillis()
//间隔多久SPACE_TIME自己设置
if (currentTime - lastClickTime > SPACE_TIME) {
lastClickTime = currentTime
clickAction(it)
}
}
} catch (e: Throwable) {
e.printStackTrace()
clickAction(it)
}
}
}
/**
* 监听 View 的双击事件
* @param doubleClick 双击事件回调
*/
fun View.setOnDoubleClickListener(doubleClick: (View) -> Unit) {
this.setOnClickListener {
val currentTime = System.currentTimeMillis()
//如果用户第一次点击其它View,给lastClickTime 赋值,然后再点击进来当前,
//是可以直接触发双击的,但是一般是不可能出现的。
//lastClickTime 是工具类共用的,你也可以单独给这个方法定义一个常量。
//或者像防抖哪里给添加一个 if (this.hashCode() != hash) {判断
if (currentTime - lastClickTime < DOUBLE_TIME) {
lastClickTime = 0
doubleClick(it)
} else {
lastClickTime = currentTime
}
}
}
之前看过滑动辅助工具类里面的双击源码,是通过给handler发送一个延迟300毫秒的事件来确认在这中间是否触发了两次,以此来判断是否是双击,上面的双击方法其实是可以正常去使用的,所谓的bug基本不可能出现,而且出现了问题也不大,