Mam problem z moją aplikacją na Androida, która wymaga zdarzeń śledzenia dotyku (śledzenie kiedy/gdzie palec schodzi, porusza się, up itd.). Muszę używać funkcji event.getX()
i event.getY()
, aby uzyskać współrzędne bieżącego dotyku.Android MotionEvent Wskaźnik indeksu Confusion
Więc z czego się nauczyłem w ciągu ostatnich kilku miesięcy:
MotionEvent.ACTION_DOWN
śledzi pierwszy lądowaćMotionEvent.ACTION_POINTER_DOWN
utwory późniejsze dotykaMotionEvent.ACTION_UP
śledzi ostatnie podciąćMotionEvent.ACTION_POINTER_UP
utwory dotykowe, które się podnosząMotionEvent.ACTION_MOVE
śledzi każdy ruch dotykowy
W mojej aplikacji napotykam na znaczący problem, gdy mój pierwszy dotyk idzie w górę. Powiedzmy, że mam pięć palców dotykających mojego urządzenia (możemy wywołać te Dotyk 0, 1, 2, 3, 4). Teraz, kiedy podniosłem Touch 0, MotionEvent.ACTION_POINTER_UP
to akcja, którą otrzymuję. Całkowicie zrozumiałe; Rozumiem. Jednak teraz te dwie rzeczy się wydarzy:
- Przenieś nic z Touches 1-4: Otrzymaj
IllegalArgumentException
mówi mi pointerIndex jest poza zakresem - Podnieś coś z Touches 1-4: Spits powrotem informacje dla inna touch (
event.getX()
ievent.getY()
da mi różne informacje palec)
Jestem trochę na końcu mojego dowcip o tym, jak poprawnie zapisuje te informacje. Jakieś wskazówki dotyczące prawidłowego śledzenia informacji lub kompensowania wskaźników dotykowych?
Podałem ogólny układ mojego kodu, ale czuję, że nie robię nic nadzwyczajnego (i jestem pewien, że jest on bliski przykładowemu kodowi na przykładach Androida?):
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getActionMasked();
int ptr_idx = event.getPointerId(event.getActionIndex());
try {
switch (action) {
case MotionEvent.ACTION_MOVE:
handleActionPointerMove(event);
break;
// Order of touch downs doesn't matter to us
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
handleActionPointerDown(event, ptr_idx);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
handleActionPointerUp(event, ptr_idx);
break;
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
}
return true;
}
}
public void handleActionPointerMove(MotionEvent event) {
for (int i = 0; i < event.getPointerCount(); i++) {
handleInformation(event.getX(i), event.getY(i));
}
}
public void handleActionPointerDown(MotionEvent event, int ptr_idx) {
handleInformation(event.getX(ptr_idx), event.getY(ptr_idx));
}
public void handleActionPointerUp(MotionEvent event, int ptr_idx) {
handleInformation(event.getX(ptr_idx), event.getY(ptr_idx));
}
public void handleInformation(int x, int y) {
// Figures out what x+y means to us (are we in a certain box within the app? outside in clear zones? etc
}