Gdy użytkownicy rysują, piszą lub wchodzą w interakcję z aplikacją za pomocą rysika, czasami dotykają ekranu dłonią. Zdarzenie dotyku może zostać zgłoszone do aplikacji, zanim system rozpozna i odrzuci je jako przypadkowe dotknięcie dłonią.
Aplikacja musi rozpoznawać niepotrzebne zdarzenia dotknięcia i je ignorować. Android 13 i wyższe poziomy interfejsu API wskazują dotknięcia dłonią inaczej niż wszystkie inne poziomy interfejsu API.
Wyniki
Aplikacja może rozpoznawać i odrzucać dotknięcia dłoni w przypadku zdarzeń z wieloma wskaźnikami na Androidzie 13 i na wyższych poziomach interfejsu API oraz w przypadku zdarzeń z jednym wskaźnikiem na wszystkich poziomach interfejsu API.
Zgodność wersji
Ustaw minSDK projektu na poziom API 33 w przypadku zdarzeń wielopunktowych.
Zdarzenia z jednym wskaźnikiem są obsługiwane na poziomach API.
Zależności
Brak.
rozpoznawanie i ignorowanie dotknięć dłonią,
Android anuluje dotknięcie dłonią, wysyłając do aplikacji obiekt MotionEvent.
Sprawdź obiekty
MotionEventwysyłane do aplikacji. Użyj interfejsówMotionEventAPI, aby określić właściwości zdarzenia (działania i flagi):- Zdarzenia z użyciem jednego wskaźnika – sprawdź, czy występuje
ACTION_CANCEL. Na Androidzie 13 lub nowszym sprawdź też, czy jest widoczny symbolFLAG_CANCELED. - Wydarzenia związane z wieloma wskaźnikami – na Androidzie 13 lub nowszym sprawdź, czy występują wartości
ACTION_POINTER_UPiFLAG_CANCELED.
- Zdarzenia z użyciem jednego wskaźnika – sprawdź, czy występuje
Ignoruj zdarzenia ruchu, które mają właściwości
ACTION_CANCELiACTION_POINTER_UP/FLAG_CANCELED.
1. Pozyskiwanie obiektów zdarzeń ruchu
Dodaj do aplikacji OnTouchListener:
Kotlin
val myView = findViewById<View>(R.id.myView).apply {
setOnTouchListener { view, event ->
// Process motion event.
}
}
Java
View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
// Process motion event.
});
2. Określanie działania i flag zdarzenia
Sprawdź, czy występuje ACTION_CANCEL, co oznacza zdarzenie z jednym wskaźnikiem na wszystkich poziomach interfejsu API. Na Androidzie 13 lub nowszym sprawdź ACTION_POINTER_UP, czy FLAG_CANCELED..
Kotlin
val myView = findViewById<View>(R.id.myView).apply {
setOnTouchListener { view, event ->
when (event.actionMasked) {
MotionEvent.ACTION_CANCEL -> {
//Process canceled single-pointer motion event for all SDK versions.
}
MotionEvent.ACTION_POINTER_UP -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
(event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
//Process canceled multi-pointer motion event for Android 13 and higher.
}
}
}
true
}
}
Java
View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_CANCEL:
// Process canceled single-pointer motion event for all SDK versions.
case MotionEvent.ACTION_UP:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
(event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
//Process canceled multi-pointer motion event for Android 13 and higher.
}
}
return true;
});
3. Cofnij gest
Po wykryciu dotknięcia dłonią możesz cofnąć efekty gestu wyświetlane na ekranie.
Aplikacja musi przechowywać historię działań użytkownika, aby można było cofnąć niezamierzone dane wejściowe, takie jak dotknięcia dłonią. Przykład utrzymywania historii znajdziesz w sekcji Implement a basic drawing app (Wdrażanie podstawowej aplikacji do rysowania) w ćwiczeniach z programowania Enhance stylus support in an Android app (Ulepszanie obsługi rysika w aplikacji na Androida).
Najważniejsze punkty
MotionEvent: reprezentuje zdarzenia dotknięcia i ruchu. Zawiera informacje niezbędne do określenia, czy zdarzenie powinno zostać zignorowane.OnTouchListener#onTouch(): odbiera obiektyMotionEvent.MotionEvent#getActionMasked(): zwraca działanie powiązane z wydarzeniem ruchu.ACTION_CANCEL: stałaMotionEventwskazująca, że gest powinien zostać cofnięty.ACTION_POINTER_UP:MotionEventstała, która wskazuje, że wskaźnik inny niż pierwszy został podniesiony (czyli stracił kontakt z ekranem urządzenia).FLAG_CANCELED:MotionEventstała wskazująca, że przesunięcie wskaźnika w górę spowodowało niezamierzone zdarzenie dotknięcia. Dodane do zdarzeńACTION_POINTER_UPiACTION_CANCELna Androidzie 13 (API na poziomie 33) i nowszym.
Kolekcje, które zawierają ten przewodnik
Ten przewodnik jest częścią wyselekcjonowanych kolekcji krótkich przewodników, które obejmują szersze cele związane z programowaniem na Androida: