Dispositivos táctiles

Android admite una variedad de pantallas táctiles y paneles táctiles, incluidas tabletas digitalizadoras basadas en lápiz óptico.

Las pantallas táctiles son dispositivos táctiles asociados con una pantalla de modo que el usuario tiene 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 tableta digitalizadora. Los paneles táctiles se utilizan normalmente para señalar o para posicionamiento indirecto absoluto o control basado en gestos de una interfaz de usuario.

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

Los dispositivos táctiles a veces se pueden manipular utilizando una variedad de herramientas diferentes, como dedos o un lápiz, según la tecnología de sensor táctil subyacente.

A veces se utilizan dispositivos táctiles para implementar claves 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 un doble propósito como parte de un teclado sensible al tacto.

Debido a la gran variedad de dispositivos táctiles, Android se apoya 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 dispositivo multitáctil si se cumplen las dos condiciones siguientes:

  • 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 botones de gamepad. Esta condición resuelve una ambigüedad con ciertos gamepads que informan ejes con códigos que se superponen a los de los ejes MT.

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

  • El dispositivo de entrada no está clasificado como dispositivo multitáctil. Un dispositivo de entrada se clasifica como dispositivo de un solo toque o como dispositivo multitáctil, nunca ambos.
  • El dispositivo de entrada informa la presencia de los ejes absolutos ABS_X y ABS_Y , y la presencia del código clave BTN_TOUCH .

Cuando un dispositivo de entrada se clasifica como dispositivo táctil, la presencia de claves virtuales se determina intentando cargar el archivo de mapa de claves virtuales para el dispositivo. Si hay disponible un mapa de claves virtual, también se carga el archivo de diseño de claves para el dispositivo. Consulte [Archivos de mapas de claves virtuales](#archivos-de-mapas-de-claves-virtuales) 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 ningún archivo de configuración del dispositivo de entrada, el sistema elige una configuración predeterminada que sea apropiada para periféricos táctiles de uso general, como pantallas táctiles o 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.

Una vez cargada la configuración del dispositivo de entrada, el sistema clasifica el dispositivo de entrada como pantalla táctil , panel táctil o dispositivo de puntero .

  • Se utiliza un dispositivo de pantalla táctil para la manipulación directa de objetos en la pantalla. El usuario toca directamente la pantalla, por lo que el sistema no requiere ningún elemento adicional para indicar los objetos que está manipulando.
  • Se utiliza un dispositivo de panel táctil para proporcionar información de posicionamiento absoluto a una aplicación sobre los toques en un área de sensor determinada. Puede resultar útil para tabletas digitalizadoras.
  • Un dispositivo puntero se utiliza para la manipulación indirecta de objetos en la pantalla mediante un cursor. Los dedos se interpretan como gestos de puntero multitáctiles. Otras herramientas, como los lápices ópticos, se interpretan utilizando posiciones absolutas. Consulte Gestos de puntero multitáctil indirectos para obtener más información.

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

  • Si se establece la propiedad touch.deviceType , entonces 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 EVIOCGPROP ioctl), entonces el tipo de dispositivo se configura 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 EVIOCGPROP ioctl), entonces el tipo de dispositivo se establece en puntero .
  • Si el dispositivo de entrada informa la presencia de los ejes relativos REL_X o REL_Y , entonces el tipo de dispositivo está configurado 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 utiliza para controlar el puntero porque 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 han sido designados para ningún otro propósito especial controlen el puntero.

Botones

Los botones son controles opcionales que las aplicaciones 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 utilizan principalmente con dispositivos táctiles de tipo puntero o con un lápiz óptico.

Se admiten los siguientes botones:

  • BTN_LEFT : asignado a MotionEvent.BUTTON_PRIMARY .
  • BTN_RIGHT : asignado a MotionEvent.BUTTON_SECONDARY .
  • BTN_MIDDLE : asignado a MotionEvent.BUTTON_MIDDLE .
  • BTN_BACK y BTN_SIDE : asignados a MotionEvent.BUTTON_BACK . Al presionar 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 : asignados a MotionEvent.BUTTON_FORWARD . Al presionar este botón también se sintetiza una pulsación de tecla con el código de tecla KeyEvent.KEYCODE_FORWARD .
  • BTN_STYLUS : asignado a MotionEvent.BUTTON_SECONDARY .
  • BTN_STYLUS2 : asignado a MotionEvent.BUTTON_TERTIARY .

Herramientas y tipos de herramientas.

Una herramienta es un dedo, un lápiz óptico u otro aparato que se utiliza 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 MotionEvent , una herramienta suele denominarse puntero .

Se admiten los siguientes tipos de herramientas:

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

Herramientas flotantes versus herramientas táctiles

Las herramientas pueden estar en contacto con el dispositivo táctil o dentro del alcance y flotando sobre él. No todos los dispositivos táctiles pueden detectar la presencia de una herramienta flotando sobre el dispositivo táctil. Aquellos que lo hacen, como los digitalizadores de lápiz basados ​​en RF, a menudo pueden detectar cuando la herramienta se encuentra dentro de un rango limitado del digitalizador.

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

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

Las herramientas flotantes se informan a las aplicaciones como eventos de movimiento genéricos mediante MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE y MotionEvent.ACTION_HOVER_EXIT .

Requisitos del controlador del dispositivo táctil

  • Los controladores de dispositivos táctiles deben registrar solo los ejes y códigos de clave para los ejes y botones que admiten. El registro de ejes o códigos clave no compatibles puede confundir el algoritmo de clasificación del dispositivo o hacer que el sistema detecte incorrectamente las capacidades del dispositivo. Por ejemplo, si el dispositivo informa el código de tecla BTN_TOUCH , el sistema asume que BTN_TOUCH siempre se usa para indicar si la herramienta está tocando la pantalla. Por lo tanto, BTN_TOUCH no debe usarse para indicar que la herramienta está simplemente dentro del alcance y flotando.
  • Los dispositivos de un solo toque utilizan los siguientes eventos de entrada de Linux:
    • ABS_X : (REQUERIDO) Informa la coordenada X de la herramienta.
    • ABS_Y : (REQUERIDO) Informa la coordenada Y de la herramienta.
    • ABS_PRESSURE : (opcional) Informa la presión física aplicada a la punta de la herramienta o la intensidad de la señal del contacto táctil.
    • ABS_TOOL_WIDTH : (opcional) Informa el área de la sección transversal o el ancho del contacto táctil o de la herramienta misma.
    • 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 : (REQUERIDO) 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) Estados del botón de informes.
    • 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 multitáctiles utilizan los siguientes eventos de entrada de Linux:
    • ABS_MT_POSITION_X : (REQUERIDO) Informa la coordenada X de la herramienta.
    • ABS_MT_POSITION_Y : (REQUERIDO) Informa la coordenada Y de la herramienta.
    • ABS_MT_PRESSURE : (opcional) Informa la presión física aplicada 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 de la sección 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 debe usarse si ABS_MT_TOUCH_MAJOR informa una medición de área.
    • ABS_MT_WIDTH_MAJOR : (opcional) Informa el área de la sección transversal de la propia herramienta, o la longitud de la dimensión más larga de la propia herramienta. No utilice este eje a menos que conozca las dimensiones de la herramienta.
    • ABS_MT_WIDTH_MINOR : (opcional) Informa la longitud de la dimensión más corta de la propia herramienta. Este eje no debe usarse si ABS_MT_WIDTH_MAJOR informa una medición de área o si se desconocen las dimensiones de la herramienta en sí.
    • 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 arbitrario no negativo que se utiliza para identificar y realizar un seguimiento de cada herramienta de forma independiente cuando hay varias herramientas activas. Por ejemplo, cuando varios dedos tocan el dispositivo, a cada dedo se le debe asignar una identificación de seguimiento distinta que se utiliza mientras el dedo permanezca en contacto. Los ID de seguimiento se pueden reutilizar cuando sus herramientas asociadas salen del alcance.
    • ABS_MT_SLOT : (opcional) Informa el ID de ranura de la herramienta, cuando se utiliza el protocolo multitáctil de Linux 'B'. Consulte la documentación del protocolo multitáctil de Linux para obtener más detalles.
    • BTN_TOUCH : (REQUERIDO) 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) Estados del botón de informes.
    • 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 ejes para el protocolo de un solo toque y multitáctil, solo se utilizan los ejes multitáctiles y se ignoran 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.

    Para 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 la pantalla de acuerdo con 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 entregan a las aplicaciones, pero pueden usarse para teclas virtuales.

    Los toques que se inician dentro del área activa, o que entran y salen del área de visualización, se entregan a las aplicaciones. En consecuencia, si un toque comienza dentro de los límites de una aplicación y luego se mueve fuera del área activa, la aplicación podría recibir eventos táctiles con coordenadas de visualización negativas o más allá de los límites de la pantalla. Este es el comportamiento esperado.

    Un dispositivo táctil nunca debe fijar las coordenadas táctiles en los límites del área activa. Si un toque sale del área activa, se debe informar como si estuviera 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, podría informar una coordenada de (minX, minY). Si el dedo continúa moviéndose más fuera 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 debería informar (minX, minY) cuando el dedo del usuario realmente toca fuera del área activa.

    Sujetar las coordenadas táctiles al borde de la pantalla crea un límite duro artificial alrededor del borde de la pantalla que impide que el sistema rastree suavemente los movimientos que entran o salen de los límites del área de la pantalla.

  • 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 en caso contrario para indicar que la herramienta está flotando.

    Informar la información sobre la presión es opcional , pero se recomienda encarecidamente. Las aplicaciones pueden utilizar 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 deben ser distintos de cero cuando la herramienta toca el dispositivo y cero en caso contrario, pero esto no es necesario. Por ejemplo, el dispositivo táctil podría medir el tamaño de los contactos táctiles de los dedos, pero no los contactos táctiles del lápiz.

    La información sobre el tamaño del informe es opcional , pero se recomienda encarecidamente. Las aplicaciones pueden utilizar 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 permanecer distinta de cero incluso cuando la herramienta está en contacto directo. Los valores exactos informados dependen de la forma en que el hardware mide la distancia.

    Enviar información sobre la distancia es opcional , pero se recomienda para dispositivos de lápiz óptico.

  • Los valores informados por 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 mantiene inclinada.

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

    Informar la información de inclinación es opcional , pero se recomienda para dispositivos de lápiz.

  • Si ABS_MT_TOOL_TYPE informa el tipo de herramienta, reemplaza cualquier información de tipo de herramienta informada por BTN_TOOL_* . Si no hay ninguna información sobre el tipo de herramienta disponible, el tipo de herramienta predeterminado es 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 necesita tener al menos cierta información sobre la naturaleza de la herramienta, ya sea que esté en contacto 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 utiliza el protocolo multitáctil 'A', la herramienta está activa siempre 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 utiliza el protocolo multitáctil 'B', la herramienta está activa siempre que tenga una ranura activa. Cuando la ranura se borra, la herramienta deja de existir.
  • Se determina que una herramienta está suspendida en función de las siguientes condiciones:
    • Si la herramienta es BTN_TOOL_MOUSE o BTN_TOOL_LENS , entonces la herramienta no está suspendida, incluso si se cumple alguna de las siguientes condiciones.
    • Si la herramienta está activa y el conductor informa información de presión, y la presión informada es cero, entonces la herramienta está suspendida.
    • Si la herramienta está activa y el controlador admite el código de clave BTN_TOUCH y BTN_TOUCH tiene un valor de cero, entonces la herramienta está suspendida.
  • InputReader admite los protocolos multitáctiles 'A' y 'B'. Los nuevos controladores deberían utilizar el protocolo 'B' pero cualquiera de los dos funciona.
  • A partir de Android 4.0, es posible que sea necesario cambiar los controladores de la pantalla táctil para cumplir con la especificación del protocolo de entrada de Linux.

    Es posible que se requieran los siguientes cambios:

    • Cuando una herramienta queda inactiva (el dedo sube "hacia arriba"), debería dejar de aparecer en los informes de sincronización multitáctil posteriores. Cuando todas las herramientas quedan inactivas (todos los dedos se "arriban"), 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 se informaran eventos "up" 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 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 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 del tamaño táctil debe informarse mediante ABS_MT_TOUCH_MAJOR .

      Las versiones anteriores de Android recuperaron 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 confiar en el protocolo de entrada estándar de Linux, Android puede admitir una variedad más amplia de periféricos táctiles, como pantallas táctiles multitáctiles HID externas, utilizando controladores no modificados.

Operación del dispositivo táctil

El siguiente es 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 sobre la posición y otras características de cada herramienta. También rastrea los estados de los botones.
  3. Si se presionó o soltó BACK o FORWARD , InputReader notifica InputDispatcher sobre el evento clave.
  4. InputReader determina si se presionó una tecla virtual. Si es así, notifica InputDispatcher sobre el evento clave.
  5. InputReader determina si el toque se inició dentro de los límites de la pantalla. Si es así, notifica InputDispatcher sobre el evento táctil.
  6. Si no hay herramientas táctiles pero hay al menos una herramienta de desplazamiento, InputReader notifica 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 lo ubica en consecuencia 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 aplicaciones apropiadas.

Configuración del dispositivo táctil

El comportamiento del dispositivo táctil está determinado por los ejes, botones, propiedades de entrada, configuración del dispositivo de entrada, mapa de teclas virtuales y diseño de teclas del dispositivo.

Consulte 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 del dispositivo de entrada para configurar y calibrar el comportamiento del dispositivo táctil.

Una razón para esto es que los controladores de dispositivos táctiles a menudo informan las características de los toques utilizando unidades específicas del dispositivo.

Por ejemplo, muchos dispositivos táctiles miden el área de contacto táctil utilizando una escala interna específica del dispositivo, como el número total de nodos sensores que fueron activados por el toque. Este valor de tamaño bruto no sería significativo para las aplicaciones porque necesitarían conocer el tamaño físico y otras características de los nodos sensores del dispositivo táctil.

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

Convenciones de documentación

Para fines de documentación, utilizamos las siguientes convenciones para describir los valores utilizados por el sistema durante el proceso de calibración.

Valores de eje sin procesar

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

raw.x
El valor del eje ABS_X o ABS_MT_POSITION_X .
raw.y
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
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 está disponible.
raw.orientation
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
El valor del eje ABS_TILT_X , o 0 si no está disponible.
raw.tiltY
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 EVIOCGABS ioctl para cada eje.

raw.*.min
El valor mínimo inclusivo del eje sin formato.
raw.*.max
El valor máximo inclusivo del eje sin formato.
raw.*.range
Equivalente a raw.*.max - raw.*.min .
raw.*.fuzz
La precisión del eje bruto. p.ej. fuzz = 1 implica que los valores tienen una precisión de +/- 1 unidad.
raw.width
El ancho inclusivo del área táctil, equivalente a raw.x.range + 1 .
raw.height
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 utiliza interpolación lineal para traducir la información de la posición táctil de las unidades de superficie utilizadas por el dispositivo táctil a las unidades de salida que se informan a aplicaciones como los píxeles de la pantalla.

output.width
El ancho de salida. Para pantallas táctiles (asociadas con una pantalla), este es el ancho de la pantalla en píxeles. Para 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
La altura de salida. Para pantallas táctiles (asociadas con una pantalla), esta es la altura de la pantalla en píxeles. Para 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
La longitud diagonal del sistema de coordenadas de salida, equivalente a sqrt(output.width ^2 + output.height ^2) .

Configuracion basica

El asignador de entrada táctil utiliza muchas propiedades de configuración en el archivo de configuración del dispositivo de entrada para especificar valores de calibración. La siguiente tabla describe algunas propiedades de configuración de propósito general. Todas las demás propiedades se describen en las siguientes secciones junto con los campos que se utilizan para calibrar.

tipo de dispositivo táctil

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 a una pantalla y sus movimientos se utilizan 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.

Consulte 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 informadas por el dispositivo táctil giran 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 a los cambios de orientación de la pantalla.

El valor predeterminado es 1 si el dispositivo es una pantalla táctil, 0 en caso contrario.

El sistema distingue entre pantallas y visualizadores táctiles internos y externos. Una pantalla táctil interna con reconocimiento de orientación gira según la orientación de la pantalla interna. Una pantalla táctil externa con reconocimiento de orientación gira según la orientación de la pantalla externa.

El reconocimiento de la orientación se utiliza para admitir la rotación de pantallas táctiles en dispositivos como el Nexus One. Por ejemplo, cuando el dispositivo se gira 90 grados en el sentido de las agujas 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 absolutas de la pantalla táctil se informa como un toque en la esquina superior izquierda. esquina del sistema de coordenadas girado de la pantalla. Esto se hace para que los toques se informen con el mismo sistema de coordenadas que utilizan las aplicaciones para dibujar sus elementos visuales.

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

toque.gestoModo

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

Especifica el modo de presentación de los gestos del puntero. Esta propiedad de configuración solo es relevante cuando el dispositivo táctil es de 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 , los gestos del panel táctil se presentan mediante 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 , o spots caso contrario.

Campos X e Y

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

Cálculo

El cálculo es sencillo: la información posicional del controlador táctil se interpola 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 toque más grande posible que el dispositivo táctil puede detectar. 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 de sección transversal de la herramienta.

Si el tamaño táctil no está disponible pero el tamaño de la herramienta sí lo está, entonces el tamaño de la herramienta se establece igual al tamaño táctil. Por el contrario, si el tamaño de la herramienta no está disponible pero el tamaño táctil sí lo está, entonces el tamaño táctil se establece 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 medición utilizada por el controlador táctil para informar el tamaño táctil 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 herramienta.

  • Si el valor es area , se supone que el tamaño es proporcional al área del toque o 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 .

toque.tamaño.escala

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

Especifica un factor de escala constante utilizado en la calibración.

El valor predeterminado es 1.0 .

toque.tamaño.bias

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

Especifica un valor de polarización 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 los contactos activos o se informa individualmente 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 , el tamaño informado se utiliza tal cual.

El valor predeterminado es 0 .

Algunos dispositivos táctiles, en particular los dispositivos "Semi-MT", no pueden distinguir las dimensiones individuales de múltiples contactos, por lo que informan una medida de tamaño que representa su área o ancho total. Esta propiedad sólo debe establecerse en 1 para dichos dispositivos. En caso de duda, establezca 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 aplicada al dispositivo táctil como un valor normalizado entre 0,0 (sin contacto) y 1,0 (fuerza total).

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

calibración.de.presión.táctil

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

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

  • Si el valor es none , la presión se desconoce, por lo que se establece en 1,0 al tocar y en 0,0 al pasar el cursor.

  • 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 está relacionada con el tamaño del contacto y la presión aplicada.

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

escala.de.presion.tactil

Definition: touch.pressure.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 / raw.pressure.max .

Cálculo

The calculation of the pressure field depends on the specified calibration parameters.

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

orientation and tilt fields

The orientation field describes the orientation of the touch and tool as an angular measurement. An orientation of 0 indicates that the major axis is oriented vertically, -PI/2 indicates that the major axis is oriented to the left, PI/2 indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range can be described in a full circle range from -PI or PI .

The tilt field describes the inclination of the tool as an angular measurement. A tilt of 0 indicates that the tool is perpendicular to the surface. A tilt of PI/2 indicates that the tool is flat on the surface.

touch.orientation.calibration

Definition: touch.orientation.calibration = none | interpolated | vector | default

Specifies the kind of measurement used by the touch driver to report the orientation.

  • If the value is none , the orientation is unknown so it is set to 0.
  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .
  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.
  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Cálculo

The calculation of the orientation and tilt fields depends on the specified calibration parameters and available input.

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

distance field

The distance field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.

touch.distance.calibration

Definition: touch.distance.calibration = none | scaled | default

Specifies the kind of measurement used by the touch driver to report the distance.

  • If the value is none , the distance is unknown so it is set to 0.

  • If the value is scaled , the reported distance is multiplied by a constant scale factor.

  • If the value is default , the system uses the scaled calibration if the distance axis available, otherwise uses none .

touch.distance.scale

Definition: touch.distance.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Cálculo

The calculation of the distance field depends on the specified calibration parameters.

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

Compatibility notes

The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.

Older touch device drivers might also need to be updated.

Virtual key map files

Touch devices are often used to implement virtual keys.

There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.

When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename> as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely .

A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.

In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION ).

Syntax

A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.

Comment lines begin with '#' and continue to the end of the line.

Each virtual key is described by 6 colon-delimited components:

  • 0x01 : A version code. Must always be 0x01 .
  • <Linux key code>: The Linux key code of the virtual key.
  • <centerX>: The X pixel coordinate of the center of the virtual key.
  • <centerY>: The Y pixel coordinate of the center of the virtual key.
  • <width>: The width of the virtual key in pixels.
  • <height>: The height of the virtual key in pixels.

All coordinates and sizes are specified in terms of the display coordinate system.

Here is a virtual key map file all written on one line.

# 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

The same virtual key map file can also be written on multiple lines.

# 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

In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.

The first key has a Linux scan code of 158 ( KEY_BACK ), centerX of 55 , centerY of 835 , width of 90 , and height of 55 .

Ejemplo

Virtual key map file: /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

Key layout file: /system/usr/keylayout/touchyfeely.kl .

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

Key character map file: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirect multi-touch pointer gestures

In pointer mode, the system interprets the following gestures:

  • Single finger tap: click.
  • Single finger motion: move the pointer.
  • Single finger motion plus button presses: drag the pointer.
  • Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
  • Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
  • Multiple finger motion: freeform gesture.

Palm rejection

As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.

The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor and touchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

If a pointer was already sent to the apps, then the system either:

  • (If there are other active pointers) Cancels the pointer with ACTION_POINTER_UP and FLAG_CANCELED set.
  • (If this is the only pointer) Cancels the pointer with ACTION_CANCEL .

A public API, MotionEvent.FLAG_CANCELED , indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL and ACTION_POINTER_UP .

If the palm pointer wasn't sent to apps, then the system simply drops the pointer.

Enable palm rejection

  1. In your touch driver, use the input_abs_set_res macro to set the resolutions for the following fields (units are pixels per mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Support for ABS_MT_TOUCH_MINOR is optional. However, if your device does support it, make sure the resolution is set correctly.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . If it doesn't, check the input-related logs to find clues on what might be misconfigured.

    See the following example for reference:

    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. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Further reading