MotionEvent的getAction、getActionMask和getActionIndex的区别

引言

在不少自定义View的场景中,都有可能须要重写onTouchEvent、dispatchTouchEvent等方法,这些方法都传入一个MotionEvent对象,通常来讲,咱们须要经过该MotionEvent对象来获取当前的手势动做,而后判断Action_Down、Action_Move、Action_Up来执行不一样的操做逻辑。 可是当咱们看MotionEvent对象时,发现它有getAction、getActionMask和getActionIndex方法,并且在咱们看第三方源码时,常常会看到这样的写法:bash

int action = event.getAction();
      switch (action) {
          case MotionEvent.ACTION_DOWN:

                  break;
          case MotionEvent.ACTION_MOVE:

                  break;
          case MotionEvent.ACTION_UP:

                break;
}
复制代码

同时也会看到这样的写法:ui

int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action) {
    case MotionEvent.ACTION_DOWN:

        break;
    case MotionEvent.ACTION_MOVE:
        break;
    case MotionEvent.ACTION_UP:

        break;
}
复制代码

这两种写法到底有什么区别呢?咱们就来讲一下MotionEvent的几种获取Action信息的方法。spa

TouchEvent事件信息存储

Android用一个32位的整数值来表示一个TouchEvent事件,低8位表示Touch事件的具体动做,例如按下、抬起、移动等动做。高8位表示Touch事件中多点触控的索引值。code

  • getAction: 表示触摸动做的原始32位信息,包括Touch事件的具体动做和触控点信息。
  • getActionMasked: 表示触摸的动做,按下、抬起、移动等信息。

从源码能够看出getActionMasked = getAction & MotionEvent.ACTION_MASK 而MotionEvent.ACTION_MASK 是一个常量值,值为0xff,因此getActionMasked方法只保留了低8位的信息,也就是说只保留了触摸的动做信息。对象

  • getActionIndex: 表示多点触控中触控点的信息。

为何看第三方源码时,有时候写getAction,有时候写getActionMasked呢?从上面的分析中能够看出来个因此然: getAction表示触摸动做的原始32位信息,当没有多点触控时,高8位即为0,这个时候getAction == getActionMasked。因此当咱们肯定咱们自定义的View不会使用到多点触控时,就能够直接使用getAction来表示具体的触摸动做。但若是须要使用多点触控,或者是不肯定后面会不会使用多点触控,则使用getActionMasked则是最保险的操做,因此咱们常常看到下面这两种写法:索引

int action = event.getActionMasked();
switch(action) {
  case Action_Down:
  break;
}

int action = event.getAction() & MotionEvent.ACTION_MASK;
switch(action) {
  case Action_Down:
  break;
}
复制代码

Android中是支持多点触控的,那么在高8位中是如何存储多点触控的索引信息的呢?举个例子来讲: 若是从getAction方法中返回的值是0x0000,则表示是第一个触控点的ACTION_DOWN操做。高8位是0表示第一个触控点,低8位是0表示ACTION_DOWN操做。 同理,若是返回值是0x0100,则表示第二个触控点的ACTION_DOWN操做。 也就是说,getAction返回值的低8位表示触摸动做的类型信息,而高8位表示触控点的索引信息,也就是哪个触控点的事件。事件

相关文章
相关标签/搜索