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位表示觸控點的索引信息,也就是哪個觸控點的事件。事件

相關文章
相關標籤/搜索