Refuser les pressions de la paume de la main avec le stylet

Lorsque les utilisateurs dessinent, écrivent ou interagissent avec une application à l'aide d'un stylet, ils touchent parfois l'écran avec la paume de leur main. L'événement tactile peut être signalé à votre application avant que le système ne le reconnaisse et l'ignore comme une pression involontaire de la paume de la main.

Identifier et ignorer les gestes avec la paume de la main

Votre application doit identifier les événements tactiles involontaires et les ignorer. Android annule une pression de la paume de la main en envoyant un objet MotionEvent à votre application.

  • Examinez les objets MotionEvent envoyés à votre application. Utilisez les API MotionEvent pour déterminer les propriétés des événements (actions et indicateurs):

    • Événements à pointeur unique : recherchez ACTION_CANCEL. Sur Android 13 et versions ultérieures, recherchez également FLAG_CANCELED.
    • Événements à pointeurs multiples : sur Android 13 et versions ultérieures, recherchez ACTION_POINTER_UP et FLAG_CANCELED.
  • Ignorez les événements de mouvement qui comportent les propriétés ACTION_CANCEL et ACTION_POINTER_UP/FLAG_CANCELED.

1. Acquérir des objets d'événement de mouvement

Ajoutez un OnTouchListener à votre application:

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. Déterminer l'action et les indicateurs d'événement

Recherchez ACTION_CANCEL, qui indique un événement à pointeur unique à tous les niveaux d'API. Sur Android 13 ou version ultérieure, vérifiez ACTION_POINTER_UP pour 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. Annuler le geste

Une fois que vous avez identifié une pression de la paume de la main, vous pouvez annuler les effets à l'écran du geste.

Votre application doit conserver un historique des actions de l'utilisateur pour que les entrées involontaires (comme les pressions avec la paume de la main) puissent être annulées. Pour voir un exemple, consultez Implémenter une application de dessin de base dans l'atelier de programmation Améliorer la prise en charge des stylets dans une application Android.

Points essentiels

  • MotionEvent : représente les événements tactiles et de mouvement. Contient les informations nécessaires pour déterminer si un événement doit être ignoré.
  • OnTouchListener#onTouch() : reçoit des objets MotionEvent.
  • MotionEvent#getActionMasked(): renvoie l'action associée à un événement de mouvement.
  • ACTION_CANCEL: constante MotionEvent indiquant qu'un geste doit être annulé.
  • ACTION_POINTER_UP: constante MotionEvent indiquant qu'un autre pointeur que le premier a augmenté (c'est-à-dire qu'il a abandonné le contact avec l'écran de l'appareil).
  • FLAG_CANCELED: constante MotionEvent indiquant que le pointeur a provoqué un événement tactile non intentionnel. Ajout aux événements ACTION_POINTER_UP et ACTION_CANCEL sur Android 13 (niveau d'API 33) ou version ultérieure.

Résultats

Votre application peut désormais identifier et refuser les gestes de la paume de la main pour les événements à plusieurs pointeurs sur Android 13 ou version ultérieure, et pour les événements à pointeur unique à tous les niveaux d'API.

Collections contenant ce guide

Ce guide fait partie de ces collections de guides rapides sélectionnées qui couvrent des objectifs de développement Android plus larges:

Assurez-vous que votre application propose une expérience utilisateur optimisée sur les tablettes, les appareils pliables et les appareils ChromeOS.

Vous avez des questions ou des commentaires ?

Consultez notre page des questions fréquentes et découvrez les guides rapides, ou contactez-nous pour nous faire part de vos commentaires.