换个思路实现控件的multi click
2016-08-05 本文已影响119人
blink_dagger
说到控件的多击,大家肯定能想到通过判断前后点击时的时间值来处理双击、三击事件。
这里简述一下大家常用的三种方式,以双击为例:
1 .通过new Thread来清空上次的点击时间
public void click(View view) {
if (firstClickTime > 0) {
secondClickTime = SystemClock.uptimeMillis();
if (secondClickTime - firstClickTime < 500) {
//再这处理双击操作
dosomethig();
}
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();
}
2.通过list的add,remove,clear来完成双击判断
List times = new ArrayList();
public void click(View view) {
times.add(SystemClock.uptimeMillis());
if (times.size() == 2) {
//已经完成了一次双击,list可以清空了
if (times.get(times.size()-1)-times.get(0) < 500) {
times.clear();
//再这处理双击操作
dosomething();
} else {
//这种情况下,第一次点击的时间已经没有用处了,第二次就是“第一次”
times.remove(0);
}
}
}
3.第三种,谷歌使用的数组移位方式
long[] mHits = new long[2];
public void click() {
/**
* 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)) {
//双击后具体的操作
dosomething();
}
}
新思路
但是上面的这三种方式,都只能单独处理双击的情况,当我们单击时不能执行相应操作(最近需要实现一个多击屏幕的客制化需求。。。分别要响应单、双、三击)。我的想法是只在Click方法里,判断点击间隔时间,赋值当前的count,然后通过Handler在runnable中处理相应count值的操作。
@OnClick(R.id.mButton)
public void onClick() {
if (clickCount==0) {
long currentClick = SystemClock.uptimeMillis();
if (currentClick - lastClick < 600){
return ;//
}
mHandler.postDelayed(mRunnable,600);
}
clickCount++;
}
在runnable中为lastClick赋值,同时清空count,当间隔小于600毫秒时,直接return,不继续post。代码如下:
mHandler=new Handler();
mRunnable= new Runnable() {
public void run() {
//mHandler.removeCallbacks(mRunnable);
if (clickCount ==1){
Toast.makeText(MainActivity.this,"单击哦~",Toast.LENGTH_SHORT).show();
}else if (clickCount ==2){
Toast.makeText(MainActivity.this,"双击哦~",Toast.LENGTH_SHORT).show();
}else if (clickCount ==3 ){
Toast.makeText(MainActivity.this,"三击哦~",Toast.LENGTH_SHORT).show();
}
lastClick=SystemClock.uptimeMillis();
clickCount = 0;
}
};
有其他见解的欢迎补充~