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;}

更多相关文章

  1. ListView setOnItemClickListener无效原因详细分析
  2. ListView setOnItemClickListener无效原因分析
  3. 安卓开发环境的搭建(Eclipse+ADT+SDK+JDK的下载)
  4. android环境搭建
  5. ListView setOnItemClickListener无效原因详细分析
  6. 在Android上用PHP编写应用- PFA初探
  7. Android(安卓)重点知识回顾
  8. view的clickable属性和点击background颜色改变
  9. Android基础学习-----创建第一个Android项目HelloWorld(二)

随机推荐

  1. Android中Notification的framework层讲解
  2. Android Input Framework(二)---EventHub
  3. 基于android studio开发的 opencv关于and
  4. 坑中速记整理! 使用 kotlin 写第一个 Rea
  5. android中shape,selector,layer-list的使用
  6. EditText 行间距 以及光标高度和样式
  7. 8、Android中Intent(意图)
  8. android 7.0以上获取图片工具类
  9. Android 中LayoutInflater(布局加载器)之介
  10. android 常用控件的使用 TextView EditTe