Rifiutare i tocchi del palmo con lo stilo

Quando gli utenti disegnano, scrivono o interagiscono con un'app utilizzando uno stilo, a volte toccano lo schermo con il palmo delle mani. L'evento tocco potrebbe essere segnalato alla tua app prima che il sistema lo riconosca e lo ignori come tocco accidentale con il palmo.

Identificare e ignorare i tocchi con il palmo

L'app deve identificare gli eventi tocco estranei e ignorarli. Android annulla un tocco con il palmo inviando un oggetto MotionEvent alla tua app.

  • Esamina gli oggetti MotionEvent inviati alla tua app. Utilizza le API MotionEvent per determinare le proprietà degli eventi (azioni e flag):

    • Eventi con un solo cursore: controlla se è presente ACTION_CANCEL. Su Android 13 e versioni successive, controlla anche la presenza di FLAG_CANCELED.
    • Eventi con più cursori: su Android 13 e versioni successive, controlla la presenza di ACTION_POINTER_UP e FLAG_CANCELED.
  • Ignora gli eventi di movimento con le proprietà ACTION_CANCEL e ACTION_POINTER_UP/FLAG_CANCELED.

1. Acquisisci oggetti evento di movimento

Aggiungi un OnTouchListener alla tua app:

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. Determina l'azione e i flag dell'evento

Cerca ACTION_CANCEL, che indica un evento con un solo cursore su tutti i livelli dell'API. Su Android 13 e versioni successive, controlla ACTION_POINTER_UP per 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. Annullare il gesto

Dopo aver identificato un tocco con il palmo, puoi annullare gli effetti sullo schermo del gesto.

L'app deve conservare una cronologia delle azioni dell'utente in modo che gli input involontari, come il tocco con il palmo, possano essere annullati. Per un esempio di come gestire la cronologia, consulta Implementa un'app di disegno di base nel codelab Migliora il supporto dello stilo in un'app Android.

Punti chiave

  • MotionEvent: rappresenta gli eventi di tocco e movimento. Contiene le informazioni necessarie per determinare se un evento deve essere ignorato.
  • OnTouchListener#onTouch(): riceve oggetti MotionEvent.
  • MotionEvent#getActionMasked(): restituisce l'azione associata a un evento di movimento.
  • ACTION_CANCEL: costante MotionEvent che indica che un gesto deve essere annullato.
  • ACTION_POINTER_UP: costante MotionEvent che indica che un cursore diverso dal primo è salito (ovvero ha interrotto il contatto con lo schermo del dispositivo).
  • FLAG_CANCELED: costante MotionEvent che indica che il movimento del cursore verso l'alto ha causato un evento tocco involontario. Aggiunto agli eventi ACTION_POINTER_UP e ACTION_CANCEL su Android 13 (livello API 33) e versioni successive.

Risultati

Ora la tua app può identificare e rifiutare i tocchi con il palmo per gli eventi con più puntini su Android 13 e livelli API superiori e per gli eventi con un solo puntone su tutti i livelli API.

Raccolte che contengono questa guida

Questa guida fa parte di queste raccolte di guide rapide selezionate che coprono obiettivi di sviluppo Android più ampi:

Consenti alla tua app di supportare un'esperienza utente ottimizzata su tablet, dispositivi pieghevoli e ChromeOS.

Domande o feedback

Visita la nostra pagina delle domande frequenti e scopri le guide rapide o contattaci per farci sapere cosa ne pensi.