Activity 双击事件监听(解决事件派发问题)

2014-11-24 11:14:51 · 作者: · 浏览: 3
使用手势识别类GestureDetector可以用标准的SDK类实现双击监听,但存在一个局限性:由于GD是在OnTouchEvent方法中拦截事件进行处理,而Android事件派发流程,使得如果Activity内部的View会消耗点击事件,GD就无法接受到点击事件了。
为此,本人实现一个可以完美监听Activity事件的工具类:DoubleClick。
类的全部 源码
[java]
public class DoubleClick{
private int clickCount;
private long firstClickTime;
private int CLICK_DELAY = 300;
private final static int MOVE_OFFSET = 20;
private float mLastMotionY;
private float mLastMotionX;
private Timer cleanClickTimer = new Timer();
private OnDoubleClickListener listener;
public DoubleClick(OnDoubleClickListener l){
listener = l;
}
public interface OnDoubleClickListener{
void onDoubleClick();
}
public void dispatchTouchEvent(MotionEvent event){
final float y = event.getY();
final float x = event.getX();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mLastMotionY = y;
mLastMotionX = x;
clickCount++;
if(clickCount == 1){
firstClickTime = System.currentTimeMillis();
//超过监听时间50MS还没有再次点击,则将点击次数,点击事件清零。
cleanClickTimer.schedule(new TimerTask() {
@Override
public void run() {
clickCount = 0;
firstClickTime = 0;
}
}, CLICK_DELAY+50);
}else if(clickCount == 2){
long secondClickTime = System.currentTimeMillis();
if (secondClickTime - firstClickTime <= CLICK_DELAY) {
listener.onDoubleClick();
}
clickCount = 0;
firstClickTime = 0;
}
}
if(event.getAction() == MotionEvent.ACTION_MOVE){
final int yDiff = (int) Math.abs(y - mLastMotionY);
final int xDiff = (int) Math.abs(x - mLastMotionX);
boolean yMoved = yDiff > MOVE_OFFSET;
boolean xMoved = xDiff > MOVE_OFFSET;
// 判断是否是移动
if (yMoved || xMoved) {
clickCount = 0;
firstClickTime = 0;
}
}
}
}
使用实例:
[java]
private DoubleClick doubleClick;
//当需要使用双击事件监听,调用此方法即可。
protected void enableDClickReturn(){
doubleClick = new DoubleClick(new DoubleClick.OnDoubleClickListener() {
@Override
public void onDoubleClick() {
//这里我的项目需要的功能是双击返回上一级Activity
finish();
}
});
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if(doubleClick == null) {
return super.dispatchTouchEvent(event);
}else{
doubleClick.dispatchTouchEvent(event);
}
return super.dispatchTouchEvent(event);
}
更多 Android项目工具类,请关注本人GitHub主页。
除公司项目源码不能公开,本人所有源码都开源到Github上:http://github.com/chenyoca