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 je i odrzuci jako przypadkowe dotknięcie dłonią.
Wykrywanie i ignorowanie dotyku dłoni
Aplikacja musi wykrywać nieistotne zdarzenia dotyku i je ignorować. Android anuluje dotknięcie dłonią, wysyłając do aplikacji obiekt MotionEvent
.
Sprawdź obiekty
MotionEvent
wysłane do Twojej aplikacji. Aby określić właściwości zdarzenia (czynności i flagi), użyj interfejsów APIMotionEvent
:- Zdarzenia z pojedynczym wskaźnikiem – sprawdź, czy występują
ACTION_CANCEL
. Na Androidzie 13 lub nowszym sprawdź teżFLAG_CANCELED
. - Zdarzenia z wieloma wskaźnikami – na Androidzie 13 lub nowszym sprawdź, czy występują zdarzenia
ACTION_POINTER_UP
iFLAG_CANCELED
.
- Zdarzenia z pojedynczym wskaźnikiem – sprawdź, czy występują
Ignoruj zdarzenia ruchu, które mają właściwości
ACTION_CANCEL
iACTION_POINTER_UP
/FLAG_CANCELED
.
1. Pobieranie 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śl działanie i flagi zdarzenia
Sprawdź, czy występuje ACTION_CANCEL
, co oznacza zdarzenie z jednym wskaźnikiem na wszystkich poziomach interfejsu API. W Androidzie 13 lub nowszym sprawdź, czy ACTION_POINTER_UP
to 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 zidentyfikowaniu dotknięcia dłonią możesz cofnąć efekty tego gestu na ekranie.
Aplikacja musi przechowywać historię działań użytkownika, aby można było cofnąć niezamierzone działania, takie jak dotknięcia palcem. Przykład sposobu utrzymywania historii znajdziesz w ćwiczeniach z programowania poświęconych wdrażaniu podstawowej aplikacji do rysowania w ćwiczeniach z programowania ulepsz obsługę rysika w aplikacji na Androida.
Najważniejsze punkty
MotionEvent
: oznacza zdarzenia dotyku i ruchu. Zawiera informacje niezbędne do określenia, czy zdarzenie powinno zostać pominięte.OnTouchListener#onTouch()
: odbiera obiektyMotionEvent
.MotionEvent#getActionMasked()
: zwraca działanie powiązane z wydarzeniem ruchu.ACTION_CANCEL
:MotionEvent
stała, która wskazuje, że gest powinien zostać cofnięty.ACTION_POINTER_UP
:MotionEvent
stała wskazująca, że wskaźnik inny niż pierwszy został podniesiony (czyli stracił kontakt z ekranem urządzenia).FLAG_CANCELED
:MotionEvent
stała, która wskazuje, że ruch kursora w górę spowodował niezamierzone zdarzenie dotknięcia. Dodano do zdarzeńACTION_POINTER_UP
iACTION_CANCEL
w przypadku Androida 13 (poziom API 33) lub nowszego.
Wyniki
Twoja aplikacja może teraz rozpoznawać i odrzucać dotknięcia dłonią w przypadku zdarzeń z wieloma punktami dotykowymi na Androidzie 13 i wyższych poziomach interfejsu API oraz w przypadku zdarzeń z jednym punktem dotykowym na wszystkich poziomach interfejsu API.
Kolekcje zawierające ten przewodnik
Ten przewodnik należy do tych kolekcji krótkich przewodników, które obejmują szersze zagadnienia związane z tworzeniem aplikacji na Androida:
![](https://developer.android.google.cn/static/images/quick-guides/collection-illustration.png?hl=pl)