双击事件的算法
android 中提供了click事件,但是没有提供doubleClick事件,如需要使用,需要程序员自定义doubleClick方法。
其实这也不算太难,双击不过就是在很短时间内的多次单击事件而已,只需要记录下来上次单击的时间,与这次比较,如果间隔小于500ms(或其他),则触发双击逻辑。
业余的双击算法
private long lastClickTime = 0;
private void doubleClick_1() {
long now = System.currentTimeMillis();//获取系统当前时间
if (lastClickTime > 0) {//上次有没有被单击或
if (now - lastClickTime < 500) {//触发双击逻辑
lastClickTime = 0;//此次双击事件已完成,lastClickTime清零
/**双击的业务逻辑*/
return;
}
}
lastClickTime = now;
}
嗯 的确,这样做也可以,但是,看到了谷歌大牛是这样写的:
专业的双击算法
private long[] mHits = new long[2];
private void doubleClick_2() {
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
mHits[mHits.length - 1] = SystemClock.uptimeMillis();//获取手机开机时间
if (mHits[mHits.length - 1] - mHits[0] < 500) {
/**双击的业务逻辑*/
}
}
如果想要改成三击,只需要private long[] mHits = new long[3];
就好。
学习一个:
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
这是在拷贝数组,将原来的数组中的元素的索引统一向前移动一位,原来的第一个元素被覆盖放弃,原来的最后一位成了倒数第二位。mHits[mHits.length - 1] = SystemClock.uptimeMillis();
这是将数组的最后一个元素赋值为当前的时间。- 这样的话 每次执行click的时候,就会把当前的时间存放在最后一位,而前若干次的click时间都会被顺延到数组的前一位,每次都判断一下数组的最后一个元素即当前时间 与 数组的第一个元素即往前length个的时间 间隔是否满足要求来触发多击逻辑。
感悟下哈
- google大牛的智慧值得钻研
- MarkDwon写博客的感觉真棒了