> 文档中心 > 简单的View的点击拓展方法,防抖和双击。

简单的View的点击拓展方法,防抖和双击。

一些常量

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基本不可能出现,而且出现了问题也不大,