複数ポインタのトラッキング
複数のポインタをトラックする
ACTION_DONW
このポインタのindexは必ず0が割り当てられるACTION_POINTER_DOWN
indexが0以外のポインタがスクリーン上で検知された場合、呼び出される。割り当てられるindexは、getActionIndex()
メソッドから取得が可能ACTION_POINTER_UP
ポインタが離れた場合、呼び出されるACTION_UP
最後のポインタがスクリーンを離れた場合、呼び出される
index
とID
を通して、個々のポインターをトラックする
- 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(指の場合は、右側を向いている)で表される。