Android admite diferentes tipos de pantallas y paneles táctiles, incluidas tablets digitalizadoras basadas en plumas stylus.
Las pantallas táctiles son dispositivos táctiles asociados con una pantalla de modo que el usuario tenga la impresión de manipular directamente los elementos en la pantalla.
Los paneles táctiles son dispositivos táctiles que no están asociados con una pantalla, como una tablet digitalizadora. Por lo general, los paneles táctiles se usan para señalar o para el posicionamiento indirecto absoluto o el control basado en gestos de una interfaz de usuario.
Los dispositivos táctiles pueden tener botones cuyas funciones son similares a las de los botones del mouse.
A veces, los dispositivos táctiles se pueden manipular con una variedad de herramientas, como los dedos o una pluma stylus, según la tecnología subyacente del sensor táctil.
A veces, los dispositivos táctiles se usan para implementar teclas virtuales. Por ejemplo, en algunos dispositivos Android, el área del sensor de la pantalla táctil se extiende más allá del borde de la pantalla y 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 se cumplen las siguientes condiciones:
- El dispositivo de entrada informa la presencia de los ejes absolutos
ABS_MT_POSITION_X
yABS_MT_POSITION_Y
. - El dispositivo de entrada no tiene ningún botón de control de juegos. Esta condición resuelve una ambigüedad con ciertos gamepads que informan ejes con códigos que se superponen con los de los ejes MT.
Un dispositivo de entrada se clasifica como un dispositivo de un solo toque si se cumplen estas dos condiciones:
- El dispositivo de entrada no se clasifica como dispositivo multitáctil. Un dispositivo de entrada se clasifica como dispositivo de un solo toque o de varios toques, nunca ambos.
- El dispositivo de entrada informa la presencia de los ejes absolutos
ABS_X
yABS_Y
, y la presencia del código de teclaBTN_TOUCH
.
Cuando un dispositivo de entrada se clasifica como dispositivo táctil, la presencia de teclas virtuales se determina mediante un intento de cargar el archivo de mapa de teclas virtuales del dispositivo. Si hay un mapa de teclas virtual disponible, también se carga el archivo de diseño de teclas del 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 elige una configuración predeterminada que es adecuada 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 generar un comportamiento incorrecto.
Después de cargar la configuración del dispositivo de entrada, el sistema lo clasifica como pantalla táctil, panel táctil o dispositivo puntero.
- Un dispositivo con pantalla táctil se usa para manipular objetos directamente en la pantalla. El usuario toca directamente la pantalla, por lo que el sistema no requiere indicaciones adicionales para indicar los objetos que se manipulan.
- Un dispositivo teclado táctil se usa para proporcionar información de posicionamiento absoluto a una app sobre los toques en un área del sensor determinada. Puede ser útil para las tablets de digitalización.
- Un dispositivo de puntero se usa para manipular objetos de forma indirecta en la pantalla con un cursor. Los dedos se interpretan como gestos de puntero multitáctil. Otras herramientas, como las plumas stylus, se interpretan con posiciones absolutas. Consulta Gestos de puntero indirecto de varios toques para obtener más información.
Las siguientes reglas se usan para clasificar el dispositivo de entrada como una pantalla táctil, un panel táctil o un dispositivo de puntero.
- Si se establece la propiedad
touch.deviceType
, el tipo de dispositivo se establece como se indica. - Si el dispositivo de entrada informa la presencia de la propiedad de entrada
INPUT_PROP_DIRECT
(a través del ioctlEVIOCGPROP
), el tipo de dispositivo se establece en pantalla táctil. Esta condición supone que los dispositivos táctiles de entrada directa están conectados a una pantalla que también está conectada. - Si el dispositivo de entrada informa la presencia de la propiedad de entrada
INPUT_PROP_POINTER
(a través del ioctlEVIOCGPROP
), el tipo de dispositivo se establece en puntero. - Si el dispositivo de entrada informa la presencia de los ejes relativos
REL_X
oREL_Y
, el tipo de dispositivo se establece en teclado 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, la almohadilla 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. Este valor predeterminado garantiza que los paneles táctiles que no se hayan designado para ningún otro propósito especial controlen el puntero.
Botones
Los botones son controles opcionales que las apps pueden usar para realizar funciones adicionales. Los botones de los dispositivos táctiles se comportan de manera similar a los botones del mouse y se usan principalmente con dispositivos táctiles tipo puntero o con una pluma stylus.
Se admiten los siguientes botones:
BTN_LEFT
: Se asignó aMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: Se asignó aMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: Se asignó aMotionEvent.BUTTON_MIDDLE
.BTN_BACK
yBTN_SIDE
: Se asignaron aMotionEvent.BUTTON_BACK
. Si presionas este botón, también se sintetiza una presión de tecla con el código de teclaKeyEvent.KEYCODE_BACK
.BTN_FORWARD
yBTN_EXTRA
: Se asignan aMotionEvent.BUTTON_FORWARD
. Si presionas este botón, también se sintetiza una pulsación de tecla con el código de teclaKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: Se asignó aMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: Se asigna aMotionEvent.BUTTON_TERTIARY
.
Herramientas y tipos de herramientas
Una herramienta es un dedo, una pluma stylus o algún otro aparato que se usa para interactuar con el dispositivo táctil. Algunos dispositivos táctiles pueden distinguir entre diferentes tipos de herramientas.
En otros lugares de Android, como en la API de MotionEvent
, a menudo se hace referencia a una herramienta como un puntero.
Se admiten los siguientes tipos de herramientas:
BTN_TOOL_FINGER
yMT_TOOL_FINGER
: Se asignaron aMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
yMT_TOOL_PEN
: Se asignan aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: Se asigna aMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: Se asigna aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: Se asigna aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: Se asigna aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: Se asigna aMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: Se asignó aMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
yBTN_TOOL_QUADTAP
: Se asignan aMotionEvent.TOOL_TYPE_FINGER
.
Herramientas de desplazamiento frente a herramientas de toque
Las herramientas pueden estar en contacto con el dispositivo táctil o dentro del alcance y colocarse sobre él. No todos los dispositivos táctiles pueden detectar la presencia de una herramienta que se desplaza sobre el dispositivo táctil. Los que sí lo hacen, como los digitalizadores de pluma stylus basados en RF, a menudo pueden detectar cuando la herramienta está dentro de un rango limitado del digitalizador.
El componente InputReader
distingue las herramientas de toque de las herramientas de desplazamiento. Del mismo modo, las herramientas de toque y las herramientas de desplazamiento se informan a las apps de diferentes maneras.
Las herramientas de tacto se informan a las apps como eventos de tacto con MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
y MotionEvent.ACTION_POINTER_UP
.
Las herramientas de desplazamiento se informan a las apps como eventos de movimiento genéricos con MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
y MotionEvent.ACTION_HOVER_EXIT
.
Requisitos del controlador de dispositivos táctiles
- Los controladores de dispositivos táctiles deben registrar solo los ejes y los códigos de teclas de los ejes y los botones que admiten. El registro de ejes o códigos de teclas no compatibles puede confundir el algoritmo de clasificación de dispositivos 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 supone queBTN_TOUCH
siempre se usa para indicar si la herramienta está tocando la pantalla. Por lo tanto, no se debe usarBTN_TOUCH
para indicar que la herramienta solo está en el rango y se coloca sobre él. - Los dispositivos de un solo toque usan los siguientes eventos de entrada de Linux:
ABS_X
: (OBLIGATORIO) Informa la coordenada X de la herramienta.ABS_Y
: (OBLIGATORIO) Informa la coordenada Y de la herramienta.ABS_PRESSURE
: (Opcional) Informa la presión física 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 transversal o el ancho del contacto táctil o de la herramienta.ABS_DISTANCE
: (opcional) Informa la distancia de la herramienta desde la superficie del dispositivo táctil.ABS_TILT_X
: (opcional) Informa la inclinación de la herramienta desde la superficie del dispositivo táctil a lo largo del eje X.ABS_TILT_Y
: (Opcional) Informa la inclinación de la herramienta desde la superficie del dispositivo táctil a lo largo del eje Y.BTN_TOUCH
: (OBLIGATORIO) Indica si la herramienta está en contacto con 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 usan los siguientes eventos de entrada de Linux:
ABS_MT_POSITION_X
: (OBLIGATORIO) Informa la coordenada X de la herramienta.ABS_MT_POSITION_Y
: (OBLIGATORIO) Informa la coordenada Y de la herramienta.ABS_MT_PRESSURE
: (opcional) Informa la presión física 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 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. No se debe usar este eje siABS_MT_TOUCH_MAJOR
informa una medición de área.ABS_MT_WIDTH_MAJOR
: (opcional) Informa el área transversal de la herramienta o la longitud de la dimensión más larga de la herramienta. No uses este eje a menos que conozcas las dimensiones de la herramienta en sí.ABS_MT_WIDTH_MINOR
: (opcional) Informa la longitud de la dimensión más corta de la herramienta. No se debe usar este eje siABS_MT_WIDTH_MAJOR
informa una medición de área o si se desconocen las dimensiones de la herramienta.ABS_MT_ORIENTATION
: (opcional) Informa la orientación de la herramienta.ABS_MT_DISTANCE
: (opcional) Informa la distancia de la herramienta desde la superficie del dispositivo táctil.ABS_MT_TOOL_TYPE
: (opcional) Informa el tipo de herramienta comoMT_TOOL_FINGER
oMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (opcional) Informa el ID de seguimiento de la herramienta. El ID de seguimiento es un número entero no negativo arbitrario que se usa para identificar y hacer un seguimiento de cada herramienta de forma independiente cuando hay varias herramientas activas. Por ejemplo, cuando varios dedos tocan el dispositivo, a cada uno se le debe asignar un ID de seguimiento distinto que se use mientras el dedo permanezca en contacto. Los IDs de seguimiento se pueden volver a usar cuando sus herramientas asociadas salen del alcance.ABS_MT_SLOT
: (opcional) Informa el ID de la ranura de la herramienta cuando se usa el protocolo multitáctil "B" de Linux. Consulta la documentación del protocolo multitáctil de Linux para obtener más detalles.BTN_TOUCH
: (OBLIGATORIO) Indica si la herramienta está tocando el dispositivo.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (Opcional) 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 tanto para el protocolo de un solo toque como para el de varios toques, solo se usarán los de varios puntos de contacto y se ignorarán los de un solo toque.
Los valores mínimo y máximo de los ejes
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
yABS_MT_POSITION_Y
definen los límites del área activa del dispositivo en unidades de superficie específicas del dispositivo. En el caso de una pantalla táctil, el área activa describe la parte del dispositivo táctil que realmente cubre la pantalla.En el caso de una pantalla táctil, el sistema interpola automáticamente las posiciones táctiles informadas en unidades de superficie para obtener posiciones táctiles en píxeles de pantalla según el siguiente cálculo:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Una pantalla táctil 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 pueden usar para las teclas virtuales.
Los toques que se inician dentro del área activa o que entran y salen del área de visualización se entregan a las apps. En consecuencia, si un toque comienza dentro de los límites de una app y, luego, se mueve fuera del área activa, la app podría recibir eventos táctiles con coordenadas de pantalla negativas o más allá de los límites de la pantalla. Este es el comportamiento esperado.
Un dispositivo táctil nunca debe restringir las coordenadas táctiles a los límites del área activa. Si un toque sale del área activa, se debe informar que está fuera de esta área o no se debe informar en absoluto.
Por ejemplo, si el dedo del usuario está cerca de la esquina superior izquierda de la pantalla táctil, es posible que se informe una coordenada de (minX, minY). Si el dedo continúa moviéndose más allá del área activa, la pantalla táctil debería comenzar a informar coordenadas con componentes inferiores 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 debe informar (minX, minY) cuando el dedo del usuario realmente está tocando fuera del área activa.
La fijación de coordenadas táctiles al borde de la pantalla crea un límite artificial rígido alrededor del borde de la pantalla que impide que el sistema realice un seguimiento fluido de los movimientos que entran o salen de los límites del área de visualización.
Los valores que informan
ABS_PRESSURE
oABS_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á suspendida.Informar la información de presión es opcional, pero se recomienda. Las apps pueden usar información sobre la presión para implementar dibujos sensibles a la presión y otros efectos.
Los valores que informan
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
oABS_MT_WIDTH_MINOR
no deben ser cero cuando la herramienta toca el dispositivo y cero en caso contrario, pero esto no es obligatorio. Por ejemplo, el dispositivo táctil podría medir el tamaño de los contactos táctiles de los dedos, pero no los contactos táctiles de la pluma stylus.La información del tamaño de los informes es opcional, pero se recomienda. Las apps pueden usar la información de presión para implementar dibujos sensibles al tamaño y otros efectos.
Los valores que informan
ABS_DISTANCE
oABS_MT_DISTANCE
deberían 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 que se informan dependen de la forma en que el hardware mide la distancia.Informar la información de distancia es opcional, pero se recomienda para dispositivos de pluma stylus.
Los valores que informan
ABS_TILT_X
yABS_TILT_Y
deben ser cero cuando la herramienta es perpendicular al dispositivo. Una inclinación distinta de cero indica que la herramienta se sostiene en una pendiente.Se supone que los ángulos de inclinación a lo largo de los ejes X e Y se especifican en grados desde la perpendicular.
(max + min) / 2
proporciona el punto central (perfectamente perpendicular) para cada eje. Los valores más pequeños que el punto central representan una inclinación hacia arriba o hacia la izquierda, y los valores más grandes que el punto central representan una inclinación hacia abajo o hacia la derecha.InputReader
convierte los componentes de inclinación X e Y en un ángulo de inclinación perpendicular que va de 0 aPI / 2
radianes y un ángulo de orientación planar que va de-PI
aPI
radianes. Esta representación genera una descripción de la orientación que es compatible con lo que se usa para describir los toques de los dedos.Informar la información de inclinación es opcional, pero se recomienda para dispositivos con pluma stylus.
Si el tipo de herramienta es informado por
ABS_MT_TOOL_TYPE
, este sustituirá cualquier información del tipo de herramienta que informeBTN_TOOL_*
. Si no hay información disponible sobre el tipo de herramienta, el tipo de herramienta predeterminado esMotionEvent.TOOL_TYPE_FINGER
.Se determina que una herramienta está activa en función de las siguientes condiciones:
Cuando se usa el protocolo de un solo toque, la herramienta está activa si
BTN_TOUCH
oBTN_TOOL_*
es 1.Esta condición implica que
InputReader
necesita tener al menos información sobre la naturaleza de la herramienta, ya sea 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 usa el protocolo multitáctil "A", la herramienta está activa cada vez que aparece en el informe de sincronización más reciente. Cuando la herramienta deja de aparecer en los informes de sincronización, deja de existir.
- Cuando se usa el protocolo de varios toques "B", la herramienta está activa siempre que tenga una ranura activa. Cuando se borra el espacio, la herramienta deja de existir.
- Se determina que una herramienta está suspendida según las siguientes condiciones:
- Si la herramienta es
BTN_TOOL_MOUSE
oBTN_TOOL_LENS
, significa que no se coloca el cursor sobre ella, incluso si se cumple alguna de las siguientes condiciones. - Si la herramienta está activa y el controlador informa información de presión, y la presión informada es cero, la herramienta está suspendida.
- Si la herramienta está activa y el controlador admite el código de tecla
BTN_TOUCH
yBTN_TOUCH
tiene un valor de cero, la herramienta está sobre el elemento.
- Si la herramienta es
InputReader
admite los protocolos multitáctiles "A" y "B". Los controladores nuevos deben usar el protocolo "B", pero cualquiera funciona.A partir de Android 4.0, es posible que debas cambiar los controladores de pantalla táctil para que cumplan con la especificación del protocolo de entrada de Linux.
Es posible que se requieran los siguientes cambios:
Cuando una herramienta se vuelve inactiva (el dedo "arriba"), debería dejar de aparecer en los informes de sincronización de varios toques posteriores. Cuando todas las herramientas se vuelven inactivas (todos los dedos se levantan), el controlador debe enviar un paquete de informe de sincronización vacío, como
SYN_MT_REPORT
seguido deSYN_REPORT
.Las versiones anteriores de Android esperaban que se informaran los eventos "arriba" enviando un valor de presión de 0. El comportamiento anterior no era compatible con la especificación del protocolo de entrada de Linux y ya no se admite.
La información de presión física o intensidad de la señal se debe informar con
ABS_MT_PRESSURE
.Las versiones anteriores de Android recuperaban 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 se debe enviar a través de
ABS_MT_TOUCH_MAJOR
.Las versiones anteriores de Android recuperaban información de tamaño de
ABS_MT_TOOL_MAJOR
. El comportamiento anterior no era compatible con la especificación del protocolo de entrada de Linux y ya no se admite.
Operación del dispositivo táctil
A continuación, se incluye un breve resumen del funcionamiento del dispositivo táctil en Android.
EventHub
lee eventos sin procesar del controladorevdev
.InputReader
consume los eventos sin procesar y actualiza el estado interno sobre la posición y otras características de cada herramienta. También realiza un seguimiento de los estados de los botones.- Si se presionó o se soltó BACK o FORWARD,
InputReader
notifica aInputDispatcher
sobre el evento de tecla. InputReader
determina si se produjo una presión de tecla virtual. Si es así, notifica aInputDispatcher
sobre el evento clave.InputReader
determina si el toque se inició dentro de los límites de la pantalla. Si es así, notifica aInputDispatcher
sobre el evento táctil.- Si no hay herramientas de contacto, pero hay al menos una herramienta de desplazamiento,
InputReader
notifica aInputDispatcher
sobre el evento de desplazamiento. - Si el tipo de dispositivo táctil es puntero,
InputReader
realiza la detección de gestos del puntero, mueve el puntero y los puntos según corresponda, y notifica aInputDispatcher
sobre el evento del puntero. InputDispatcher
usaWindowManagerPolicy
para determinar si se deben enviar los eventos y si deben activar el dispositivo. Luego,InputDispatcher
entrega los eventos a las apps correspondientes.
Configuración del dispositivo táctil
El comportamiento del dispositivo táctil se determina según sus ejes, botones, propiedades de entrada, configuración del dispositivo de entrada, mapa de teclas virtual y diseño de teclas.
Consulta las siguientes secciones para obtener más detalles sobre los archivos que participan en la configuración del teclado:
Propiedades
El sistema se basa en muchas propiedades de configuración del dispositivo de entrada para configurar y calibrar el comportamiento del dispositivo táctil.
Uno de los motivos es que los controladores de dispositivos táctiles suelen informar las características de los toques con unidades específicas del dispositivo.
Por ejemplo, muchos dispositivos táctiles miden el área de contacto táctil con una escala interna específica del dispositivo, como la cantidad total de nodos del sensor que se activaron con el toque. Este valor de tamaño sin procesar no sería significativo para las apps, ya que deberían conocer el tamaño físico y otras características de los nodos del sensor del dispositivo táctil.
El sistema usa parámetros de calibración codificados en archivos de configuración del dispositivo de entrada para decodificar, transformar y normalizar los valores que informa el dispositivo táctil en una representación estándar más simple que las apps puedan entender.
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 sin procesar del eje
Las siguientes expresiones denotan los valores sin procesar que informa el controlador de dispositivos táctiles como eventos EV_ABS
.
raw.x
- Es el valor del eje
ABS_X
oABS_MT_POSITION_X
. raw.y
- El valor del eje
ABS_Y
oABS_MT_POSITION_Y
. raw.pressure
- Es el valor del eje
ABS_PRESSURE
oABS_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
- Es el valor del eje
ABS_MT_TOUCH_MINOR
oraw.touchMajor
si no está disponible. raw.toolMajor
- Es el valor del eje
ABS_TOOL_WIDTH
oABS_MT_WIDTH_MAJOR
, o 0 si no está disponible. raw.toolMinor
- Es el valor del eje
ABS_MT_WIDTH_MINOR
, oraw.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
oABS_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
- 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 ioctl EVIOCGABS
para cada eje.
raw.*.min
- El valor mínimo inclusivo del eje sin procesar.
raw.*.max
- Es el valor máximo inclusive 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 precisos dentro de un margen de +/- 1 unidad.
raw.width
- Es el ancho inclusive del área táctil, equivalente a
raw.x.range + 1
. raw.height
- Es la altura inclusiva del área táctil, equivalente a
raw.y.range + 1
.
Rangos de salida
Las siguientes expresiones indican las características del sistema de coordenadas de salida. El sistema usa la interpolación lineal para traducir la información de la posición táctil de las unidades de superficie que usa el dispositivo táctil en las unidades de salida que se informan a las apps, como los píxeles de la pantalla.
output.width
- El ancho de salida. En el caso de las pantallas táctiles (asociadas con una pantalla), este es el ancho de la pantalla en píxeles. En el caso de los paneles táctiles (no asociados con una pantalla), el ancho de salida es igual a
raw.width
, lo que indica que no se realiza ninguna interpolación. output.height
- La altura del resultado. En el caso de las pantallas táctiles (asociadas con una pantalla), esta es la altura de la pantalla en píxeles. En el caso de los paneles táctiles (no asociados con una pantalla), la altura de salida es igual a
raw.height
, lo que indica que no se realiza ninguna interpolación. output.diag
- Es la longitud diagonal del sistema de coordenadas de salida, equivalente a
sqrt(output.width ^2 + output.height ^2)
.
Configuración básica
El asignador de entradas táctiles usa muchas propiedades de configuración en el archivo de configuración del dispositivo de entrada para especificar los valores de calibración. En la siguiente tabla, se describen algunas propiedades de configuración de uso general. Todas las demás propiedades se describen en las siguientes secciones junto con los campos que se usan para calibrar.
Touch.deviceType
Definición: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Especifica el tipo de dispositivo táctil.
-
Si el valor es
touchScreen
, el dispositivo táctil es una pantalla táctil asociada con una pantalla. -
Si el valor es
touchPad
, el dispositivo táctil es un panel táctil 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 de puntero táctil indirecto con varios toques. -
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 de tacto 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 de tacto que informa el dispositivo táctil no se ven afectadas por los cambios de orientación de la pantalla.
El valor predeterminado es 1
si el dispositivo es una pantalla táctil. De lo contrario, es 0
.
El sistema distingue entre pantallas táctiles internas y externas. Una pantalla táctil interna que detecta la orientación se rota según la orientación de la pantalla interna. Una pantalla táctil externa con reconocimiento de orientación rota en función de la orientación de la pantalla externa.
La detección de orientación se usa para admitir la rotación de pantallas táctiles en dispositivos como el Nexus One. Por ejemplo, cuando el dispositivo se rota a la derecha 90 grados respecto de 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 informe como un toque en la esquina superior izquierda del sistema de coordenadas rotado de la pantalla. Esto se hace para que los toques se informen con el mismo sistema de coordenadas que usan las apps para dibujar sus elementos visuales.
Antes de Honeycomb, se asumía que todos los dispositivos táctiles eran conscientes de 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 pointer.
-
Si el valor es
pointer
, los gestos del panel táctil se presentan a través de un cursor similar al puntero del mouse. -
Si el valor es
spots
, los gestos del panel táctil se presentan con un ancla que representa el centroide del gesto y un conjunto de puntos circulares que representan la posición de los dedos individuales.
El valor predeterminado es pointer
cuando se configura la propiedad de entrada INPUT_PROP_SEMI_MT
; de lo contrario, es spots
.
Campos X e Y
Los campos X e Y proporcionan información de posición para el centro del área de contacto.
Cálculo
El cálculo es sencillo: la información de posición del controlador táctil se interpola de forma lineal en el 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 herramienta en unidades de salida (píxeles).
El campo size
describe el tamaño normalizado del toque en relación con el toque más grande posible que puede detectar el dispositivo táctil. El tamaño normalizado más pequeño posible es 0.0 (sin contacto o no se puede medir) y el tamaño normalizado más grande posible es 1.0 (el área del sensor está saturada).
Cuando se puede 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, los campos touchMajor
y touchMinor
son iguales.
Del mismo modo, el campo toolMajor
especifica la dimensión más larga y el campo toolMinor
especifica la dimensión más corta del área transversal de la herramienta.
Si el tamaño táctil no está disponible, pero el tamaño de la herramienta está disponible, 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í, el tamaño táctil se establece igual que el tamaño de la herramienta.
Los dispositivos táctiles miden o informan el tamaño de la herramienta y el tamaño del toque de varias maneras. La implementación actual admite tres tipos diferentes de mediciones: diámetro, área y cuadro de límite geométrico en unidades de superficie.
Definición: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Especifica el tipo de medida que usa 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 ajusta de la misma manera. -
Si el valor es
diameter
, se supone que el tamaño es proporcional al diámetro (ancho) del toque o la herramienta. -
Si el valor es
area
, se supone que el tamaño es proporcional al área del toque o la herramienta. -
Si el valor es
default
, el sistema usa la calibracióngeometric
si el ejeraw.touchMajor
oraw.toolMajor
está disponible; de lo contrario, usa la calibraciónnone
.
touch.size.scale
Definición: touch.size.scale
= <un número de punto flotante no negativo>
Especifica un factor de escala constante que se usa en la calibración.
El valor predeterminado es 1.0
.
touch.size.bias
Definición: touch.size.bias
= <un número de punto flotante no negativo>
Especifica un valor de sesgo constante que se usa en la calibración.
El valor predeterminado es 0.0
.
touch.size.isSummed
Definición: touch.size.isSummed
= 0
| 1
Especifica si el tamaño se informa como la suma de los tamaños de todos los contactos activos o si se informa de forma individual para cada contacto.
-
Si el valor es
1
, el tamaño informado se divide por la cantidad de contactos antes de usarlo. -
Si el valor es
0
, el tamaño informado se usa tal como está.
El valor predeterminado es 0
.
Algunos dispositivos táctiles, en particular los "Semi-MT", no pueden distinguir las dimensiones individuales de varios contactos, por lo que informan una medición de tamaño que representa su área o ancho total. Esta propiedad solo debe establecerse en 1
para esos dispositivos. Si tienes dudas, establece este valor en 0
.
Cálculo
El cálculo de los campos touchMajor
, touchMinor
, toolMajor
, toolMinor
y size
depende de los parámetros de calibración especificados.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
campo de presión
El campo pressure
describe la presión física aproximada que se aplica al dispositivo táctil como un valor normalizado entre 0.0 (sin contacto) y 1.0 (presión normal).
Una presión cero indica que la herramienta está suspendida.
touch.pressure.calibration
Definición: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Especifica el tipo de medición que usa el controlador táctil para informar la presión.
-
Si el valor es
none
, la presión es desconocida, por lo que se establece en 1.0 cuando se toca y en 0.0 cuando se coloca el cursor sobre un elemento. -
Si el valor es
physical
, se supone que el eje de presión mide la intensidad física real de la presión aplicada al panel táctil. -
Si el valor es
amplitude
, se supone que el eje de presión mide la amplitud de la señal, que se relaciona con el tamaño del contacto y la presión aplicada. -
Si el valor es
default
, el sistema usa la calibraciónphysical
si el eje de presión está disponible; de lo contrario, usanone
.
touch.pressure.scale
Definición: touch.pressure.scale
= <un número de punto flotante no negativo>
Especifica un factor de escala constante que se usa en la calibración.
El valor predeterminado es 1.0 / raw.pressure.max
.
Cálculo
El cálculo del campo pressure
depende de los parámetros de calibración especificados.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
campos de orientación e inclinación
El campo orientation
describe la orientación del toque y la herramienta como una medición angular. Una orientación de 0
indica que el eje mayor está orientado verticalmente, -PI/2
indica que el eje mayor está orientado hacia la izquierda y PI/2
indica que el eje mayor está orientado hacia la derecha. Cuando hay una herramienta de pluma stylus, el rango de orientación se puede describir en un rango de círculo completo de -PI
o PI
.
El campo tilt
describe la inclinación de la herramienta como una medición angular.
Una inclinación de 0
indica que la herramienta 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 medición que usa el controlador táctil para informar la orientación.
- Si el valor es
none
, se desconoce la orientación, por lo que se establece en 0. - Si el valor es
interpolated
, la orientación se interpola de forma lineal, de modo que un valor sin procesar deraw.orientation.min
se asigna a-PI/2
y un valor sin procesar deraw.orientation.max
se asigna aPI/2
. El valor central de(raw.orientation.min + raw.orientation.max) / 2
se asigna a0
. - Si el valor es
vector
, la orientación se interpreta como un vector empaquetado que consta de dos campos de 4 bits con signo. Esta representación se usa en las partes del protocolo basado en objetos de Atmel. Cuando se decodifica, el vector genera un ángulo de orientación y una magnitud de confianza. La magnitud de confianza se usa para escalar la información de tamaño, a menos que sea geométrica. - Si el valor es
default
, el sistema usa la calibracióninterpolated
si el eje de orientación está disponible; de lo contrario, usanone
.
Cálculo
El cálculo de los campos orientation
y tilt
depende de los parámetros de calibración especificados y de la entrada disponible.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
campo de distancia
El campo distance
describe la distancia entre la herramienta y la superficie del dispositivo táctil. Un valor de 0.0 indica un contacto directo y valores más altos indican una distancia creciente de la superficie.
touch.distance.calibration
Definición: touch.distance.calibration
= none
|
scaled
| default
Especifica el tipo de medición que usa el controlador táctil para informar la distancia.
-
Si el valor es
none
, 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ónscaled
si el eje de distancia está disponible; de lo contrario, usanone
.
toque.distancia.escala
Definición: touch.distance.scale
= <un número de punto flotante no negativo>
Especifica un factor de escala constante que se usa en la calibración.
El valor predeterminado es 1.0
.
Cálculo
El cálculo del campo distance
depende de los parámetros de calibración especificados.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Ejemplo
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Notas de compatibilidad
Las propiedades de configuración de los dispositivos táctiles cambiaron de forma significativa en Android Ice Cream Sandwich 4.0. Todos los archivos de configuración de dispositivos de entrada para dispositivos táctiles deben actualizarse para usar las nuevas propiedades de configuración.
Es posible que también debas actualizar los controladores de dispositivos táctiles más antiguos.
Archivos de mapa de teclas virtuales
Los dispositivos táctiles se pueden usar para implementar teclas virtuales.
Hay varias formas de hacerlo, según las capacidades del controlador táctil. Algunos controladores táctiles se pueden configurar directamente para implementar teclas programables mediante la configuración de registros de firmware. En otras ocasiones, es conveniente realizar la asignación de coordenadas táctiles a códigos de teclas en software.
Cuando se implementan teclas virtuales en el software, el kernel debe exportar un archivo de mapa de teclas virtual llamado virtualkeys.<devicename>
como una propiedad de la placa. Por ejemplo, si los controladores de dispositivos de pantalla táctil informan su nombre como "touchyfeely", el archivo de mapa de teclas virtuales debe tener la ruta de acceso /sys/board_properties/virtualkeys.touchyfeely
.
Un archivo de mapa de teclas virtuales describe las coordenadas y los códigos de teclas de Linux de las teclas virtuales en la pantalla táctil.
Además del archivo de mapa de teclas virtual, debe haber un archivo de diseño de teclas y un archivo de mapa de caracteres clave correspondientes para asignar los códigos de teclas de Linux a los códigos de teclas de Android y especificar el tipo de dispositivo de teclado (por lo general, SPECIAL_FUNCTION
).
Sintaxis
Un archivo de mapa de teclas virtual es un archivo de texto sin formato que consta de una secuencia de descripciones de diseño de teclas virtuales separadas por líneas nuevas o dos puntos.
Las líneas de comentarios comienzan con "#" y continúan hasta el final de la línea.
Cada clave virtual se describe con 6 componentes delimitados por dos puntos:
0x01
: Es un código de versión. Siempre debe ser0x01
.- <código de tecla de Linux>: Es el código de tecla de Linux de la clave virtual.
- <centerX>: Es la coordenada X en píxeles del centro de la tecla virtual.
- <centerY>: Es la coordenada Y en píxeles del centro de la tecla virtual.
- <width>: Es el ancho de la tecla virtual en píxeles.
- <height>: Es la altura de la tecla virtual en píxeles.
Todas las coordenadas y los tamaños se especifican en 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 teclas virtuales también se puede escribir en varias líneas.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
En el ejemplo anterior, la pantalla táctil tiene una resolución de 480 × 800. En consecuencia, todas las teclas virtuales tienen una coordenada <centerY> de 835, que está un poco debajo del á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
, centerY de 835
, ancho de 90
y altura de 55
.
Ejemplo
Archivo de mapa de teclas virtuales: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Archivo de diseño de claves: /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 de puntero multitáctiles indirectos
En el modo de puntero, el sistema interpreta los siguientes gestos:
- Presionar con un dedo: Haz clic.
- Movimiento de un solo dedo: Mueve el puntero.
- Movimiento con un solo dedo y pulsaciones del botón: arrastra el puntero.
- Movimiento de dos dedos (ambos dedos se mueven en la misma dirección): Arrastra el área debajo del puntero en esa dirección. El puntero en sí no se mueve.
- Movimiento de dos dedos (ambos dedos se mueven hacia el otro o se separan en diferentes direcciones): Desplazar, escalar o rotar el área que rodea el puntero. El puntero en sí no se mueve.
- Movimiento de varios dedos: gesto de formato libre.
Rechazo de la palma
A partir de Android 13, el sistema puede rechazar automáticamente las entradas de la palma cuando se habilita el framework integrado. Las soluciones internas personalizadas aún se admiten, aunque es posible que deban modificarse para mostrar la marca TOOL_TYPE_PALM
cuando se detecta una palma. 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 punteros circundantes, y, luego, considera qué tan lejos están los toques del borde de la pantalla.
Luego, determina, por puntero, cuáles son las palmas. También tiene en cuenta el tamaño de cada contacto, como lo informan touchMajor
y touchMinor
. Luego, el framework de Android quita los punteros marcados como palmas 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
yFLAG_CANCELED
establecidos. - (si este es el único puntero) Cancela el puntero con
ACTION_CANCEL
.
Una API pública, MotionEvent.FLAG_CANCELED
, indica que el evento actual no debe activar la acción del usuario. Esta marca se configura para ACTION_CANCEL
y ACTION_POINTER_UP
.
Si el puntero de la palma no se envió a las apps, el sistema simplemente lo deja caer.
Habilita el rechazo de la palma
- En el controlador táctil, usa la macro
input_abs_set_res
para establecer las resoluciones de los siguientes campos (las unidades son píxeles por mm):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
La compatibilidad con
ABS_MT_TOUCH_MINOR
es opcional. Sin embargo, si tu dispositivo los admite, asegúrate de que la resolución se haya establecido correctamente. - Para confirmar que los campos estén configurados correctamente, ejecuta el siguiente comando:
$ adb shell getevent -li
- Para habilitar la función durante el tiempo de ejecución, ejecuta lo siguiente:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Reinicia el proceso
system_server
.$ adb shell stop && adb shell start
- Confirma que
adb shell dumpsys input
muestre que hay rechazos de palma dentro deUnwantedInteractionBlocker
. 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: {} - Para habilitar de forma permanente la función, agrega el comando sysprop correspondiente en tu archivo
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1