21664


Androidで画面に二本以上の指でタッチした際のMotionEventについての質問です。  
マルチタッチ時には複数のタッチをpointerIdを指定することで識別することが出来るので、以下のコードでポインタIDごとのX座標、Y座標を表示することが出来ました。

[code]

    public class MainActivity extends AppCompatActivity{
        private TextView textView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView = (TextView) findViewById(R.id.text);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            int count = event.getPointerCount();
            String text = "pointer count:" + count
                    + " x:" + event.getX()
                    + " y:" + event.getY() + "\n";
            for (int i = 0; i < count; i++) {
                try {
                    int id = 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;
        }
    }
    
[/code]

ここでタッチする指を1,2,3と増やしていくと、それぞれのポインタIDごとの座標が表示されます。  
そして3,2,1と順番に指を離していく分には想定通りに各ポインタの座標が表示されます。  
しかし3本タッチしている状態で1から離すと、まだ2本指でタッチしているにもかかわらずポインタIDが1つ分しか表示されません。  
ポインタIDを正しく検出するにはどうしたらよいでしょうか？


CC BY-SA 3.0
2016-02-02T10:58:32.640
21627
2016-02-03T10:01:38.703
9498
question
android
Androidでマルチタッチ時のポインター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からポインタインデックスに修正することで正常に動作しました。

[code]

        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";
        }
    
[/code]

特定のポインタを識別してトラッキングしたい場合、ポインタIDで識別することになります。  
しかし、ポインタIDからではポインタが示す情報にアクセスできません。  
そこでIDからインデックスを逆引きするため`findPointerIndex()`メソッドを利用します。


CC BY-SA 3.0
2016-02-03T10:01:38.703
21664
2016-02-03T10:01:38.703
9498
21627
answer