Мультитач Android получает неправильные указатели и / или значения XY - PullRequest
4 голосов
/ 06 июля 2011

У меня проблема с получением значений X и Y из событий мультитача. Ниже приведен код, показывающий, как получить значение при возникновении событий POINTER_DOWN и POINTER_UP, однако значения X и Y, похоже, перепутаны / дублированы в событии POINTER_UP.

@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 

Здесь вы можете видеть, что местоположение XY для идентификатора 1 неверно, вместо этого отображаются значения идентификатора 2.

Обратите внимание, что никакие события ACTION_CANCEL не вызываются. Я полагаю, что-то не так с моим использованием масок / ANDing. Любая помощь будет высоко ценится!

1 Ответ

4 голосов
/ 06 июля 2011

Очевидно, что event.getX и event.getY должны получать указатель index , а не указатель id .

...