Android 双指同时点击事件模拟

来源:互联网 发布:linux shell 睡眠 编辑:程序博客网 时间:2024/05/16 09:25

Android 双指同时点击事件模拟

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

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

@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {    Log.v("TouchEvent", "action== " + ev.getAction());    return true;}(1)单指点击,类似SingleTap,输出log:

这里写图片描述

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 的事件。

这里写图片描述

(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;  //261public static final int ACTION_POINTER_2_UP     = ACTION_POINTER_UP | 0x0100;  //262另外,双指点击的时候也可能出现下面的log:

这里写图片描述

那么现在就根据上面的试验,组合出“双指点击”这一事件,代码如下:private int mTouchRepeat = 0; //过滤掉长按的情况private boolean mPoint2Down = false;  //是否出现双指按下的情况@Overridepublic 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;}实际上,上面的代码除了双指点击时会触发事件,三指同时点击也会出现这种情况:在最上面的试验中,如果三指同时点击,会出现下面的输出:

这里写图片描述

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;@Overridepublic 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;}
0 0