Dispositivos táctiles

Android admite una variedad de pantallas táctiles y paneles táctiles, incluidas las tablets digitalizadoras basadas en plumas stylus.

Las pantallas táctiles son dispositivos táctiles que se asocian con una pantalla de modo que el usuario tenga la impresión de manipular directamente los elementos en la pantalla.

Los paneles táctiles son dispositivos táctiles que no están asociados con una pantalla, como una tablet digitalizadora. Los paneles táctiles suelen usarse para señalar o para el posicionamiento indirecto absoluto o el control basado en gestos de una interfaz de usuario.

Los dispositivos táctiles pueden tener botones cuyas funciones son similares a las de los botones del mouse.

En ocasiones, los dispositivos táctiles se pueden manipular con una variedad de herramientas diferentes, como los dedos o una pluma stylus, según la tecnología de sensor táctil subyacente.

A veces, los dispositivos táctiles se usan para implementar teclas virtuales. Por ejemplo, en algunos dispositivos Android, el área del sensor de la pantalla táctil se extiende más allá del borde de la pantalla y cumple una doble función como parte de un teclado táctil.

Debido a la gran variedad de dispositivos táctiles, Android se basa en una gran cantidad de propiedades de configuración para describir las características y el comportamiento deseado de cada dispositivo.

Clasificación de dispositivos táctiles

Un dispositivo de entrada se clasifica como multitáctil si se cumplen las siguientes condiciones:

  • El dispositivo de entrada informa la presencia de los ejes absolutos ABS_MT_POSITION_X y ABS_MT_POSITION_Y.
  • El dispositivo de entrada no tiene ningún botón de control de juegos. Esta condición resuelve una ambigüedad con ciertos controles de juegos que informan ejes con códigos que se superponen con los de los ejes de MT.

Un dispositivo de entrada se clasifica como un dispositivo de un solo toque si se cumplen las siguientes condiciones:

  • El dispositivo de entrada no se clasifica como un dispositivo de múltiples puntos de contacto. Un dispositivo de entrada se clasifica como un dispositivo de un solo toque o como un dispositivo de varios toques, nunca como ambos.
  • El dispositivo de entrada informa la presencia de los ejes absolutos ABS_X y ABS_Y, y la presencia del código de tecla BTN_TOUCH.

Cuando un dispositivo de entrada se clasifica como un dispositivo táctil, la presencia de teclas virtuales se determina intentando cargar el archivo de mapa de teclas virtuales para el dispositivo. Si hay un mapa de teclas virtuales disponible, también se carga el archivo de diseño de teclas del dispositivo. Consulta [Archivos de mapas de teclas virtuales](#virtual-key-map-files) para obtener información sobre la ubicación y el formato de estos archivos.

A continuación, el sistema carga el archivo de configuración del dispositivo de entrada para el dispositivo táctil.

Todos los dispositivos táctiles integrados deben tener archivos de configuración de dispositivos de entrada. Si no hay un archivo de configuración del dispositivo de entrada, el sistema elige una configuración predeterminada que sea adecuada para los periféricos táctiles de uso general, como las pantallas táctiles o los paneles táctiles HID USB o Bluetooth externos. Estos valores predeterminados no están diseñados para pantallas táctiles integradas y pueden provocar un comportamiento incorrecto.

Después de que se carga la configuración del dispositivo de entrada, el sistema lo clasifica como un dispositivo de pantalla táctil, panel táctil o puntero.

  • Un dispositivo con pantalla táctil se usa para manipular directamente los objetos en la pantalla. El usuario toca la pantalla directamente, por lo que el sistema no requiere ninguna affordance adicional para indicar los objetos que se manipulan.
  • Se usa un dispositivo de panel táctil para proporcionar información de posicionamiento absoluto a una app sobre los toques en un área de sensor determinada. Puede ser útil para las tablets digitalizadoras.
  • Se usa un dispositivo puntero para la manipulación indirecta de objetos en la pantalla con un cursor. Los dedos se interpretan como gestos de puntero de varios toques. Otras herramientas, como los lápices, se interpretan con posiciones absolutas. Consulta Gestos de puntero multitáctil indirecto para obtener más información.

Las siguientes reglas se usan para clasificar el dispositivo de entrada como pantalla táctil, panel táctil o dispositivo apuntador.

  • Si se establece la propiedad touch.deviceType, el tipo de dispositivo se establece como se indica.
  • Si el dispositivo de entrada informa la presencia de la propiedad de entrada INPUT_PROP_DIRECT (a través de ioctl EVIOCGPROP), el tipo de dispositivo se establece en pantalla táctil. Esta condición supone que los dispositivos táctiles de entrada directa están conectados a una pantalla que también está conectada.
  • Si el dispositivo de entrada informa la presencia de la propiedad de entrada INPUT_PROP_POINTER (a través de ioctl EVIOCGPROP), el tipo de dispositivo se establece en pointer.
  • Si el dispositivo de entrada informa la presencia de los ejes relativos REL_X o REL_Y, el tipo de dispositivo se establece en panel táctil. Esta condición resuelve una ambigüedad para los dispositivos de entrada que constan de un mouse y un panel táctil. En este caso, el panel táctil no se usa para controlar el puntero, ya que el mouse ya lo controla.
  • De lo contrario, el tipo de dispositivo se establece en puntero. Este valor predeterminado garantiza que los paneles táctiles que no se hayan designado para ningún otro propósito especial controlen el puntero.

Botones

Los botones son controles opcionales que las apps pueden usar para realizar funciones adicionales. Los botones de los dispositivos táctiles se comportan de manera similar a los botones del mouse y se usan principalmente con dispositivos táctiles de tipo puntero o con una pluma stylus.

Se admiten los siguientes botones:

  • BTN_LEFT: Se asigna a MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: Se asigna a MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: Se asigna a MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK y BTN_SIDE: Se asignan a MotionEvent.BUTTON_BACK. Si presionas este botón, también se sintetiza una presión de tecla con el código de tecla KeyEvent.KEYCODE_BACK.
  • BTN_FORWARD y BTN_EXTRA: Se asignan a MotionEvent.BUTTON_FORWARD. Si presionas este botón, también se sintetiza una presión de tecla con el código de tecla KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: Se asigna a MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: Se asigna a MotionEvent.BUTTON_TERTIARY.

Herramientas y tipos de herramientas

Una herramienta es un dedo, una pluma stylus o cualquier otro aparato que se use para interactuar con el dispositivo táctil. Algunos dispositivos táctiles pueden distinguir entre diferentes tipos de herramientas.

En otras partes de Android, como en la API de MotionEvent, una herramienta suele denominarse puntero.

Se admiten los siguientes tipos de herramientas:

  • BTN_TOOL_FINGER y MT_TOOL_FINGER: Se asignan a MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN y MT_TOOL_PEN: Se asignan a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: Se asigna a MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: Se asigna a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: Se asigna a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: Se asigna a MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: Se asigna a MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: Se asigna a MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP y BTN_TOOL_QUADTAP: Se asignan a MotionEvent.TOOL_TYPE_FINGER.

Herramientas para colocar el cursor sobre un elemento o tocarlo

Las herramientas pueden estar en contacto con el dispositivo táctil o dentro del alcance y suspendidas sobre él. No todos los dispositivos táctiles pueden detectar la presencia de una herramienta que se desplaza sobre el dispositivo táctil. Los que sí lo hacen, como los digitalizadores de pluma stylus basados en RF, suelen detectar cuando la herramienta está dentro de un rango limitado del digitalizador.

El componente InputReader distingue las herramientas táctiles de las herramientas de desplazamiento. Del mismo modo, las herramientas táctiles y las herramientas de desplazamiento se informan a las apps de diferentes maneras.

Las herramientas táctiles se informan a las apps como eventos táctiles con MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN y MotionEvent.ACTION_POINTER_UP.

Las herramientas de desplazamiento se informan a las apps como eventos de movimiento genéricos con MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE y MotionEvent.ACTION_HOVER_EXIT.

Requisitos del controlador de dispositivos táctiles

  • Los controladores de dispositivos táctiles solo deben registrar los ejes y los códigos de teclas de los ejes y botones que admiten. Registrar ejes o códigos de teclas no compatibles puede confundir el algoritmo de clasificación del dispositivo o hacer que el sistema detecte de forma incorrecta las capacidades del dispositivo. Por ejemplo, si el dispositivo informa el código de tecla BTN_TOUCH, el sistema supone que siempre se usa BTN_TOUCH para indicar si la herramienta está tocando la pantalla. Por lo tanto, no se debe usar BTN_TOUCH para indicar que la herramienta simplemente está en el rango y se mantiene sobre la pantalla.
  • Los dispositivos de un solo toque usan los siguientes eventos de entrada de Linux:
    • ABS_X: (OBLIGATORIO) Informa la coordenada X de la herramienta.
    • ABS_Y: (OBLIGATORIO) Informa la coordenada Y de la herramienta.
    • ABS_PRESSURE: (opcional) Informa la presión física que se aplica a la punta de la herramienta o la intensidad de la señal del contacto táctil.
    • ABS_TOOL_WIDTH: (opcional) Informa el área transversal o el ancho del contacto táctil o de la herramienta en sí.
    • ABS_DISTANCE: (opcional) Informa la distancia de la herramienta desde la superficie del dispositivo táctil.
    • ABS_TILT_X: (opcional) Informa la inclinación de la herramienta desde la superficie del dispositivo táctil a lo largo del eje X.
    • ABS_TILT_Y: (opcional) Informa la inclinación de la herramienta desde la superficie del dispositivo táctil a lo largo del eje Y.
    • BTN_TOUCH: (OBLIGATORIO) Indica si la herramienta está tocando el dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcional) Informa los estados del botón.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcional) Informa el tipo de herramienta.
  • Los dispositivos de función multitáctil usan los siguientes eventos de entrada de Linux:
    • ABS_MT_POSITION_X: (OBLIGATORIO) Informa la coordenada X de la herramienta.
    • ABS_MT_POSITION_Y: (OBLIGATORIO) Informa la coordenada Y de la herramienta.
    • ABS_MT_PRESSURE: (opcional) Informa la presión física que se aplica a la punta de la herramienta o la intensidad de la señal del contacto táctil.
    • ABS_MT_TOUCH_MAJOR: (opcional) Informa el área transversal del contacto táctil o la longitud de la dimensión más larga del contacto táctil.
    • ABS_MT_TOUCH_MINOR: (opcional) Informa la longitud de la dimensión más corta del contacto táctil. Este eje no se debe usar si ABS_MT_TOUCH_MAJOR informa una medición de área.
    • ABS_MT_WIDTH_MAJOR: (opcional) Informa el área transversal de la herramienta o la longitud de la dimensión más larga de la herramienta. No uses este eje, a menos que conozcas las dimensiones de la herramienta.
    • ABS_MT_WIDTH_MINOR: (opcional) Informa la longitud de la dimensión más corta de la herramienta. Este eje no se debe usar si ABS_MT_WIDTH_MAJOR informa una medición de área o si se desconocen las dimensiones de la herramienta.
    • ABS_MT_ORIENTATION: (opcional) Informa la orientación de la herramienta.
    • ABS_MT_DISTANCE: (opcional) Informa la distancia de la herramienta desde la superficie del dispositivo táctil.
    • ABS_MT_TOOL_TYPE: (opcional) Informa el tipo de herramienta como MT_TOOL_FINGER o MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (opcional) Informa el ID de seguimiento de la herramienta. El ID de seguimiento es un número entero no negativo arbitrario que se usa para identificar y hacer un seguimiento de cada herramienta de forma independiente cuando hay varias herramientas activas. Por ejemplo, cuando varios dedos tocan el dispositivo, a cada uno se le debe asignar un ID de seguimiento distinto que se use mientras el dedo permanezca en contacto. Los IDs de seguimiento se pueden volver a usar cuando las herramientas asociadas se mueven fuera del alcance.
    • ABS_MT_SLOT: (opcional) Informa el ID de ranura de la herramienta cuando se usa el protocolo "B" de la función multitáctil de Linux. Consulta la documentación del protocolo de función multitáctil de Linux para obtener más detalles.
    • BTN_TOUCH: (OBLIGATORIO) Indica si la herramienta está tocando el dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcional) Informa los estados del botón.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcional) Informa el tipo de herramienta.
  • Si se definen los ejes para los protocolos de un solo toque y de múltiples toques, solo se usarán los ejes de múltiples toques y se ignorarán los ejes de un solo toque.
  • Los valores mínimo y máximo de los ejes ABS_X, ABS_Y, ABS_MT_POSITION_X y ABS_MT_POSITION_Y definen los límites del área activa del dispositivo en unidades de superficie específicas del dispositivo. En el caso de una pantalla táctil, el área activa describe la parte del dispositivo táctil que realmente cubre la pantalla.

    En el caso de una pantalla táctil, el sistema interpola automáticamente las posiciones táctiles informadas en unidades de superficie para obtener posiciones táctiles en píxeles de pantalla según el siguiente cálculo:

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    Una pantalla táctil puede informar toques fuera del área activa informada.

    Los toques que se inician fuera del área activa no se envían a las apps, pero se pueden usar para las teclas virtuales.

    Los toques que se inician dentro del área activa o que entran y salen del área de visualización se envían a las apps. Por lo tanto, si un toque comienza dentro de los límites de una app y, luego, se mueve fuera del área activa, es posible que la app reciba eventos táctiles con coordenadas de visualización negativas o que superen los límites de la pantalla. Se prevé que esto suceda.

    Un dispositivo táctil nunca debe fijar las coordenadas táctiles a los límites del área activa. Si un toque sale del área activa, se debe informar que está fuera del área activa o no se debe informar en absoluto.

    Por ejemplo, si el dedo del usuario toca cerca de la esquina superior izquierda de la pantalla táctil, es posible que se informe una coordenada de (minX, minY). Si el dedo sigue moviéndose más allá del área activa, la pantalla táctil debería comenzar a informar coordenadas con componentes menores que minX y minY, como (minX - 2, minY - 3), o debería dejar de informar el toque por completo. En otras palabras, la pantalla táctil no debe informar (minX, minY) cuando el dedo del usuario realmente toca fuera del área activa.

    Fijar las coordenadas táctiles al borde de la pantalla crea un límite artificial rígido alrededor del borde de la pantalla, lo que impide que el sistema realice un seguimiento fluido de los movimientos que entran o salen de los límites del área de visualización.

  • Los valores que informan ABS_PRESSURE o ABS_MT_PRESSURE, si se informan, deben ser distintos de cero cuando la herramienta toca el dispositivo y cero en caso contrario para indicar que la herramienta se desplaza.

    Informar los datos de presión es opcional, pero se recomienda hacerlo. Las apps pueden usar la información de presión para implementar dibujos sensibles a la presión y otros efectos.

  • Los valores que informan ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR o ABS_MT_WIDTH_MINOR no deben ser cero cuando la herramienta toca el dispositivo y cero en caso contrario, pero esto no es obligatorio. Por ejemplo, el dispositivo táctil podría medir el tamaño de los contactos táctiles con los dedos, pero no con la pluma stylus.

    Informar el tamaño es opcional, pero se recomienda hacerlo. Las apps pueden usar la información de presión para implementar dibujos sensibles al tamaño y otros efectos.

  • Los valores que informan ABS_DISTANCE o ABS_MT_DISTANCE deben acercarse a cero cuando la herramienta toca el dispositivo. La distancia puede permanecer distinta de cero incluso cuando la herramienta está en contacto directo. Los valores exactos informados dependen de la manera en que el hardware mide la distancia.

    Informar los datos de distancia es opcional, pero se recomienda para los dispositivos de pluma stylus.

  • Los valores que informan ABS_TILT_X y ABS_TILT_Y deben ser cero cuando la herramienta está perpendicular al dispositivo. Una inclinación distinta de cero indica que la herramienta se sostiene en un plano inclinado.

    Se supone que los ángulos de inclinación a lo largo de los ejes X e Y se especifican en grados desde la perpendicular. El punto central (perfectamente perpendicular) se indica con (max + min) / 2 para cada eje. Los valores más pequeños que el punto central representan una inclinación hacia arriba o hacia la izquierda, mientras que los valores más grandes que el punto central representan una inclinación hacia abajo o hacia la derecha.

    InputReader convierte los componentes de inclinación X e Y en un ángulo de inclinación perpendicular que varía de 0 a PI / 2 radianes y un ángulo de orientación planar que varía de -PI a PI radianes. Esta representación da como resultado una descripción de la orientación que es compatible con la que se usa para describir los toques con los dedos.

    Informar sobre la inclinación es opcional, pero se recomienda para los dispositivos con pluma stylus.

  • Si ABS_MT_TOOL_TYPE informa el tipo de herramienta, este reemplaza cualquier información sobre el tipo de herramienta que informe BTN_TOOL_*. Si no hay información disponible sobre el tipo de herramienta, el tipo de herramienta predeterminado es MotionEvent.TOOL_TYPE_FINGER.

  • Se determina que una herramienta está activa según las siguientes condiciones:

    • Cuando se usa el protocolo de un solo toque, la herramienta está activa si BTN_TOUCH o BTN_TOOL_* es 1.

      Esta condición implica que InputReader debe tener, al menos, cierta información sobre la naturaleza de la herramienta, ya sea si está tocando o, al menos, su tipo de herramienta. Si no hay información disponible, se supone que la herramienta está inactiva (fuera de rango).

    • Cuando se usa el protocolo "A" de la función multitáctil, la herramienta está activa cada vez que aparece en el informe de sincronización más reciente. Cuando la herramienta deja de aparecer en los informes de sincronización, deja de existir.
    • Cuando se usa el protocolo "B" de la función multitáctil, la herramienta está activa siempre que tenga una ranura activa. Cuando se borra el espacio, la herramienta deja de existir.
  • Se determina que una herramienta está suspendida según las siguientes condiciones:
    • Si la herramienta es BTN_TOOL_MOUSE o BTN_TOOL_LENS, no se considera que esté suspendida, incluso si se cumple alguna de las siguientes condiciones.
    • Si la herramienta está activa y el controlador informa datos de presión, y la presión informada es cero, la herramienta está en modo de desplazamiento.
    • Si la herramienta está activa y el controlador admite el código de tecla BTN_TOUCH, y BTN_TOUCH tiene un valor de cero, la herramienta se desplaza.
  • InputReader admite los protocolos "A" y "B" de la función multitoque. Los controladores nuevos deben usar el protocolo "B", pero ambos funcionan.
  • A partir de Android 4.0, es posible que se deban cambiar los controladores de la pantalla táctil para que cumplan con la especificación del protocolo de entrada de Linux.

    Es posible que se requieran los siguientes cambios:

    • Cuando una herramienta se vuelve inactiva (el dedo se levanta), debería dejar de aparecer en los informes de sincronización de la función multitáctil posteriores. Cuando todas las herramientas se vuelven inactivas (todos los dedos se "levantan"), el controlador debe enviar un paquete de informe de sincronización vacío, como SYN_MT_REPORT seguido de SYN_REPORT.

      Las versiones anteriores de Android esperaban que los eventos "up" se informaran enviando un valor de presión de 0. El comportamiento anterior era incompatible con la especificación del protocolo de entrada de Linux y ya no se admite.

    • La información sobre la presión física o la intensidad de la señal se debe informar con ABS_MT_PRESSURE.

      En las versiones anteriores de Android, se recuperaba la información de presión de ABS_MT_TOUCH_MAJOR. El comportamiento anterior era incompatible con la especificación del protocolo de entrada de Linux y ya no se admite.

    • La información sobre el tamaño de la presión táctil se debe informar con ABS_MT_TOUCH_MAJOR.

      Las versiones anteriores de Android recuperaban la información de tamaño de ABS_MT_TOOL_MAJOR. El comportamiento anterior era incompatible con la especificación del protocolo de entrada de Linux y ya no se admite.

    Los controladores de dispositivos táctiles ya no necesitan personalizaciones específicas de Android. Al depender del protocolo de entrada estándar de Linux, Android puede admitir una variedad más amplia de periféricos táctiles, como pantallas táctiles HID externas con función multitáctil, con controladores sin modificar.

Funcionamiento de los dispositivos táctiles

A continuación, se presenta un breve resumen del funcionamiento de los dispositivos táctiles en Android.

  1. EventHub lee eventos sin procesar del controlador evdev.
  2. InputReader consume los eventos sin procesar y actualiza el estado interno sobre la posición y otras características de cada herramienta. También hace un seguimiento de los estados de los botones.
  3. Si se presionó o soltó BACK o FORWARD, InputReader notifica a InputDispatcher sobre el evento de tecla.
  4. InputReader determina si se presionó una tecla virtual. Si es así, notifica a InputDispatcher sobre el evento de tecla.
  5. InputReader determina si el toque se inició dentro de los límites de la pantalla. Si es así, notifica a InputDispatcher sobre el evento táctil.
  6. Si no hay herramientas de contacto, pero hay al menos una herramienta de desplazamiento, InputReader notifica a InputDispatcher sobre el evento de desplazamiento.
  7. Si el tipo de dispositivo táctil es puntero, InputReader realiza la detección de gestos del puntero, mueve el puntero y los puntos según corresponda, y notifica a InputDispatcher sobre el evento del puntero.
  8. InputDispatcher usa WindowManagerPolicy para determinar si se deben enviar los eventos y si deben activar el dispositivo. Luego, InputDispatcher entrega los eventos a las apps correspondientes.

Configuración de dispositivos táctiles

El comportamiento del dispositivo táctil se determina según los ejes, los botones, las propiedades de entrada, la configuración del dispositivo de entrada, el mapa de teclas virtuales y el diseño de teclas del dispositivo.

Consulta las siguientes secciones para obtener más detalles sobre los archivos que participan en la configuración del teclado:

Propiedades

El sistema se basa en muchas propiedades de configuración de dispositivos de entrada para configurar y calibrar el comportamiento de los dispositivos táctiles.

Un motivo de esto es que los controladores de dispositivos táctiles suelen informar las características de los toques con unidades específicas del dispositivo.

Por ejemplo, muchos dispositivos táctiles miden el área de contacto táctil con una escala interna específica del dispositivo, como la cantidad total de nodos de sensores que se activaron con el toque. Este valor de tamaño sin procesar no sería significativo para las apps, ya que necesitarían conocer el tamaño físico y otras características de los nodos del sensor del dispositivo táctil.

El sistema usa parámetros de calibración codificados en los archivos de configuración del dispositivo de entrada para decodificar, transformar y normalizar los valores que informa el dispositivo táctil en una representación estándar más simple que las apps puedan comprender.

Convenciones de la documentación

Para fines de documentación, usamos las siguientes convenciones para describir los valores que usa el sistema durante el proceso de calibración.

Valores de eje sin procesar

Las siguientes expresiones indican los valores sin procesar que informa el controlador del dispositivo táctil como eventos EV_ABS.

raw.x
Es el valor del eje ABS_X o ABS_MT_POSITION_X.
raw.y
Es el valor del eje ABS_Y o ABS_MT_POSITION_Y.
raw.pressure
Es el valor del eje ABS_PRESSURE o ABS_MT_PRESSURE, o 0 si no está disponible.
raw.touchMajor
Es el valor del eje ABS_MT_TOUCH_MAJOR o 0 si no está disponible.
raw.touchMinor
Es el valor del eje ABS_MT_TOUCH_MINOR o raw.touchMajor si no está disponible.
raw.toolMajor
Es el valor del eje ABS_TOOL_WIDTH o ABS_MT_WIDTH_MAJOR, o 0 si no está disponible.
raw.toolMinor
Es el valor del eje ABS_MT_WIDTH_MINOR o raw.toolMajor si no está disponible.
raw.orientation
Es el valor del eje ABS_MT_ORIENTATION o 0 si no está disponible.
raw.distance
Es el valor del eje ABS_DISTANCE o ABS_MT_DISTANCE, o 0 si no está disponible.
raw.tiltX
Es el valor del eje ABS_TILT_X o 0 si no está disponible.
raw.tiltY
Es el valor del eje ABS_TILT_Y o 0 si no está disponible.

Rangos de ejes sin procesar

Las siguientes expresiones indican los límites de los valores sin procesar. Se obtienen llamando a ioctl EVIOCGABS para cada eje.

raw.*.min
Es el valor mínimo inclusivo del eje sin procesar.
raw.*.max
Es el valor máximo inclusivo del eje sin procesar.
raw.*.range
Equivale a raw.*.max - raw.*.min.
raw.*.fuzz
Es la precisión del eje sin procesar. Por ejemplo, fuzz = 1 implica que los valores son precisos en +/- 1 unidad.
raw.width
Es el ancho inclusivo del área táctil, equivalente a raw.x.range + 1.
raw.height
Es la altura inclusiva del área táctil, equivalente a raw.y.range + 1.

Rangos de salida

Las siguientes expresiones indican las características del sistema de coordenadas de salida. El sistema usa la interpolación lineal para traducir la información de la posición táctil de las unidades de superficie que usa el dispositivo táctil a las unidades de salida que se informan a las apps, como los píxeles de la pantalla.

output.width
Es el ancho de salida. Para las pantallas táctiles (asociadas con una pantalla), este es el ancho de la pantalla en píxeles. En el caso de los paneles táctiles (no asociados con una pantalla), el ancho de salida es igual a raw.width, lo que indica que no se realiza ninguna interpolación.
output.height
Es la altura del resultado. Para las pantallas táctiles (asociadas con una pantalla), esta es la altura de la pantalla en píxeles. En el caso de los paneles táctiles (no asociados con una pantalla), la altura de salida es igual a raw.height, lo que indica que no se realiza ninguna interpolación.
output.diag
Es la longitud diagonal del sistema de coordenadas de salida, equivalente a sqrt(output.width ^2 + output.height ^2).

Configuración básica

El asignador de entrada táctil usa muchas propiedades de configuración en el archivo de configuración del dispositivo de entrada para especificar los valores de calibración. En la siguiente tabla, se describen algunas propiedades de configuración de uso general. Todas las demás propiedades se describen en las siguientes secciones junto con los campos que se usan para calibrar.

touch.deviceType

Definición: touch.deviceType = touchScreen | touchPad | pointer | default

Especifica el tipo de dispositivo táctil.

  • Si el valor es touchScreen, el dispositivo táctil es una pantalla táctil asociada con una pantalla.

  • Si el valor es touchPad, el dispositivo táctil es un panel táctil que no está asociado con una pantalla.

  • Si el valor es pointer, el dispositivo táctil es un panel táctil que no está asociado con una pantalla, y sus movimientos se usan para gestos de puntero indirectos de varios puntos de contacto.

  • Si el valor es default, el sistema detecta automáticamente el tipo de dispositivo según el algoritmo de clasificación.

Consulta la sección Clasificación para obtener más detalles sobre cómo el tipo de dispositivo influye en el comportamiento del dispositivo táctil.

En Android 3 y versiones anteriores, se suponía que todos los dispositivos táctiles eran pantallas táctiles.

touch.orientationAware

Definición: touch.orientationAware = 0 | 1

Especifica si el dispositivo táctil debe reaccionar a los cambios de orientación de la pantalla.

  • Si el valor es 1, las posiciones táctiles que informa el dispositivo táctil se rotan cada vez que cambia la orientación de la pantalla.

  • Si el valor es 0, las posiciones táctiles que informa el dispositivo táctil son inmunes a los cambios de orientación de la pantalla.

El valor predeterminado es 1 si el dispositivo es una pantalla táctil; de lo contrario, es 0.

El sistema distingue entre pantallas táctiles y pantallas internas y externas. Una pantalla táctil interna que reconoce la orientación se rota según la orientación de la pantalla interna. Una pantalla táctil externa que reconoce la orientación se rota según la orientación de la pantalla externa.

La detección de orientación se usa para admitir la rotación de pantallas táctiles en dispositivos como el Nexus One. Por ejemplo, cuando el dispositivo se rota 90 grados en el sentido de las manecillas del reloj desde su orientación natural, las posiciones absolutas de los toques se reasignan de modo que un toque en la esquina superior izquierda del sistema de coordenadas absoluto de la pantalla táctil se informe como un toque en la esquina superior izquierda del sistema de coordenadas rotado de la pantalla. Esto se hace para que los toques se informen con el mismo sistema de coordenadas que usan las apps para dibujar sus elementos visuales.

Antes de Honeycomb, se suponía que todos los dispositivos táctiles reconocían la orientación.

touch.gestureMode

Definición: touch.gestureMode = pointer | spots | default

Especifica el modo de presentación para los gestos del puntero. Esta propiedad de configuración solo es relevante cuando el dispositivo táctil es de tipo pointer.

  • Si el valor es pointer, los gestos del panel táctil se presentan a través de un cursor similar al puntero del mouse.

  • Si el valor es spots, los gestos del panel táctil se presentan con un ancla que representa el centroide del gesto y un conjunto de puntos circulares que representan la posición de los dedos individuales.

El valor predeterminado es pointer cuando se establece la propiedad de entrada INPUT_PROP_SEMI_MT; de lo contrario, es spots.

Campos X e Y

Los campos X e Y proporcionan información de posición para el centro del área de contacto.

Cálculo

El cálculo es sencillo: la información de posición del controlador táctil se interpola de forma lineal al sistema de coordenadas de salida.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

Campos touchMajor, touchMinor, toolMajor, toolMinor y size

Los campos touchMajor y touchMinor describen las dimensiones aproximadas del área de contacto en unidades de salida (píxeles).

Los campos toolMajor y toolMinor describen las dimensiones aproximadas de la herramienta en unidades de salida (píxeles).

El campo size describe el tamaño normalizado del toque en relación con el toque más grande posible que puede detectar el dispositivo táctil. El tamaño normalizado más pequeño posible es 0.0 (sin contacto o no se puede medir), y el tamaño normalizado más grande posible es 1.0 (el área del sensor está saturada).

Cuando se pueden medir tanto la longitud como el ancho aproximados, el campo touchMajor especifica la dimensión más larga y el campo touchMinor especifica la dimensión más corta del área de contacto. Cuando solo se puede medir el diámetro aproximado del área de contacto, los campos touchMajor y touchMinor son iguales.

Del mismo modo, el campo toolMajor especifica la dimensión más larga y el campo toolMinor especifica la dimensión más corta del área transversal de la herramienta.

Si el tamaño de contacto no está disponible, pero el tamaño de la herramienta sí, el tamaño de la herramienta se establece igual al tamaño de contacto. Por el contrario, si el tamaño de la herramienta no está disponible, pero el tamaño de contacto sí, el tamaño de contacto se establece igual al tamaño de la herramienta.

Los dispositivos táctiles miden o informan el tamaño de la presión y el tamaño de la herramienta de varias maneras. La implementación actual admite tres tipos diferentes de mediciones: diámetro, área y cuadro delimitador geométrico en unidades de superficie.

<touch.size.calibration< h4=""></touch.size.calibration<>

Definición: touch.size.calibration = none | geometric | diameter | area | default

Especifica el tipo de medición que usa el controlador táctil para informar el tamaño de la presión y el tamaño de la herramienta.

  • Si el valor es none, el tamaño se establece en cero.

  • Si el valor es geometric, se supone que el tamaño se especifica en las mismas unidades de superficie que la posición, por lo que se escala de la misma manera.

  • Si el valor es diameter, se supone que el tamaño es proporcional al diámetro (ancho) del toque o de la herramienta.

  • Si el valor es area, se supone que el tamaño es proporcional al área del toque o de la herramienta.

  • Si el valor es default, el sistema usa la calibración geometric si el eje raw.touchMajor o raw.toolMajor está disponible; de lo contrario, usa la calibración none.

touch.size.scale

Definición: touch.size.scale = <un número de punto flotante no negativo>

Especifica un factor de escala constante que se usa en la calibración.

El valor predeterminado es 1.0.

touch.size.bias

Definición: touch.size.bias = <un número de punto flotante no negativo>

Especifica un valor de sesgo constante que se usa en la calibración.

El valor predeterminado es 0.0.

touch.size.isSummed

Definición: touch.size.isSummed = 0 | 1

Especifica si el tamaño se informa como la suma de los tamaños de todos los contactos activos o si se informa de forma individual para cada contacto.

  • Si el valor es 1, el tamaño informado se divide por la cantidad de contactos antes de su uso.

  • Si el valor es 0, se usa el tamaño informado tal como está.

El valor predeterminado es 0.

Algunos dispositivos táctiles, en particular los dispositivos "Semi-MT", no pueden distinguir las dimensiones individuales de varios contactos, por lo que informan una medición de tamaño que representa su área o ancho total. Esta propiedad solo se debe establecer en 1 para esos dispositivos. Si tienes dudas, establece este valor en 0.

Cálculo

El cálculo de los campos touchMajor, touchMinor, toolMajor, toolMinor y size depende de los parámetros de calibración especificados.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

campo de presión

El campo pressure describe la presión física aproximada que se aplica al dispositivo táctil como un valor normalizado entre 0.0 (sin contacto) y 1.0 (presión normal).

Una presión de cero indica que la herramienta está suspendida.

touch.pressure.calibration

Definición: touch.pressure.calibration = none | physical | amplitude | default

Especifica el tipo de medición que usa el controlador táctil para informar la presión.

  • Si el valor es none, la presión es desconocida, por lo que se establece en 1.0 cuando se toca y en 0.0 cuando se coloca el cursor sobre el elemento.

  • Si el valor es physical, se supone que el eje de presión mide la intensidad física real de la presión aplicada al panel táctil.

  • Si el valor es amplitude, se supone que el eje de presión mide la amplitud de la señal, que se relaciona con el tamaño del contacto y la presión aplicada.

  • Si el valor es default, el sistema usa la calibración physical si el eje de presión está disponible; de lo contrario, usa none.

touch.pressure.scale

Definición: touch.pressure.scale = <un número de punto flotante no negativo>

Especifica un factor de escala constante que se usa en la calibración.

El valor predeterminado es 1.0 / raw.pressure.max.

Cálculo

El cálculo del campo pressure depende de los parámetros de calibración especificados.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

campos de orientación e inclinación

El campo orientation describe la orientación del toque y la herramienta como una medición angular. Una orientación de 0 indica que el eje mayor está orientado verticalmente, -PI/2 indica que el eje mayor está orientado hacia la izquierda y PI/2 indica que el eje mayor está orientado hacia la derecha. Cuando hay una herramienta de pluma stylus, el rango de orientación se puede describir en un rango de círculo completo de -PI o PI.

El campo tilt describe la inclinación de la herramienta como una medición angular. Una inclinación de 0 indica que la herramienta está perpendicular a la superficie. Una inclinación de PI/2 indica que la herramienta está plana sobre la superficie.

touch.orientation.calibration

Definición: touch.orientation.calibration = none | interpolated | vector | default

Especifica el tipo de medición que usa el controlador táctil para informar la orientación.

  • Si el valor es none, se desconoce la orientación, por lo que se establece en 0.
  • Si el valor es interpolated, la orientación se interpola de forma lineal, de modo que un valor sin procesar de raw.orientation.min se asigna a -PI/2 y un valor sin procesar de raw.orientation.max se asigna a PI/2. El valor central de (raw.orientation.min + raw.orientation.max) / 2 se asigna a 0.
  • Si el valor es vector, la orientación se interpreta como un vector empaquetado que consta de dos campos de 4 bits con signo. Esta representación se usa en las partes del protocolo basado en objetos de Atmel. Cuando se decodifica, el vector produce un ángulo de orientación y una magnitud de confianza. La magnitud de confianza se usa para escalar la información de tamaño, a menos que sea geométrica.
  • Si el valor es default, el sistema usa la calibración interpolated si el eje de orientación está disponible; de lo contrario, usa none.

Cálculo

El cálculo de los campos orientation y tilt depende de los parámetros de calibración especificados y de la entrada disponible.

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

campo de distancia

El campo distance describe la distancia entre la herramienta y la superficie del dispositivo táctil. Un valor de 0.0 indica contacto directo, y los valores más altos indican una distancia cada vez mayor de la superficie.

touch.distance.calibration

Definición: touch.distance.calibration = none | scaled | default

Especifica el tipo de medición que usa el controlador táctil para informar la distancia.

  • Si el valor es none, se desconoce la distancia, por lo que se establece en 0.

  • Si el valor es scaled, la distancia informada se multiplica por un factor de escala constante.

  • Si el valor es default, el sistema usa la calibración scaled si el eje de distancia está disponible; de lo contrario, usa none.

touch.distance.scale

Definición: touch.distance.scale = <un número de punto flotante no negativo>

Especifica un factor de escala constante que se usa en la calibración.

El valor predeterminado es 1.0.

Cálculo

El cálculo del campo distance depende de los parámetros de calibración especificados.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

Ejemplo

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

Notas de compatibilidad

Las propiedades de configuración de los dispositivos táctiles cambiaron significativamente en Android Ice Cream Sandwich 4.0. Todos los archivos de configuración de dispositivos de entrada para dispositivos táctiles se deben actualizar para usar las nuevas propiedades de configuración.

Es posible que también debas actualizar los controladores de los dispositivos táctiles más antiguos.

Archivos de mapa de teclas virtuales

Los dispositivos táctiles se pueden usar para implementar teclas virtuales.

Existen varias formas de hacerlo, según las capacidades del controlador táctil. Algunos controladores táctiles se pueden configurar directamente para implementar teclas de función mediante la configuración de registros de firmware. En otras ocasiones, es conveniente realizar la asignación de coordenadas táctiles a códigos de teclas en el software.

Cuando las teclas virtuales se implementan en el software, el kernel debe exportar un archivo de mapa de teclas virtuales llamado virtualkeys.<devicename> como una propiedad de la placa. Por ejemplo, si los controladores del dispositivo de pantalla táctil informan su nombre como "touchyfeely", el archivo de mapa de teclas virtuales debe tener la ruta de acceso /sys/board_properties/virtualkeys.touchyfeely.

Un archivo de mapa de teclas virtuales describe las coordenadas y los códigos de teclas de Linux de las teclas virtuales en la pantalla táctil.

Además del archivo de mapa de teclas virtuales, debe haber un archivo de diseño de teclas y un archivo de mapa de caracteres de teclas correspondientes para asignar los códigos de teclas de Linux a los códigos de teclas de Android y especificar el tipo de dispositivo de teclado (por lo general, SPECIAL_FUNCTION).

Sintaxis

Un archivo de mapa de teclas virtuales es un archivo de texto sin formato que consta de una secuencia de descripciones de diseño de teclas virtuales separadas por líneas nuevas o por dos puntos.

Las líneas de comentarios comienzan con "#" y continúan hasta el final de la línea.

Cada clave virtual se describe con 6 componentes delimitados por dos puntos:

  • 0x01: Es un código de versión. Siempre debe ser 0x01.
  • <Linux key code>: Es el código de tecla de Linux de la tecla virtual.
  • <centerX>: Es la coordenada de píxel X del centro de la tecla virtual.
  • <centerY>: Es la coordenada Y de píxel del centro de la tecla virtual.
  • <width>: Es el ancho de la tecla virtual en píxeles.
  • <height>: Es la altura de la tecla virtual en píxeles.

Todas las coordenadas y los tamaños se especifican en función del sistema de coordenadas de la pantalla.

Este es un archivo de mapa de teclas virtuales escrito en una sola línea.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

El mismo archivo de mapa de teclas virtuales también se puede escribir en varias líneas.

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

En el ejemplo anterior, la pantalla táctil tiene una resolución de 480 x 800. En consecuencia, todas las teclas virtuales tienen una coordenada <centerY> de 835, que está un poco por debajo del área visible de la pantalla táctil.

La primera tecla tiene un código de análisis de Linux de 158 (KEY_BACK), centerX de 55, centerY de 835, ancho de 90 y altura de 55.

Ejemplo

Archivo de mapa de teclas virtuales: /sys/board_properties/virtualkeys.touchyfeely.

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

Archivo de diseño de teclas: /system/usr/keylayout/touchyfeely.kl.

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

Archivo de mapa de caracteres de teclas: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Gestos indirectos del puntero de varios toques

En el modo de puntero, el sistema interpreta los siguientes gestos:

  • Presionar con un dedo: clic
  • Movimiento con un solo dedo: Mueve el puntero.
  • Movimiento con un solo dedo y presión de botones: arrastra el puntero.
  • Movimiento con dos dedos en la misma dirección: arrastra el área debajo del puntero en esa dirección. El puntero en sí no se mueve.
  • Movimiento de dos dedos que se acercan o se alejan en diferentes direcciones: desplaza, escala o rota el área que rodea el puntero. El puntero en sí no se mueve.
  • Movimiento de varios dedos: gesto de formato libre.

Rechazo de la palma

A partir de Android 13, el sistema puede rechazar automáticamente las entradas de las palmas de las manos cuando se habilita el framework integrado. Aún se admiten las soluciones internas personalizadas, aunque es posible que deban modificarse para que devuelvan la marca TOOL_TYPE_PALM cuando se detecte una palma. El framework integrado también funciona junto con soluciones personalizadas.

El modelo real analiza los primeros 90 ms de datos de gestos, el puntero actual y los punteros circundantes, y, luego, considera qué tan lejos del borde de la pantalla están los toques. Luego, determina, para cada puntero, cuáles son palmas. También tiene en cuenta el tamaño de cada contacto, según lo informado por touchMajor y touchMinor. Luego, el framework de Android quita los punteros que se marcan como palmas de la transmisión táctil.

Si ya se envió un puntero a las apps, el sistema realiza una de las siguientes acciones:

  • (Si hay otros punteros activos) Cancela el puntero con ACTION_POINTER_UP y FLAG_CANCELED establecidos.
  • (Si este es el único puntero) Cancela el puntero con ACTION_CANCEL.

Una API pública, MotionEvent.FLAG_CANCELED, indica que el evento actual no debería activar la acción del usuario. Esta marca se establece para ACTION_CANCEL y ACTION_POINTER_UP.

Si el puntero de palma no se envió a las apps, el sistema simplemente lo descarta.

Habilita el rechazo de la palma

  1. En tu controlador táctil, usa la macro input_abs_set_res para establecer las resoluciones de los siguientes campos (las unidades son píxeles por mm):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    La compatibilidad con ABS_MT_TOUCH_MINOR es opcional. Sin embargo, si tu dispositivo lo admite, asegúrate de que la resolución esté configurada correctamente.

  2. Para confirmar que los campos estén configurados correctamente, ejecuta el siguiente comando:
        $ adb shell getevent -li
    
  3. Para habilitar la función durante el tiempo de ejecución, ejecuta lo siguiente:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Reinicia el proceso system_server.
         $ adb shell stop && adb shell start
        
  5. Confirma que adb shell dumpsys input muestre que hay rechazadores de palma dentro de UnwantedInteractionBlocker. Si no es así, revisa los registros relacionados con la entrada para encontrar pistas sobre lo que podría estar mal configurado.

    Consulta el siguiente ejemplo como referencia:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. Para habilitar la función de forma permanente, agrega el comando sysprop correspondiente en tu archivo init**rc:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Lecturas adicionales