質問: event.getPointerId(i); text += " pointer index:" + i + " pointer id:" + id + " x:" + event.getX(id) + " y:" + event.getY(id) + "\n"; }catch (IllegalArgumentException e){ e.printStackTrace(); text += " - pointer index:" + i + " out of range -\n"; } } textView.setText(text); return true; } } ``` ここでタッチする指を1,2,3と増やしていくと、それぞれのポインタIDごとの座標が表示されます。 そして3,2,1と順番に指を離していく分には想定通りに各ポインタの座標が表示されます。 しかし3本タッチしている状態で1から離すと、まだ2本指でタッチしているにもかかわらずポインタIDが1つ分しか表示されません。 ポインタIDを正しく検出するにはどうしたらよいでしょうか?
回答: ポインタはIDで識別されますが、各ポインタが示す情報にアクセスするために指定するのはポインタインデックスになります。 ポインタインデックスは常に0から始まり、他のポインタが増減する度に再割当てされます。 一方でポインタを識別するIDは、画面に触れている限り値が変わりません。 例:人差し指→中指→薬指の順番でタッチした場合 インデックス0 ID0 人差し指 インデックス1 ID1 中指 インデックス2 ID2 薬指 ↓この状態で人差し指を離す インデックス0 ID1 中指 インデックス1 ID2 薬指 ↓人差し指でタッチする インデックス0 ID0 人差し指 インデックス1 ID1 中指 インデックス2 ID2 薬指 ポインタIDとポインタインデックスの値は、指を押した順番と反対に離す分には一致したままであるため、質問のコードで動いていました。 しかし押した順番とは異なる離し方をすると、ポインタIDとインデックスの値にズレが生じます。 質問のコードではIDを使ってポインタの座標を取得していようとしたため、指を離す順番によっては座標が表示されていませんでした。 getXに渡す引数をポインタIDからポインタインデックスに修正することで正常に動作しました。 ``` for (int i = 0; i < count; i++) { int id = event.getPointerId(i); text += " pointer index:" + i + " pointer id:" + id + " x:" + event.getX(i) + " y:" + event.getY(i) + "\n"; } ``` 特定のポインタを識別してトラッキングしたい場合、ポインタIDで識別することになります。 しかし、ポインタIDからではポインタが示す情報にアクセスできません。 そこでIDからインデックスを逆引きするため`findPointerIndex()`メソッドを利用します。