Odrzucanie dotyku dłoni na rysik

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 MotionEvent wysyłane do aplikacji. Użyj interfejsów API MotionEvent, 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ępuje FLAG_CANCELED.
    • Zdarzenia z wieloma wskaźnikami – na Androidzie 13 i nowszym sprawdź, czy występuje ACTION_POINTER_UP i FLAG_CANCELED.
  • Ignoruj zdarzenia ruchu, które mają właściwości ACTION_CANCEL i ACTION_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 obiekty MotionEvent.
  • MotionEvent#getActionMasked(): zwraca działanie powiązane ze zdarzeniem ruchu.
  • ACTION_CANCEL: stała MotionEvent, która wskazuje, że gest należy cofnąć.
  • ACTION_POINTER_UP: stała MotionEvent, która wskazuje, że wskaźnik inny niż pierwszy został podniesiony (czyli przestał dotykać ekranu urządzenia).
  • FLAG_CANCELED: stała MotionEvent, która wskazuje, że podniesienie wskaźnika spowodowało niezamierzone zdarzenie dotknięcia. Dodana do zdarzeń ACTION_POINTER_UP i ACTION_CANCEL na 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:

Włącz obsługę zoptymalizowanego środowiska użytkownika w aplikacji na tabletach, urządzeniach składanych i urządzeniach z ChromeOS.

Masz pytania lub opinie?

Otwórz stronę z najczęstszymi pytaniami i dowiedz się więcej o krótkich przewodnikach lub skontaktuj się z nami i podziel się swoimi przemyśleniami.