4

マルチタッチ イベントから X 値と Y 値を取得する際に問題があります。以下は、POINTER_DOWN および POINTER_UP イベントが発生したときに値を取得する方法を示すコードですが、POINTER_UP イベントで X 値と Y 値が混同/重複しているようです。

@Override
public void onTouchEvent(MotionEvent event) {

int id, pointerIndex;

switch (event.getAction() & MotionEvent.ACTION_MASK) {

  case MotionEvent.ACTION_POINTER_DOWN:

    pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) 
    >> MotionEvent.ACTION_POINTER_ID_SHIFT;
    id = event.getPointerId(pointerIndex);

    Log.e("Down", ""+id+" "+event.getX(id)+" "+event.getY(id));

    break;

case MotionEvent.ACTION_POINTER_UP:

    pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) 
    >> MotionEvent.ACTION_POINTER_ID_SHIFT;
    id = event.getPointerId(pointerIndex);

    Log.e("UP", ""+id+" "+event.getX(id)+" "+event.getY(id));

    break;
}

super.onTouchEvent(event);

}

これにより、通常、次の lolcat が発生します。

E/DOWN    (25070): 0 279.60922 279.17447
E/DOWN    (25070): 1 513.20044 520.3252
E/DOWN    (25070): 2 422.6651 358.72418

E/UP      (25070): 0 279.60922 279.17447
E/UP      (25070): 1 422.6651 358.72418 
E/UP      (25070): 2 422.6651 358.72418 

ここでは、ID 1 の XY 位置が間違っており、代わりに ID 2 の値が表示されていることがわかります。

ACTION_CANCEL イベントは呼び出されないことに注意してください。MASKS/ANDing の使用に何か問題があると思います。どんな助けでも大歓迎です!

4

1 に答える 1

4

どうやら、event.getX と event.getYには、ポインターidではなく、ポインターindexを渡す必要があります。

于 2011-07-06T05:27:22.687 に答える