Android 双指同时点击事件模拟

Android 双指同时点击事件模拟

今天有个需求是要通过双指同时点击屏幕来触发某个功能,特此看那了下Android多点触控的API,首先发现 MotionEvent 类里面有些 ACTION_POINTER_2_DOWN 、 ACTION_POINTER_3_DOWN 这样的常量,应该就是和多点触摸相关的。

下面在Activity里面重写dispatchTouchEvent方法试验:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    Log.v("TouchEvent", "action== " + ev.getAction());
    return true;
}

(1)单指点击,类似SingleTap,输出log:

Android 双指同时点击事件模拟_第1张图片

public static final int ACTION_DOWN             = 0;
public static final int ACTION_UP               = 1;
public static final int ACTION_MOVE             = 2;

0、1、2分别与上面的事件对应,表示按下、移动、抬起。

(2)单指长按后抬起:可以看到中间多出一些 ACTION_MOVE 的事件。

Android 双指同时点击事件模拟_第2张图片

(3)双指同时点击:

Android 双指同时点击事件模拟_第3张图片
中间多了 251、252两个数字,如下分别是与ACTION_POINTER_2_DOWN、ACTION_POINTER_2_UP对应的,这里是指第二只手指按下和抬起的事件。

public static final int ACTION_POINTER_DOWN     = 5;
public static final int ACTION_POINTER_UP       = 6;

public static final int ACTION_POINTER_2_DOWN   = ACTION_POINTER_DOWN | 0x0100;  //261
public static final int ACTION_POINTER_2_UP     = ACTION_POINTER_UP | 0x0100;  //262

另外,双指点击的时候也可能出现下面的log:

Android 双指同时点击事件模拟_第4张图片

那么现在就根据上面的试验,组合出“双指点击”这一事件,代码如下:

private int mTouchRepeat = 0; //过滤掉长按的情况
private boolean mPoint2Down = false;  //是否出现双指按下的情况
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {  
        case MotionEvent.ACTION_DOWN:
            mPoint2Down = false;            
            mTouchRepeat = 0;  
            break;  
        case MotionEvent.ACTION_MOVE:  
            mTouchRepeat++;  
            break;  
        case MotionEvent.ACTION_POINTER_2_DOWN:  
            mPoint2Down = true;  
            break;              
        case MotionEvent.ACTION_POINTER_UP:  
            if (mPoint2Down && mTouchRepeat < 10) {
                //do something here
                Log.v("tap_tap_event", "It works!");
            }
            break;  
    }
    return true;
}

实际上,上面的代码除了双指点击时会触发事件,三指同时点击也会出现这种情况:
在最上面的试验中,如果三指同时点击,会出现下面的输出:

Android 双指同时点击事件模拟_第5张图片

public static final int ACTION_POINTER_3_DOWN   = ACTION_POINTER_DOWN | 0x0200;
public static final int ACTION_POINTER_3_UP     = ACTION_POINTER_UP | 0x0200;

其中也包含了双指点击的所有独立事件,这样的话还需要过滤掉三指同时点击的情况,
代码如下:

private int mTouchRepeat = 0;
private boolean mPoint2Down = false;
private boolean mThreePointDown = false;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {  
        case MotionEvent.ACTION_DOWN:
            mPoint2Down = false;
            mThreePointDown = false;                
            mTouchRepeat = 0;  
            break;  
        case MotionEvent.ACTION_MOVE:  
            mTouchRepeat++;  
            break;  
        case MotionEvent.ACTION_POINTER_2_DOWN:  
            mPoint2Down = true;  
            break;
        case MotionEvent.ACTION_POINTER_3_DOWN:  
            mThreePointDown = true;  
            break;
        case MotionEvent.ACTION_POINTER_UP:  
            if (mPoint2Down && mTouchRepeat < 10 && !mThreePointDown) {
                //do something here
                Log.v("tap_tap_event", "It works!");
            }
            break;  
    }
    return true;
}

你可能感兴趣的:(Android)