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 nowszych wersjach interfejsu API oraz w przypadku zdarzeń z jednym wskaźnikiem na wszystkich poziomach interfejsu API.
rozpoznawać i ignorować dotknięcia dłoni,
Android anuluje dotknięcie dłonią, wysyłając do aplikacji obiekt MotionEvent
.
Sprawdź obiekty
MotionEvent
wysyłane do aplikacji. Użyj interfejsów APIMotionEvent
, aby określić właściwości zdarzenia (działania i flagi):- Zdarzenia z jednym wskaźnikiem – 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ą
ACTION_POINTER_UP
iFLAG_CANCELED
.
- Zdarzenia z jednym wskaźnikiem – sprawdź, czy występuje
Ignoruj zdarzenia ruchu, które mają właściwości
ACTION_CANCEL
iACTION_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 znak ACTION_CANCEL
, który oznacza zdarzenie z użyciem jednego wskaźnika na wszystkich poziomach interfejsu API. Na Androidzie 13 lub nowszym sprawdź ACTION_POINTER_UP
, czy jest 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. Cofanie gestu
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 związanym z ruchem.ACTION_CANCEL
: stałaMotionEvent
wskazująca, że gest powinien zostać cofnięty.ACTION_POINTER_UP
:MotionEvent
stała, która wskazuje, że wskaźnik inny niż pierwszy został podniesiony (czyli stracił kontakt z ekranem urządzenia).FLAG_CANCELED
:MotionEvent
stała wskazująca, że wskaźnik idący w górę spowodował niezamierzone zdarzenie dotknięcia. Dodane do zdarzeńACTION_POINTER_UP
iACTION_CANCEL
na Androidzie 13 (API na poziomie 33) i nowszym.
Kolekcje, które zawierają ten przewodnik
Ten przewodnik jest częścią wyselekcjonowanych kolekcji przewodników, które obejmują szersze cele związane z programowaniem na Androida:
