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 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 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 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ą 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 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 obiekty MotionEvent.
  • MotionEvent#getActionMasked(): zwraca działanie powiązane z wydarzeniem związanym z ruchem.
  • 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 wskaźnik idący w górę spowodował 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 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.