Gdy użytkownicy rysują, piszą lub wchodzą w interakcję z aplikacją za pomocą rysika, czasami dotykają ekranu dłonią. Zdarzenie dotknięcia może zostać zgłoszone do aplikacji, zanim system rozpozna i odrzuci je jako przypadkowe dotknięcie dłonią.
Aplikacja musi rozpoznawać i ignorować zbędne zdarzenia dotknięcia. Android 13 i nowsze 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 nowszym oraz w przypadku zdarzeń z jednym wskaźnikiem na wszystkich poziomach interfejsu API.
Zgodność wersji
W przypadku zdarzeń z wieloma wskaźnikami ustaw minSDK projektu na poziom interfejsu API 33.
Zdarzenia z jednym wskaźnikiem są obsługiwane na wszystkich poziomach interfejsu 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ó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 i nowszym sprawdź też, czy występujeFLAG_CANCELED. - Zdarzenia z wieloma wskaźnikami – na Androidzie 13 i nowszym sprawdź, czy występuje
ACTION_POINTER_UPiFLAG_CANCELED.
- Zdarzenia z jednym wskaźnikiem – sprawdź, czy występuje
Ignoruj zdarzenia ruchu, które mają właściwości
ACTION_CANCELiACTION_POINTER_UP/FLAG_CANCELED.
1. Pobierz obiekty 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. Na Androidzie 13 i nowszym sprawdź, czy występuje ACTION_POINTER_UP i 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 rozpoznaniu dotknięcia dłonią możesz cofnąć efekty gestu 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 tego, jak zachować historię, znajdziesz w ćwiczeniu z programowania 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 należy zignorować.OnTouchListener#onTouch(): odbiera obiektyMotionEvent.MotionEvent#getActionMasked(): zwraca działanie powiązane ze zdarzeniem ruchu.ACTION_CANCEL: stałaMotionEvent, która wskazuje, że gest należy cofnąć.ACTION_POINTER_UP: stałaMotionEvent, która wskazuje, że wskaźnik inny niż pierwszy został podniesiony (czyli przestał dotykać ekranu urządzenia).FLAG_CANCELED: stałaMotionEvent, która wskazuje, że podniesienie wskaźnika spowodowało niezamierzone zdarzenie dotknięcia. Dodana do zdarzeńACTION_POINTER_UPiACTION_CANCELna Androidzie 13 (poziom interfejsu API 33) i nowszym.
Zbiory zawierające ten przewodnik
Ten przewodnik jest częścią tych wybranych zbiorów krótkich przewodników, które obejmują szersze cele związane z tworzeniem aplikacji na Androida: