複数ポインタのトラッキング

複数のポインタをトラックする

  • ACTION_DONW このポインタのindexは必ず0が割り当てられる
  • ACTION_POINTER_DOWN indexが0以外のポインタがスクリーン上で検知された場合、呼び出される。割り当てられるindexは、getActionIndex()メソッドから取得が可能
  • ACTION_POINTER_UP ポインタが離れた場合、呼び出される
  • ACTION_UP 最後のポインタがスクリーンを離れた場合、呼び出される

indexIDを通して、個々のポインターをトラックする

  • indexポインター情報は配列としてストアされている。MotionEventで用意されている多くのメソッドは、このindex値を引き受ける
  • ID 各ポインタは、タッチイベントを通じて変わらないIDが割り当てられている

格納されるポインタの順序(index)は未定義であるが、IDは変わらない。 該当するポインタのindexが取得したい場合は、findPointerIndex(ID)メソッドを使うことができる。

// ポインタIDの保存。indexが0のポインタは、ACTION_DOWNイベントを発生させたポインタであることが保証されている
mActivePointerId = event.getPointerId(0)

val (x: Float, y: Float) = event.findPointerIndex(mActionPointerId).let { 
    event.getX(pointerIndex) to event.getY(pointerIndex)
}

MotionEvent その他のパラメーター

history情報

前回のタッチポイントを取得することができる

val prevX = event.getHistoricalX(0, event.historySize - 1)
  • event.historySize ACTION_MOVEの時のみ有効。それ以外のアクション時は常に0が返される
  • getHistoricalX(pointerIndex, position) 過去のタッチイベント情報の取得

MotionEvent.action vs MotionEvent.actionMasked

両方ともint値が返されるが、MotionEvent.actionの方には、ID値も添付される。

単純にアクションの判定を行う場合は、MotionEvent.actionMaskedの方を使用する。

when(event.actionMasked) {
    MotionEvent.ACTION_DOWN -> { // このポインタのindexは必ず0が割り当てられる
    MotionEvent.ACTION_POINTER_DOWN -> {
    MotionEvent.ACTION_MOVE -> { ..
    MotionEvent.ACTION_POINTER_UP -> { ..
    MotionEvent.ACTION_UP -> { ..
}

タッチポイントの領域情報

タッチポイントの領域は、楕円で取得することができるので、その向き(orientation)を判定することができる

  • getToolMajor(pointerIndex) 楕円の長い方の長さ(float)
  • getToolMinor(pointerIndex) 楕円の短い方の長さ(float)
  • getOrientation(pointerIndex) 時計回りに楕円の向きを表す。0 radiansは、12時。-PI/2(指の場合は左側を向いている)からPI/2(指の場合は、右側を向いている)で表される。

参照

https://developer.android.com/training/gestures/multi

https://stackoverflow.com/questions/17384983/in-android-what-is-the-difference-between-getaction-and-getactionmasked-in