View多次点击事件的判断

原理

判断多次点击事件其实很简单,就是判断前后几次点击的时间差是否小于一个预期的值。
比如对于双击事件来说,如果两次点击操作的时间差不超过300毫秒,就认为是双击操作。
对于这个原理,基本上可以在所有平台中通用。

实现(双击)

既然要计算时间差,那么就需要来记录下每次点击的时间,一般用long类型的数组来存储,需要判断几次连击,就给数组多大的长度:

1
private long[] hitTimes = new long[2];

每次点击事件执行的时候,就让数组的值依次向前覆盖,然后把本次点击的时间存储在最后一个元素中。
向前覆盖可以通过java提供的接口来实现:

1
2
System.arraycopy(hitTimes, 1, hitTimes, 0, hitTimes.length - 1);
hitTimes[hitTimes.length - 1] = SystemClock.uptimeMillis();

也可以自己写一个方法来实现:

1
2
3
4
5
6
private void updateTimes(long[] hitTimes) {
for (int i = 0; i < hitTimes.length - 1; i++) {
hitTimes[i] = hitTimes[i + 1];
}
hitTimes[hitTimes.length - 1] = SystemClock.uptimeMillis();
}

当然我这个方法很烂,AS自动提示我要用 System.arraycopy 来替换。。。
接下来就是判断时间差了:

1
2
3
if (hitTimes[0] >= SystemClock.uptimeMillis() - 300) {
//执行双击事件
}

完整的setOnClickListener源码:

1
2
3
4
5
6
7
8
9
10
11
12
private void setDoubleClick() {
toastText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.arraycopy(hitTimes, 1, hitTimes, 0, hitTimes.length - 1);
hitTimes[hitTimes.length - 1] = SystemClock.uptimeMillis();
if (hitTimes[0] >= SystemClock.uptimeMillis() - 300) {
//执行双击事件
}
}
});
}