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 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 MotionEvent wysyłane do aplikacji. Użyj interfejsów MotionEvent API, 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 symbol FLAG_CANCELED.
    • Wydarzenia związane z wieloma wskaźnikami – na Androidzie 13 lub nowszym sprawdź, czy występują wartości ACTION_POINTER_UPFLAG_CANCELED.
  • Ignoruj zdarzenia ruchu, które mają właściwości ACTION_CANCELACTION_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 obiekty MotionEvent.
  • MotionEvent#getActionMasked(): zwraca działanie powiązane z wydarzeniem ruchu.
  • ACTION_CANCEL: stała MotionEvent 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 przesunięcie wskaźnika w górę spowodowało niezamierzone zdarzenie dotknięcia. Dodane do zdarzeń ACTION_POINTER_UPACTION_CANCEL na 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:

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

Masz pytania lub chcesz podzielić się opinią?

Odwiedź stronę z najczęstszymi pytaniami, aby zapoznać się z przewodnikami, lub skontaktuj się z nami i podziel się swoimi przemyśleniami.