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 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 API MotionEvent:

    • 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_UPFLAG_CANCELED.
  • Ignoruj zdarzenia ruchu, które mają właściwości ACTION_CANCELACTION_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 obiekty MotionEvent.
  • 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: MotionEventstała, która wskazuje, że ruch kursora w górę spowodował niezamierzone zdarzenie dotknięcia. Dodano do zdarzeń ACTION_POINTER_UPACTION_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:

Umożliw aplikacji optymalne działanie na tabletach, urządzeniach składanych i urządzeniach z ChromeOS.

Masz pytania lub chcesz przekazać opinię?

Otwórz stronę z najczęstszymi pytaniami i poznaj krótkie przewodniki lub skontaktuj się z nami i powiedz nam, co o tym myślisz.