Android控件中获取双击事件的获取有时候挺折磨人的。我们可以通过控件的TouchEvent和view的postdelayed来判断控件是否被双击。
TouchEvent是来捕捉控件view被触摸的状态,手指按下,手指离开等,postdelayed方法则是用来在一定时间后来查看控件被点击了几次,以判断是单击或双击事件。整个过程是:1.第一次点击,点击次数为1,然后开始等待一定时间(视为双击的时间如0.5s)2.等待期间每次点击,计数加一 3.等待时间到,查看点击次数,得出结果。
代码示例:
以webview为例
webview.setOnTouchListener(new OnTouchListener() {
long lastClickUpTime = 0;
long curClickUpTime = 0;
long CLICK_SPACING_TIME = 500;
<span style="white-space:pre"> </span>int clickcount = 0;
Runnable mRunnable = new Runnable() {
@Override
public void run() {
<span style="white-space:pre"> </span>if(clickcount <= 1)//单击
<span style="white-space:pre"> </span>System.out.println("webview one click " + clickcount);
else//双击
System.out.println("webview click " + clickcount);
clickcount = 0;
}
};
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
lastClickUpTime = curClickUpTime;
curClickUpTime = System.currentTimeMillis();
if ((curClickUpTime - lastClickUpTime < CLICK_SPACING_TIME)) {//是双击需取消第二次点击的那个线程
//System.out.println("webview double click " + (curClickUpTime-lastClickUpTime));
v.removeCallbacks(mRunnable);
}
clickcount++;
v.postDelayed(mRunnable, CLICK_SPACING_TIME);//延迟CLICK_SPACING_TIME后运行run
break;
}
return false;
}
});
逻辑上我们可以先看onTouch方法,当第一个action_up事件产生的时候视为一次点击,接着将点击次数累加同时执行postdelayed,当延迟时间过去后,执行run方法定义的内容,run方法查看当下点击数量,若为1,则是单击,其它则是多次点击。