首页 > 代码库 > 多次点击事件

多次点击事件

Android给我们提供了单次点击事件(以及双击),虽然在设置中我们有发现多次点击事件的案例(如启用开发者模式),但Android本身并没有提供多次点击事件的实现。有如下两种实现方式:

定义存贮多个事件点的变量

首先以双击事件为例说明。
定义一个存贮上一个第一次点击的变量,如果第二次点击的时间间隔小于500毫秒,则认为是双击事件
private long startClickTime;

public void onClickView() {
long nextClickTime = SystemClock.uptimeMillis();
if (startClickTime <= 0) startClickTime = SystemClock.uptimeMillis();
else {
if (nextClickTime - startClickTime < 500) {
Toast.makeText(this, "双击", Toast.LENGTH_SHORT).show();
startClickTime = 0L;
} else startClickTime = nextClickTime;
}
}
这种方式有个缺陷,如果要实现多次点击,那么就需要定义存贮多个事件点的变量,很显然不适合多次点击的处理。

使用Google提供的api中采用的算法。

能够实现n次点击事件,我们需要定义一个n长度的数组,每点击一次将数组里的内容按序号整体向左移动一格,然后给n-1出即数组的最后添加当前的时间,如果0个位置的时间大于当前时间减去500毫秒的话,那么证明在500毫秒内点击了n次。
private long[] mHits = new long[4];
private static final int MAX_TIME = 500;

public void onClickView() {
Toast.makeText(this, "击", Toast.LENGTH_SHORT).show();
//复制数组的元素从第1个位置开始,目标地址是第0个位置,复制的长度为数组长度-1
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
//给数组最后一个位置赋值
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
//判断数组第一个位置的时间与当前时间的差是否小于500毫秒,假如小于的话,就认为是多次点击事件
for (int i = 0; i < mHits.length; i++) {
if (mHits[0] > SystemClock.uptimeMillis() - MAX_TIME) **N击事件条件**;
if (mHits[i] > SystemClock.uptimeMillis() - MAX_TIME) {
Toast.makeText(this, mHits.length - i + "击", Toast.LENGTH_SHORT).show();
break;
}
}
}
if (mHits[0] > SystemClock.uptimeMillis() - MAX_TIME) 条件成立时表明已经是你定义的N击事件。

多次点击事件