long firstClickTime = 0;
long secondClickTime = 0;
public void click1(View view) {
if (firstClickTime > 0) {
secondClickTime = SystemClock.uptimeMillis();
if (secondClickTime - firstClickTime < 500) {
Toast.makeText(this, "第一种双击方式", 0).show();
}
firstClickTime = 0;
return ;
}
firstClickTime = SystemClock.uptimeMillis();
new Thread(new Runnable() {
@Override
public void run() {
//
try {
Thread.sleep(500);
firstClickTime = 0;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
} 双击事件(多击事件)中有两个重要的问题需要考虑:第一次点击的时间,最后(如何知道是“最后”)点击的时间;点击一次后,等待一段时间(比如2s),再次双击(多击)如何保证得到正确的响应。 List<Long> times = new ArrayList<Long>();
public void click2(View view) {
times.add(SystemClock.uptimeMillis());
if (times.size() == 2) {
if (times.get(1)-times.get(0) < 500) {
times.clear();
Toast.makeText(this, "第一种双击方式", 0).show();
} else {
times.clear();
times.add(SystemClock.uptimeMillis());
}
}
} 在第二种方式中,使用List存放点击时的时间。现在来分析一下这个实现的原理: List<Long> times = new ArrayList<Long>();
public void click2(View view) {
times.add(SystemClock.uptimeMillis());
if (times.size() == 3) {
if (times.get(2)-times.get(0) < 500) {
times.clear();
Toast.makeText(this, "第一种双击方式", 0).show();
} else {
times.clear();
times.add(SystemClock.uptimeMillis());
}
}
} 真正需要改变的只是两个判断条件!! /**
* 双击事件、多击事件
*/
//存储时间的数组
long[] mHits = new long[2];
public void doubleClick() {
// 双击事件响应
/**
* arraycopy,拷贝数组
* src 要拷贝的源数组
* srcPos 源数组开始拷贝的下标位置
* dst 目标数组
* dstPos 开始存放的下标位置
* length 要拷贝的长度(元素的个数)
*
*/
//实现数组的移位操作,点击一次,左移一位,末尾补上当前开机时间(cpu的时间)
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
//双击事件的时间间隔500ms
if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
//双击后具体的操作
//do
}
} 非常简洁,思想差不多,不过谷歌工程师是利用数组移位操作来消除第二个问题的影响的。而要实现多击事件,只需修改数组长度即可。原文地址:http://blog.csdn.net/xiabob/article/details/43083133