Uno stilo può essere uno strumento eccezionalmente produttivo e creativo. Tuttavia, 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 touch può essere segnalato alla tua app prima che il sistema lo riconosca e lo ignori come tocco accidentale con il palmo.
Best practice
La tua app deve identificare gli eventi touch estranei e ignorarli. In Jetpack
Compose, puoi accedere all'oggetto Android sottostante MotionEvent da un oggetto
PointerEvent. Controlla MotionEvent per ACTION_CANCEL, che
indica che un gesto deve essere interrotto e potrebbe essere necessario annullarlo. Su
Android 13 (livello API 33) e versioni successive, controlla il FLAG_CANCELED flag
negli eventi ACTION_CANCEL e ACTION_POINTER_UP, che fornisce un
segnale forte che il tocco non è intenzionale, ad esempio un tocco con il palmo.
Ingredienti
Modifier.pointerInput(): il modificatore Compose utilizzato per elaborare l'input del puntatore.PointerEvent: rappresenta un evento del puntatore in Compose, che contiene una o più modifiche.PointerEvent.motionEvent: proprietà di estensione che fornisce l'accesso all'oggettoMotionEventAndroid sottostante (con valori nulli).MotionEvent: rappresenta gli eventi di tocco e movimento. Contiene le informazioni necessarie per determinare se un evento deve essere ignorato.ACTION_CANCEL: costanteMotionEventche indica che un gesto è stato annullato; il gesto deve essere interrotto e potrebbe essere necessario annullarlo.ACTION_POINTER_UP: costanteMotionEventche indica che un puntatore diverso dal primo è stato sollevato (ovvero ha rinunciato al contatto con lo schermo del dispositivo).FLAG_CANCELED: costanteMotionEventche indica che il puntatore che si alza ha causato un evento touch non intenzionale. Aggiunto agli eventiACTION_POINTER_UPeACTION_CANCELsu Android 13 (livello API 33) e versioni successive.
Passaggi
Esamina gli oggetti MotionEvent inviati alla tua app. Utilizza le API MotionEvent per determinare le caratteristiche dell'evento:
- Eventi con un solo puntatore : controlla
ACTION_CANCEL, che indica che il gesto deve essere interrotto. Su Android 13 e versioni successive, controlla ancheFLAG_CANCELEDper verificare che il tocco non sia intenzionale. - Eventi con più puntatori : su Android 13 e versioni successive, controlla
ACTION_POINTER_UPeFLAG_CANCELEDper identificare i tocchi non intenzionali.
Rispondi a questi eventi interrompendo il gesto e annullando eventuali modifiche temporanee.
1. Acquisisci oggetti di eventi di movimento
Utilizza Modifier.pointerInput per elaborare l'input del puntatore su un componibile. Nell'ambito dell'input del
puntatore, utilizza awaitPointerEventScope e awaitPointerEvent per
ricevere gli eventi e recuperare l'oggetto MotionEvent Android sottostante utilizzando la proprietà
motionEvent:
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent if (motionEvent != null) { // Process motion event. } } } } )
2. Determina l'azione e i flag dell'evento
Controlla MotionEvent per ACTION_CANCEL, che indica un evento con un solo puntatore su tutti i livelli API. Su Android 13 e versioni successive, controlla ACTION_POINTER_UP per FLAG_CANCELED:
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent ?: continue when (motionEvent.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 && (motionEvent.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED ) { // Process canceled multi-pointer motion event for Android 13 and higher. } } } } } } )
3. Annulla il gesto
Una volta identificato un tocco con il palmo, puoi annullare gli effetti del gesto sullo schermo.
La tua app deve conservare una cronologia delle azioni dell'utente in modo che gli input non intenzionali, come i tocchi con il palmo, possano essere annullati. Per un esempio, consulta Implementare un'app di disegno di base nel codelab Migliorare il supporto dello stilo in un'app Android.
Risultati
La tua app ora può identificare e rifiutare i tocchi con il palmo per gli eventi con più puntatori su Android 13 e livelli API successivi e per gli eventi con un solo puntatore su tutti i livelli API.
Risorse aggiuntive
Per ulteriori informazioni, consulta le seguenti risorse:
- Funzionalità e API di Android 13: miglioramento del rifiuto del palmo
- Guide per gli sviluppatori
- Funzionalità avanzate dello stilo
- Sezione Rifiuto del palmo di Compatibilità dell'input su schermi di grandi dimensioni
- Codelab: migliorare il supporto dello stilo in un'app Android