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 della mano. L'evento tocco potrebbe essere segnalato alla tua app prima che il sistema lo riconosca e lo ignori come tocco accidentale del palmo.

La tua app deve identificare gli eventi tocco estranei e ignorarli. Android 13 e i livelli API superiori indicano i tocchi del palmo in modo diverso rispetto a tutti gli altri livelli API.

Risultati

La tua app è in grado di identificare e rifiutare i tocchi del palmo per gli eventi multipuntatore su Android 13 e livelli API superiori e per gli eventi a puntatore singolo su tutti i livelli API.

Identificare e ignorare i tocchi del palmo

Android annulla il tocco del 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 a un solo puntatore: controlla la presenza di ACTION_CANCEL. Su Android 13 e versioni successive, controlla anche FLAG_CANCELED.
    • Eventi multi-pointer: su Android 13 e versioni successive, controlla ACTION_POINTER_UP e FLAG_CANCELED.
  • Ignora gli eventi di movimento con le proprietà ACTION_CANCEL e ACTION_POINTER_UP/FLAG_CANCELED.

1. Acquisire oggetti di eventi di movimento

Per aggiungere 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

Controlla ACTION_CANCEL, che indica un evento a un solo puntatore 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.

La tua app deve conservare una cronologia delle azioni dell'utente in modo che gli input involontari, come i tocchi con il palmo, possano essere annullati. Per un esempio di come mantenere la cronologia, consulta Implementare un'app di disegno di base nel codelab Migliorare 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 puntatore diverso dal primo è stato sollevato (ovvero ha perso il contatto con lo schermo del dispositivo).
  • FLAG_CANCELED: costante MotionEvent che indica che il puntatore che sale ha causato un evento tocco involontario. Aggiunto agli eventi ACTION_POINTER_UP e ACTION_CANCEL su Android 13 (livello API 33) e versioni successive.

Raccolte che contengono questa guida

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

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

Hai domande o feedback

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