Dispositivos táctiles

Android admite diferentes pantallas y paneles táctiles, incluidos los siguientes: tablets digitalizadoras basadas en pluma stylus.

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

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

Los dispositivos táctiles pueden tener botones con funciones similares a los botones del mouse.

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

En ocasiones, los dispositivos táctiles se usan para implementar llaves virtuales. Por ejemplo, en algunos dispositivos Android, el área del sensor de la pantalla táctil se extiende más allá del borde del la pantalla y tiene dos propósitos 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 un dispositivo multitáctil si ambos Se cumplen las siguientes condiciones:

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

Un dispositivo de entrada se clasifica como un dispositivo de toque único si ambos se aplican las siguientes condiciones:

  • El dispositivo de entrada no está clasificado como dispositivo multitáctil. Un dispositivo de entrada se clasifica como dispositivo de un solo toque o dispositivo de varios toques, nunca ambas.
  • El dispositivo de entrada informa la presencia de los valores absolutos ABS_X y ABS_Y los ejes 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 claves virtuales se determina intentando cargar el archivo del mapa de claves virtuales para el dispositivo. Si hay un mapa de claves virtuales disponible, el diseño de la clave para el dispositivo. Consulta [Archivos de mapa de claves 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 del dispositivo de entrada. Si no hay un archivo de configuración del dispositivo de entrada, el sistema selecciona una configuración predeterminada que es apropiada para usos periféricos táctiles, como pantallas táctiles externas USB o Bluetooth HID o paneles táctiles. Estos valores predeterminados no están diseñados para pantallas táctiles integradas y puede dar como resultado un comportamiento incorrecto.

Luego de que se carga la configuración del dispositivo de entrada, el sistema clasifica los dispositivo de entrada como dispositivo de pantalla táctil, panel táctil o puntero.

  • Se usa un dispositivo de pantalla táctil para manipular directamente objetos en la en la pantalla. El usuario toca directamente la pantalla, por lo que el sistema no requieren cualquier indicación adicional para indicar los objetos que o manipularlos.
  • Se usa un dispositivo de panel táctil para proporcionar información de posicionamiento absoluta. a una app sobre toques en un área determinada del sensor. Puede ser útil para tabletas digitalizadoras.
  • Un dispositivo de puntero se usa para la manipulación indirecta de objetos en el usando un cursor. Los dedos se interpretan como un puntero multitáctil y gestos clave. Otras herramientas, como las plumas stylus, se interpretan usando absolutas. Consulta Puntero multitáctil indirecto gestos para obtener más información.

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

  • Si se establece la propiedad touch.deviceType, el tipo de dispositivo es establecer como se indica.
  • Si el dispositivo de entrada informa la presencia de INPUT_PROP_DIRECT de entrada (mediante la ioctl EVIOCGPROP), se indica el tipo de dispositivo se configuró en pantalla táctil. Esta condición supone que el contacto de entrada directo los dispositivos se conectan a una pantalla que también está conectada.
  • Si el dispositivo de entrada informa la presencia de INPUT_PROP_POINTER la propiedad de entrada (mediante ioctl EVIOCGPROP) y, luego, el tipo de dispositivo se configura como puntero.
  • Si el dispositivo de entrada informa la presencia de REL_X o REL_Y ejes relativos, el tipo de dispositivo se establece como panel táctil. Esta condición resuelve una ambigüedad para 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 porque el mouse ya lo controla.
  • De lo contrario, el tipo de dispositivo se establece como puntero. Esta configuración predeterminada garantiza que los paneles táctiles que no tienen otro propósito especial controlar 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 del mouse. y se usan principalmente con dispositivos táctiles tipo puntero o con un pluma stylus.

Se admiten los siguientes botones:

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

Herramientas y tipos de herramientas

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

En otras partes de Android, como en la API de MotionEvent, a menudo se hace referencia a una herramienta. como puntero.

Se admiten los siguientes tipos de herramientas:

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

Herramientas de tocar o colocar el cursor sobre un elemento

Las herramientas pueden estar en contacto con el dispositivo táctil o dentro del alcance y colocando el cursor sobre ellos por encima de él. No todos los dispositivos táctiles pueden detectar la presencia de una herramienta. que se coloca sobre el dispositivo táctil. Las que sí lo hacen, como los digitalizadores de plumas stylus con base en RF, a menudo detecta cuando la herramienta se encuentra dentro de un rango limitado del digitalizador.

El componente InputReader distingue entre herramientas táctiles y colocar el cursor sobre ellas con herramientas de visualización. Del mismo modo, se informan a las apps sobre herramientas de tocar y colocar el cursor sobre ellas de diferentes maneras.

Las herramientas táctiles se informan a las apps como eventos táctiles usando 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 mediante 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 deben registrar solo los ejes y los códigos clave para los ejes y botones que admiten. Se están registrando ejes o códigos de tecla no compatibles. puede confundir el algoritmo de clasificación del dispositivo o hacer que el sistema detectar las capacidades del dispositivo. Por ejemplo, si el dispositivo informa la Código de tecla BTN_TOUCH, el sistema supone que BTN_TOUCH siempre se usa para indicar si la herramienta está tocando la pantalla. Por lo tanto, no debes usar BTN_TOUCH para indicar que la herramienta solo esté en el rango y se esté desplazando.
  • 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) Indica la presión física aplicada a la propina. 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 de contacto táctil o de la herramienta en sí.
    • ABS_DISTANCE: (opcional): Indica la distancia de la herramienta desde la superficie. del dispositivo táctil.
    • ABS_TILT_X: (opcional): Indica la inclinación de la herramienta desde la superficie. el dispositivo táctil junto al eje X.
    • ABS_TILT_Y: (opcional): Indica la inclinación de la herramienta desde la superficie. el dispositivo táctil junto al eje Y.
    • BTN_TOUCH: (OBLIGATORIO) indica si la herramienta está tocando el dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE y BTN_BACK BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: Estados del botón de informes (opcional).
    • BTN_TOOL_FINGER, BTN_TOOL_PEN y 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 multitáctiles utilizan 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) Indica la presión física aplicada al punta de la herramienta o la intensidad de la señal del contacto táctil.
    • ABS_MT_TOUCH_MAJOR: (opcional) informa el área transversal de la contacto táctil o la longitud de la dimensión más larga del contacto táctil.
    • ABS_MT_TOUCH_MINOR: (opcional) Indica la longitud de la dimensión más corta. del contacto táctil. Este eje no debe usarse si ABS_MT_TOUCH_MAJOR es para informar una medición de área.
    • ABS_MT_WIDTH_MAJOR: (opcional) informa el área transversal de la o la longitud de la dimensión más larga de esta. No usar este eje a menos que conozcas las dimensiones de la herramienta.
    • ABS_MT_WIDTH_MINOR: (opcional) Indica la longitud de la dimensión más corta. de la herramienta en sí. No se debe usar este eje 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) Indica la distancia de la herramienta desde la superficial del dispositivo táctil.
    • ABS_MT_TOOL_TYPE: (opcional) Informa las 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 arbitrario no negativo que se usa para identificar y hacer un seguimiento de cada herramienta de forma independiente cuando hay varias activas. Por ejemplo: cuando varios dedos tocan el dispositivo, a cada uno se le debe asignar el ID de seguimiento que se utiliza mientras el dedo permanece en contacto. IDs de seguimiento se pueden reutilizar cuando sus herramientas asociadas están fuera de alcance.
    • ABS_MT_SLOT: (opcional): Indica el ID de ranura de la herramienta cuando se usa el Protocolo multitáctil de Linux “B”. Consultar la documentación del protocolo multitáctil de Linux para obtener más información.
    • BTN_TOUCH: (OBLIGATORIO) indica si la herramienta está tocando el dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE y BTN_BACK BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: Estados del botón de informes (opcional).
    • BTN_TOOL_FINGER, BTN_TOOL_PEN y BTN_TOOL_RUBBER BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH y BTN_TOOL_MOUSE BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcional) Informa el tipo de herramienta.
  • Si se definen ejes para el protocolo de un solo toque y el de varios toques, entonces Solo se usan los ejes de varios puntos de contacto y se ignoran los de un solo toque.
  • Los valores mínimo y máximo de ABS_X, ABS_Y y ABS_MT_POSITION_X, y los ejes 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 el valor táctil informado posiciones en unidades de superficie para obtener posiciones táctiles en píxeles de la pantalla según mediante el siguiente cálculo:

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

    Una pantalla táctil podría informar toques fuera del área activa informada.

    Los toques que se inician fuera del área activa no se entregan a las apps. pero se puede usar para claves virtuales.

    Toques que se inician dentro del área activa o que entran y salen de la pantalla se entregan a las apps. Por lo tanto, si un toque comienza dentro del límites de una app y luego se mueve fuera del área activa, la app podrían recibir eventos táctiles con coordenadas de pantalla que sean negativas o estén más allá del límites de la pantalla. Este es el comportamiento esperado.

    Un dispositivo táctil nunca debe fijar las coordenadas táctiles a los límites de la capa en una sola área de almacenamiento en etapa intermedia. Si un toque sale del área activa, se debe informar que está fuera de el área activa o no se debe informar.

    Por ejemplo, si el dedo del usuario se toca cerca de la esquina superior izquierda de la pantalla táctil, podría informar una coordenada de (minX, minY). Si el dedo continúa para salir del área activa, la pantalla táctil debería comenzar coordenadas de informes con componentes menores a 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 debería informar (minX, minY). cuando el dedo del usuario toca fuera del área activa.

    Sujeta las coordenadas táctiles sobre el borde de la pantalla para crear una luz límite rígido alrededor del borde de la pantalla que impide que el sistema para rastrear suavemente los movimientos que entran o salen de los límites del área de visualización.

  • Los valores informados por ABS_PRESSURE o ABS_MT_PRESSURE, si se informan, deben ser distintos de cero cuando la herramienta toca el dispositivo y cero para indicar que la herramienta se está desplazando.

    La información sobre la presión de informes es opcional, pero muy recomendada. Las apps pueden usar la información de presión para implementar dibujos sensibles a la presión y otros efectos.

  • Los valores informados por ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR o ABS_MT_WIDTH_MINOR debe ser distinto de cero cuando la herramienta está en contacto con el dispositivo y el cero de lo contrario, pero no es necesario. Por ejemplo, el dispositivo táctil podría medir el tamaño del toque contactos, pero no los táctiles de la pluma stylus.

    La información sobre el tamaño de los informes es opcional, pero muy recomendable. Las apps pueden usar información de presión para implementar dibujos sensibles al tamaño y otros efectos.

  • Los valores informados por ABS_DISTANCE o ABS_MT_DISTANCE deben acercarse a cero cuando la herramienta toca el dispositivo. La distancia puede ser distinta de cero incluso cuando la herramienta está en contacto directo. Los valores exactos informados dependen según la forma en que el hardware mide la distancia.

    El informe de datos de distancia es opcional, pero se recomienda para lo siguiente: plumas stylus.

  • Los valores informados por ABS_TILT_X y ABS_TILT_Y deben ser cero cuando la herramienta es perpendicular al dispositivo. Una inclinación distinta a cero indica que la herramienta se sostiene en una inclinación.

    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) es el que por (max + min) / 2 para cada eje. Valores menores que el punto central representan una inclinación hacia arriba o hacia la izquierda, valores mayores 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 una perpendicular un ángulo de inclinación de 0 a PI / 2 radianes y un ángulo de orientación plana de un rango de radianes de -PI a PI. Esta representación da como resultado un descripción de la orientación que es compatible con lo que se utiliza para describir toques de los dedos.

    Informar la información de inclinación es opcional, pero se recomienda para dispositivos plumas stylus.

  • Si el tipo de herramienta es informado por ABS_MT_TOOL_TYPE, este sustituirá a cualquier herramienta. tipo de información informada por BTN_TOOL_*. Si no hay información disponible sobre el tipo de herramienta, el tipo de herramienta se establece de forma predeterminada en MotionEvent.TOOL_TYPE_FINGER

  • Se determina que una herramienta está activa en función de las siguientes condiciones:

    • Cuando se utiliza 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 algunos información sobre la naturaleza de la herramienta, ya sea tocando, o al menos su tipo de herramienta. Si no hay información disponible, se supone que la herramienta está inactiva (fuera de rango).

    • Al usar el protocolo multitáctil “A”, la herramienta está activa aparece en el informe de sincronización más reciente. Cuando la herramienta deja de aparecer en y sincronizar informes, deja de existir.
    • Al usar el protocolo multitáctil "B", la herramienta estará activa durante el tiene una ranura activa. Cuando se borra el espacio, la herramienta deja de existir.
  • Se determina que una herramienta se coloca sobre el cursor en función de las siguientes condiciones:
    • Si la herramienta es BTN_TOOL_MOUSE o BTN_TOOL_LENS, entonces no se coloque el cursor sobre un elemento, incluso si se cumple alguna de las siguientes condiciones.
    • Si la herramienta está activa y el conductor informa sobre la presión, y la presión informada es cero, la herramienta se coloca.
    • Si la herramienta está activa y el controlador admite el código de tecla BTN_TOUCH y BTN_TOUCH tiene un valor de cero; entonces, la herramienta se coloca sobre el cursor.
  • InputReader admite el protocolo multitáctil “A” y "B". Conductores nuevos debería usar la "B" como el protocolo de puerta de enlace, pero funciona.
  • A partir de Android 4.0, es posible que los controladores de la pantalla táctil deban cambiarse para cumplir con la especificación del protocolo de entrada de Linux.

    Es posible que se requieran los siguientes cambios:

    • Cuando una herramienta se desactiva (el dedo "arriba"), debería dejar de aparecer. en informes posteriores de sincronización de múltiples puntos de contacto. Cuando todas las herramientas se vuelven inactivas (todos los dedos van hacia arriba"), el conductor debería enviar un paquete vacío de informes de sincronización. como SYN_MT_REPORT seguido de SYN_REPORT.

      Se esperaban "versiones anteriores" de Android eventos a informar enviando un valor de presión de 0. El comportamiento anterior era incompatible especificación del protocolo de entrada de Linux y ya no es compatible.

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

      Las versiones anteriores de Android recuperaron información de presión desde ABS_MT_TOUCH_MAJOR. El comportamiento anterior era incompatible especificación del protocolo de entrada de Linux y ya no es compatible.

    • La información del tamaño táctil se debe enviar a través de ABS_MT_TOUCH_MAJOR.

      Las versiones anteriores de Android recuperaban información sobre tamaño de ABS_MT_TOOL_MAJOR El comportamiento anterior era incompatible especificación del protocolo de entrada de Linux y ya no es compatible.

    Los controladores de dispositivos táctiles ya no necesitan personalizaciones específicas de Android. Como se basa en el protocolo de entrada estándar de Linux, Android puede admitir una variedad más amplia de periféricos táctiles, como multitáctil externo HID pantallas táctiles, con controladores sin modificar.

Funcionamiento del dispositivo táctil

A continuación, se incluye un breve resumen del funcionamiento del dispositivo táctil en Android.

  1. EventHub lee eventos sin procesar del controlador evdev.
  2. InputReader consume los eventos sin procesar y actualiza el estado interno de la posición y otras características de cada herramienta. También registra estados de los botones.
  3. Si se presionó o suelta BACK o FORWARD, ocurrirá lo siguiente: InputReader notifica a InputDispatcher sobre el evento clave.
  4. InputReader determina si se presionó una tecla virtual. Si es así, notifica a InputDispatcher sobre el evento clave.
  5. InputReader determina si el toque se inició en el límites de la pantalla. De ser así, le notifica a InputDispatcher sobre el evento táctil.
  6. Si no hay herramientas que se tocan, pero hay al menos una herramienta flotante, InputReader notifica a InputDispatcher sobre el evento de colocar el cursor sobre un elemento.
  7. Si el tipo de dispositivo táctil es puntero, InputReader realiza el puntero. la detección de gestos, mueve el puntero y los puntos según corresponda, y notifica InputDispatcher sobre el evento del puntero.
  8. InputDispatcher usa WindowManagerPolicy para determinar si los eventos deben enviarse y si deben activar el dispositivo. Luego, InputDispatcher entrega los eventos a las apps correspondientes.

Configuración del dispositivo táctil

El comportamiento del dispositivo táctil se determina mediante los ejes, los botones, las propiedades de entrada, configuración del dispositivo de entrada, mapa de claves virtuales y diseño de claves.

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

Propiedades

El sistema depende de muchas propiedades de configuración del dispositivo de entrada para configurar y calibrar el comportamiento del dispositivo táctil.

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

Por ejemplo, muchos dispositivos táctiles miden el área de contacto. usando una balanza interna específica del dispositivo, como el número total de los nodos del sensor que se activaron con el tacto. Este valor de tamaño sin procesar no serían significativos para las apps porque necesitarían conocer el tamaño físico y otras características de los nodos de los sensores del dispositivo táctil.

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

Convenciones de documentación

Con 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 denotan los valores sin procesar que informa el toque controlador de dispositivo 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
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
El valor del eje ABS_MT_TOUCH_MINOR, o raw.touchMajor si no está disponible.
raw.toolMajor
El valor del eje ABS_TOOL_WIDTH o ABS_MT_WIDTH_MAJOR, o 0 si no está disponible.
raw.toolMinor
El valor del eje ABS_MT_WIDTH_MINOR o raw.toolMajor si no es así disponibles.
raw.orientation
Es el valor del eje ABS_MT_ORIENTATION, o 0 si no está disponible.
raw.distance
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 denotan los límites de los valores sin procesar. Se obtienen llamando a EVIOCGABS ioctl para cada eje.

raw.*.min
El valor mínimo inclusivo del eje sin procesar.
raw.*.max
El valor máximo inclusivo del eje sin procesar.
raw.*.range
Equivale a raw.*.max - raw.*.min.
raw.*.fuzz
La precisión del eje sin procesar. P. ej., fuzz = 1 implica que los valores son exactos a +/- 1 unidad.
raw.width
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 denotan las características del sistema de coordenadas de salida. El sistema usa interpolación lineal para traducir la información de posición táctil de las unidades de superficie que utiliza el dispositivo táctil en las unidades de salida que se informados a las apps, como los píxeles de pantalla.

output.width
Es el ancho del resultado. Para pantallas táctiles (asociadas con una pantalla), esta es el ancho de la pantalla en píxeles. Para paneles táctiles (no asociados con una pantalla), el ancho de salida es igual a raw.width, lo que indica que no hay interpolación de que ocurra la evaluación.
output.height
La altura del resultado. Para pantallas táctiles (asociadas con una pantalla), esta es la altura de la pantalla en píxeles. Para paneles táctiles (no asociados con una pantalla), la altura de salida es igual a raw.height, lo que indica que no se debe interpolar una tarea.
output.diag
La longitud diagonal del sistema de coordenadas del resultado, equivalente a sqrt(output.width ^2 + output.height ^2)

Configuración básica

El asignador de entrada táctil utiliza muchas propiedades de configuración en el dispositivo de entrada de configuración para especificar los valores de calibración. En la siguiente tabla, se describe 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 no asociado. con una pantalla.

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

  • 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 informadas por el dispositivo táctil son inmunes. para mostrar los cambios de orientación.

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

El sistema distingue entre pantallas táctiles y pantallas internas y externas. Una pantalla táctil interna con reconocimiento de orientación rota en función de la orientación de la pantalla interna. Se rota una pantalla táctil externa que reconoce la orientación. según la orientación de la pantalla externa.

El reconocimiento de orientación se utiliza para facilitar la rotación de pantallas táctiles en los 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 que un toque en la esquina superior izquierda del sistema de coordenadas absolutas de la pantalla táctil se informa como un toque en la esquina superior izquierda del sistema de coordenadas rotadas de la pantalla. Esto se hace para que los toques se informen con el mismo sistema de coordenadas que usan para dibujar sus elementos visuales.

Antes de Honeycomb, se suponía que todos los dispositivos táctiles eran compatibles con 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 del tipo puntero.

  • Si el valor es pointer, los gestos del panel táctil se presentan mediante un cursor. similar al puntero del mouse.

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

El valor predeterminado es pointer cuando la propiedad de entrada INPUT_PROP_SEMI_MT esté establecida, o spots de lo contrario.

Campos Y y X

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

Cálculo

El cálculo es claro: la información posicional del controlador táctil es interpolado linealmente 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

touchMajor, touchMinor, toolMajor, toolMinor, campos de tamaño

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 propia herramienta en unidades de salida (píxeles).

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

Cuando se pueda medir la longitud y 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, entonces los campos touchMajor y touchMinor son iguales.

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

Si el tamaño táctil no está disponible, pero el tamaño de la herramienta está disponible, el tamaño de la herramienta esté configurado igual al tamaño táctil. En cambio, si el tamaño de la herramienta no está disponible pero el tamaño táctil está disponible, entonces el tamaño táctil está configurado igual al tamaño de la herramienta.

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

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

Especifica el tipo de medida que utiliza el controlador táctil para informar la tamaño táctil y 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 el mismo unidades de superficie como 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 a el diámetro (ancho) del toque o la herramienta.

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

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

tocar.tamaño.escala

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

Especifica un factor de escala constante que se usó 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 utilizado 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 contactos activos o 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 usarlos.

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

El valor predeterminado es 0.

Algunos dispositivos táctiles, en especial "Semi-MT" los dispositivos no pueden distinguir dimensiones individuales de varios contactos para que informen una medición del tamaño que representa el ancho o el área total. Esta propiedad solo debe configurarse como 1 para esos dispositivos. Si tienes dudas, establece este valor en 0.

Cálculo

El cálculo de 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 tocar) y 1.0 (presión normal).

La presión de cero indica que la herramienta se está desplazando.

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 tocar y 0.0 al colocar el cursor.

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

  • Si el valor es amplitude, se supone que el eje de presión mide 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 valor eje de presión 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 usó 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 tacto y de la herramienta como una y medición angular. Una orientación de 0 indica que el eje mayor está vertical, -PI/2 indica que el eje mayor está orientado hacia la izquierda, PI/2 indica que el eje mayor está orientado hacia la derecha. Cuando se usa una pluma stylus cuando hay una herramienta, el rango de orientación se puede describir en un rango de círculos completos desde -PI o PI.

El campo tilt describe la inclinación de la herramienta como una medida angular. Una inclinación de 0 indica que la herramienta es perpendicular a la superficie. Una inclinación de PI/2 indica que la herramienta se encuentra plana en la superficie.

touch.orientation.calibration

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

Especifica el tipo de medida que utiliza 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 se pueda 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 de dos campos de 4 bits con signo. Esta representación se usa en el protocolo basado en objetos de Atmel partes interesadas. Cuando se decodifica, el vector produce un ángulo de orientación y una confianza magnitud. La magnitud de la confianza se usa para escalar la información de tamaño, a menos que sea geométrico.
  • 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 del los parámetros de calibración especificados y 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 el dispositivo táctil. de ataque de la nube. Un valor de 0.0 indica el contacto directo y los valores más altos cada vez más distancia desde la superficie.

touch.distance.calibration

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

Especifica el tipo de medida que usa el controlador táctil para informar la distancia.

  • Si el valor es none, la distancia es desconocida, 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 valor eje de distancia disponible; de lo contrario, usa none.

toque.distancia.escala

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

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

El valor predeterminado es 1.0.

Cálculo

El cálculo del campo distance depende de la calibración especificada parámetros.

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 del dispositivo de entrada táctil Los dispositivos deben actualizarse para usar las nuevas propiedades de configuración.

Es posible que los controladores de dispositivos táctiles más antiguos también deban ser se actualicen.

Archivos de mapa de claves virtuales

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

Existen varias formas de hacerlo, según las capacidades de la controlador táctil. Algunos controladores táctiles pueden configurarse directamente para implementar las teclas programables mediante la configuración de registros de firmware. Otras veces, es conveniente realizar la asignación de coordenadas táctiles a códigos de teclas en software.

Cuando se implementan claves virtuales en el software, el kernel debe exportar un mapa de claves virtuales llamado virtualkeys.<devicename> como propiedad de tablero. Por ejemplo: si los controladores del dispositivo con pantalla táctil informa su nombre como "Touchyfeely" luego, el archivo de mapa de claves virtuales debe tener la ruta /sys/board_properties/virtualkeys.touchyfeely

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

Además del archivo de mapa de claves virtuales, debe haber un diseño de claves correspondiente y un archivo de mapa de caracteres clave para asignar los códigos de teclas de Linux a los códigos de teclas de Android y para especificar el tipo de teclado (generalmente SPECIAL_FUNCTION).

Sintaxis

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

Las líneas de comentarios comienzan con “#”. y continúa 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.
  • <Código de tecla de Linux>: Es el código de tecla de Linux de la llave virtual.
  • <centerX>: La coordenada de píxeles X del centro de la clave virtual.
  • <centerY>: Es la coordenada de píxeles Y del centro de la clave virtual.
  • <width>: El ancho de la clave virtual en píxeles.
  • <height>: La altura de la clave virtual en píxeles.

Todas las coordenadas y los tamaños se especifican en términos del sistema de coordenadas de la pantalla.

Este es un archivo de mapa de claves virtuales escrito en una 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 claves 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. Por lo tanto, todos las claves virtuales cuentan con una entrada <centerY> de 835, que está un poco por debajo el área visible de la pantalla táctil.

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

Ejemplo

Archivo de mapa de claves 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 clave: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Gestos indirectos de puntero multitáctil

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

  • Presionar con un solo dedo: hacer clic.
  • Movimiento con un solo dedo: Mueve el puntero.
  • Movimiento con un solo dedo y pulsaciones del botón: 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 con dos dedos que se mueven entre sí o se separan diferentes direcciones: desplazamiento lateral, ajuste de escala y rotación del área que rodea al puntero. El puntero en sí no se mueve.
  • Movimiento con varios dedos: gesto de forma libre.

Rechazo de la palma

A partir de Android 13, el sistema puede rechazar automáticamente las entradas de las palmas cuando se habilita el framework integrado. Las soluciones internas y personalizadas siguen siendo compatibles, aunque es posible que debas modificarlos para mostrar la marca TOOL_TYPE_PALM cuando se muestre si detecta posibles problemas. El framework integrado también funciona en conjunto con soluciones personalizadas.

El modelo real observa los primeros 90 ms de datos de gestos, el puntero actual y los a los punteros circundantes y, luego, considera qué tan lejos están los toques táctiles del borde de la pantalla. Luego determina, por puntero, cuáles de los punteros son palmas. También se tienen en cuenta cuenta el tamaño de cada contacto, según lo informa touchMajor y touchMinor El framework de Android luego quita los punteros marcados como palmas de la mano del flujo táctil.

Si ya se envió un puntero a las apps, el sistema hará lo siguiente:

  • (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 la capa el evento no debería activar la acción del usuario. Esta marca se establece en ACTION_CANCEL. y ACTION_POINTER_UP.

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

Habilitar el rechazo de la palma

  1. En el controlador táctil, usa la Macro input_abs_set_res para definir las resoluciones de los siguientes campos (las unidades se 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 no la 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 el siguiente comando:
        $ 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 rechazos de palma en el interior. UnwantedInteractionBlocker Si no es así, revisa los registros relacionados con las entradas 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 permanentemente la función, agrega el comando sysprop correspondiente en tu init**rc archivo:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Lecturas adicionales