Rechaza los toques de la palma con la pluma stylus

Cuando los usuarios dibujan, escriben o interactúan con una app usando una pluma stylus, a veces tocan la pantalla con la palma de las manos. El evento táctil se puede informar a tu app antes de que el sistema reconozca el evento y lo descarte como un toque de la palma accidental.

Tu app debe identificar eventos táctiles extraños e ignorarlos. Android 13 y los niveles de API superiores indican los toques con la palma de manera diferente a todos los demás niveles de API.

Resultados

Tu app puede identificar y rechazar los toques de la palma de la mano para eventos de varios punteros en Android 13 y niveles posteriores de API, y para eventos de un solo puntero en todos los niveles de API.

Identifica y omite los toques con la palma

Para cancelar un toque de la palma, Android envía un objeto MotionEvent a tu app.

  • Examina los objetos MotionEvent que se enviaron a tu app. Usa las APIs de MotionEvent para determinar las propiedades del evento (acciones y marcas):

    • Eventos de un solo puntero: Comprueba si se cumple ACTION_CANCEL. En Android 13 y versiones posteriores, también comprueba si se cumple FLAG_CANCELED.
    • Eventos de varios punteros: En Android 13 y versiones posteriores, comprueba si se cumplen los eventos ACTION_POINTER_UP y FLAG_CANCELED.
  • Ignora los eventos de movimiento que tienen las propiedades ACTION_CANCEL y ACTION_POINTER_UP/FLAG_CANCELED.

1. Adquiere objetos de eventos de movimiento

Agrega un OnTouchListener a tu 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 la acción y las marcas de los eventos

Busca ACTION_CANCEL, que indica un evento de un solo puntero en todos los niveles de API. En Android 13 y versiones posteriores, busca el evento FLAG_CANCELED. en ACTION_POINTER_UP

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. Deshace el gesto

Una vez que hayas identificado el toque de la palma, puedes deshacer los efectos en pantalla del gesto.

Tu app debe mantener un historial de acciones del usuario para deshacer las entradas no deseadas, como los toques de la palma. Para ver un ejemplo de cómo mantener el historial, consulta Cómo implementar una app de dibujo básica en el codelab Cómo mejorar la compatibilidad con la pluma stylus en una app para Android.

Puntos clave

  • MotionEvent: Representa eventos táctiles y de movimiento. Contiene la información necesaria para determinar si se debe ignorar un evento.
  • OnTouchListener#onTouch(): Recibe objetos MotionEvent.
  • MotionEvent#getActionMasked(): Muestra la acción asociada con un evento de movimiento.
  • ACTION_CANCEL: Es una constante MotionEvent que indica que se debe deshacer un gesto.
  • ACTION_POINTER_UP: Es una constante MotionEvent que indica que un puntero distinto al primero se fue hacia arriba (es decir, renunció al contacto con la pantalla del dispositivo).
  • FLAG_CANCELED: Es una constante MotionEvent que indica que el puntero hacia arriba causó un evento táctil no intencional. Se agregó a los eventos ACTION_POINTER_UP y ACTION_CANCEL en Android 13 (nivel de API 33) y versiones posteriores.

Colecciones que contienen esta guía

Esta guía forma parte de las colecciones seleccionadas de Guías rápidas que abarcan objetivos más amplios de desarrollo para Android:

Habilita tu app para que admita una experiencia del usuario optimizada en tablets, dispositivos plegables y dispositivos ChromeOS.

Preguntas o comentarios

Visita nuestra página de preguntas frecuentes y consulta las guías rápidas, o bien comunícate con nosotros para contarnos tu opinión.