Android es compatible con una variedad de pantallas táctiles y almohadillas táctiles, incluidas las tabletas digitalizadoras con lápiz óptico.
Las pantallas táctiles son dispositivos táctiles que están asociados con una pantalla de modo que el usuario tiene la impresión de manipular directamente elementos en la pantalla.
Las almohadillas táctiles son dispositivos táctiles que no están asociados con una pantalla, como una tableta digitalizadora. Las almohadillas táctiles se utilizan normalmente 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 los botones del mouse.
A veces, los dispositivos táctiles se pueden manipular con una variedad de herramientas diferentes, como los dedos o un lápiz, según la tecnología de sensor táctil subyacente.
En ocasiones, los dispositivos táctiles se utilizan 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 un doble propósito como parte de un teclado sensible al tacto.
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 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
yABS_MT_POSITION_Y
.El dispositivo de entrada no tiene botones de mando. 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
yABS_Y
, y la presencia del código de teclaBTN_TOUCH
.
Una vez que un dispositivo de entrada se ha clasificado como dispositivo táctil, la presencia de teclas virtuales se determina al intentar cargar el archivo de mapa de teclas virtuales para el dispositivo. Si hay un mapa de teclas virtual disponible, también se carga el archivo de diseño de teclas para el dispositivo.
Consulte la sección siguiente sobre la ubicación y el formato de los archivos de mapas de teclas virtuales.
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 incorporados deben tener archivos de configuración de dispositivos de entrada. Si no hay ningún archivo de configuración del dispositivo de entrada, el sistema elegirá una configuración predeterminada que sea apropiada para los periféricos táctiles de uso general típicos, como pantallas táctiles o almohadillas táctiles USB o Bluetooth HID externas. Estos valores predeterminados no están diseñados para pantallas táctiles integradas y probablemente darán como resultado un comportamiento incorrecto.
Una vez cargada la configuración del dispositivo de entrada, el sistema clasificará el dispositivo de entrada como pantalla táctil , panel táctil o dispositivo puntero .
Se utiliza un dispositivo de pantalla táctil para la manipulación directa de objetos en la pantalla. Dado que el usuario está tocando directamente la pantalla, el sistema no requiere ninguna prestación adicional para indicar los objetos que se manipulan.
Se utiliza un dispositivo de almohadilla táctil para proporcionar información de posicionamiento absoluto a una aplicación sobre toques en un área determinada del sensor. Puede ser útil para tabletas digitalizadoras.
Un dispositivo de 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áctil. Otras herramientas, como los estiletes, se interpretan utilizando posiciones absolutas.
Consulte Gestos indirectos del puntero multitáctil 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
, el tipo de dispositivo se establecerá como se indica.Si el dispositivo de entrada informa la presencia de la propiedad de entrada
INPUT_PROP_DIRECT
(a través deEVIOCGPROP
ioctl), entonces el tipo de dispositivo se configurará 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 deEVIOCGPROP
ioctl), entonces el tipo de dispositivo se establecerá en puntero .Si el dispositivo de entrada informa la presencia de los ejes relativos
REL_X
oREL_Y
, entonces el tipo de dispositivo se configurará como panel táctil . Esta condición resuelve una ambigüedad para los dispositivos de entrada que consisten en un mouse y un panel táctil. En este caso, el panel táctil no se utilizará para controlar el puntero porque el mouse ya lo controla.De lo contrario, el tipo de dispositivo se establecerá en puntero . Este valor predeterminado asegura que los paneles táctiles que no han sido designados para ningún otro propósito especial servirán para controlar el puntero.
Botones
Los botones son controles opcionales que las aplicaciones pueden utilizar 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 aMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: asignado aMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: asignado aMotionEvent.BUTTON_MIDDLE
.BTN_BACK
yBTN_SIDE
: asignados aMotionEvent.BUTTON_BACK
. Al presionar este botón también se sintetiza una pulsación de tecla con el código de teclaKeyEvent.KEYCODE_BACK
.BTN_FORWARD
yBTN_EXTRA
: asignados aMotionEvent.BUTTON_FORWARD
. Al presionar este botón también se sintetiza una pulsación de tecla con el código de teclaKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: asignado aMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: asignado aMotionEvent.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 de MotionEvent
, una herramienta a menudo se denomina puntero .
Se admiten los siguientes tipos de herramientas:
BTN_TOOL_FINGER
yMT_TOOL_FINGER
: asignados aMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
yMT_TOOL_PEN
: asignados aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: asignado aMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: asignado aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: asignado aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: asignado aMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: asignado aMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: asignado aMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
yBTN_TOOL_QUADTAP
: asignados aMotionEvent.TOOL_TYPE_FINGER
.
Hovering vs.Tocar herramientas
Las herramientas pueden estar en contacto con el dispositivo táctil o dentro del alcance y sobrevolarlo. 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 está dentro de un rango limitado del digitalizador.
El componente InputReader
se encarga de distinguir las herramientas InputReader
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 solo deben registrar ejes y códigos clave para los ejes y botones que realmente admiten. El registro de un exceso de ejes o códigos clave 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 asumirá queBTN_TOUCH
siempre se utilizará para indicar si la herramienta realmente está tocando la pantalla. Por lo tanto,BTN_TOUCH
no debe usarse para indicar que la herramienta está simplemente en el rango y flotando.Los dispositivos de un solo toque utilizan los siguientes eventos de entrada de Linux:
ABS_X
: (REQUERIDO) Reporta la coordenada X de la herramienta.ABS_Y
: (REQUERIDO) Reporta la coordenada Y de la herramienta.ABS_PRESSURE
: (opcional) Reporta la presión física aplicada a la punta de la herramienta o la fuerza de la señal del contacto táctil.ABS_TOOL_WIDTH
: (opcional) Reporta el área de la sección transversal o el ancho del contacto táctil o de la propia herramienta.ABS_DISTANCE
: (opcional) Informa la distancia de la herramienta desde la superficie del dispositivo táctil.ABS_TILT_X
: (opcional) Reporta la inclinación de la herramienta desde la superficie del dispositivo táctil a lo largo del eje X.ABS_TILT_Y
: (opcional) Informa la inclinación de la herramienta desde la superficie del dispositivo táctil a lo largo del eje Y.BTN_TOUCH
: (OBLIGATORIO) Indica si la herramienta está tocando el dispositivo.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcional) 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) Reporta la coordenada X de la herramienta.ABS_MT_POSITION_Y
: (REQUERIDO) Reporta la coordenada Y de la herramienta.ABS_MT_PRESSURE
: (opcional) Reporta la presión física aplicada a la punta de la herramienta o la fuerza 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 siABS_MT_TOUCH_MAJOR
informa una medición de área.ABS_MT_WIDTH_MAJOR
: (opcional) Reporta 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. Este eje no debe utilizarse si se desconocen las dimensiones de la propia 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 siABS_MT_WIDTH_MAJOR
informa una medición de área o si se desconocen las dimensiones de la herramienta.ABS_MT_ORIENTATION
: (opcional) Reporta la orientación de la herramienta.ABS_MT_DISTANCE
: (opcional) Reporta la distancia de la herramienta desde la superficie del dispositivo táctil.ABS_MT_TOOL_TYPE
: (opcional) Reporta el tipo de herramienta comoMT_TOOL_FINGER
oMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (opcional) Reporta 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 usa siempre que el dedo permanezca en contacto. Los identificadores de seguimiento se pueden reutilizar cuando sus herramientas asociadas se mueven fuera de rango.ABS_MT_SLOT
: (opcional) Informa la identificación de la 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
: (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 multitáctil, solo se utilizarán los ejes multitáctiles y se ignorarán los ejes de un solo toque.
Los valores mínimo y máximo de los
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.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 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 envían a las aplicaciones, pero pueden usarse para claves virtuales.
Los toques que se inician dentro del área activa o que entran y salen del área de visualización se envían a las 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 puede recibir eventos táctiles con coordenadas de visualización que son negativas o más allá de los límites de la visualización. Este es el comportamiento esperado.
Un dispositivo táctil nunca debe sujetar las coordenadas táctiles a los límites del área activa. Si un toque sale del área activa, se debe informar que está fuera del área activa, o no se debe informar en absoluto.
Por ejemplo, si el dedo del usuario se toca cerca de la esquina superior izquierda de la pantalla táctil, puede informar una coordenada de (minX, minY). Si el dedo continúa moviéndose más fuera del área activa, la pantalla táctil debe comenzar a informar coordenadas con componentes menores que minX y minY, como (minX - 2, minY - 3), o debe dejar de informar el toque por completo. En otras palabras, la pantalla táctil no debería estar informando (minX, minY) cuando el dedo del usuario está realmente tocando fuera del área activa.
Al sujetar las coordenadas táctiles al borde de la pantalla se crea un límite duro artificial alrededor del borde de la pantalla que evita que el sistema realice un seguimiento uniforme de los movimientos que entran o salen de los límites del área de visualización.
Los valores informados por
ABS_PRESSURE
oABS_MT_PRESSURE
, si se informan, deben ser distintos de cero cuando la herramienta está tocando el dispositivo y cero en caso contrario para indicar que la herramienta está suspendida.Informar la información de presión es opcional pero muy recomendable. Las aplicaciones pueden usar 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
oABS_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 puede medir el tamaño de los contactos táctiles con 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 usar información de presión para implementar dibujos sensibles al tamaño y otros efectos.
Los valores reportados por
ABS_DISTANCE
oABS_MT_DISTANCE
deben acercarse a cero cuando la herramienta está tocando 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.Informar sobre la distancia es opcional, pero se recomienda para dispositivos con lápiz óptico.
Los valores reportados por
ABS_TILT_X
yABS_TILT_Y
deben ser cero cuando la herramienta está perpendicular al dispositivo. Una inclinación distinta de cero se toma como una indicación de 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 más pequeños que el punto central representan una inclinación hacia arriba o hacia la izquierda, los valores más grandes que el punto central representan una inclinación hacia abajo o hacia la derecha.El
InputReader
convierte los componentes de inclinación X e Y en un ángulo de inclinación perpendicular que varía de 0 aPI / 2
radianes y un ángulo de orientación plano que varía de-PI
aPI
radianes. Esta representación da como resultado una descripción de la orientación que es compatible con lo que se usa 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 sobre el tipo de herramienta, reemplazará cualquier información sobre el tipo de herramienta informada porBTN_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 utiliza 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 alguna información sobre la naturaleza de la herramienta, ya sea si está tocando o al menos su tipo de herramienta. Si no hay información disponible, se supone que la herramienta está inactiva (fuera de rango).Cuando se 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 sincronizados, 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 despejó, la herramienta deja de existir.
Se determina que una herramienta está flotando en función de las siguientes condiciones:
Si la herramienta es
BTN_TOOL_MOUSE
oBTN_TOOL_LENS
, la herramienta no se desplaza, incluso si se cumple alguna de las siguientes condiciones.Si la herramienta está activa y el conductor reporta información de presión, y la presión reportada es cero, entonces la herramienta está suspendida.
Si la herramienta está activo y el conductor apoya el
BTN_TOUCH
código de la llave yBTN_TOUCH
tiene un valor de cero, entonces la herramienta se cierne.
InputReader
compatible con el protocolo multitáctil 'A' y 'B'. Los nuevos controladores deben usar el protocolo 'B', pero cualquiera de los dos funcionará.A partir de Android Ice Cream Sandwich 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 se vuelve inactiva (el dedo "sube"), debería dejar de aparecer en los informes de sincronización multitáctil posteriores. Cuando todas las herramientas se vuelven inactivas (todos los dedos suben "hacia arriba"), 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 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 debe informarse mediante
ABS_MT_PRESSURE
.Las versiones anteriores de Android recuperaron la información de presión de
ABS_MT_TOUCH_MAJOR
. El comportamiento anterior era incompatible con la especificación del protocolo de entrada de Linux y ya no es compatible.La información del tamaño táctil se debe informar mediante
ABS_MT_TOUCH_MAJOR
.Las versiones anteriores de Android recuperaron la información de tamaño de
ABS_MT_TOOL_MAJOR
. El comportamiento anterior era incompatible con la especificación del protocolo de entrada de Linux y ya no es compatible.
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.
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 rastrea los estados de los botones.Si se presionaron o soltaron los botones BACK o FORWARD,
InputReader
notifica alInputDispatcher
sobre el evento clave.InputReader
determina si se produjo una pulsación de tecla virtual. Si es así, notifica alInputDispatcher
sobre el evento clave.InputReader
determina si el toque se inició dentro de los límites de la pantalla. Si es así, notifica alInputDispatcher
sobre el evento táctil.Si no hay herramientas para tocar pero hay al menos una herramienta de
InputReader
,InputReader
notifica alInputDispatcher
sobre el evento deInputDispatcher
.Si el tipo de dispositivo táctil es puntero ,
InputReader
realiza la detección del gesto del puntero, mueve el puntero y los puntos en consecuencia y notifica alInputDispatcher
sobre el evento del puntero.InputDispatcher
utilizaWindowManagerPolicy
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 de esto es que los controladores de dispositivos para 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 usando una escala interna específica del dispositivo, como el número total de nodos de sensor que fueron activados por el toque. Este valor de tamaño sin procesar no sería significativo para las aplicaciones porque necesitarían conocer el tamaño físico y otras características de los nodos del sensor 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 comprender.
Convenciones de documentación
Para propósitos de documentación, usaremos las siguientes convenciones para describir los valores usados por el sistema durante el proceso de calibración.
Valores de eje sin procesar
Las siguientes expresiones denotan los valores brutos informados por el controlador del dispositivo táctil como eventos EV_ABS
.
-
raw.x
- El valor del eje
ABS_X
oABS_MT_POSITION_X
. -
raw.y
- El valor del eje
ABS_Y
oABS_MT_POSITION_Y
. -
raw.pressure
- 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
- El valor del eje
ABS_MT_TOUCH_MINOR
, oraw.touchMajor
si no está disponible. -
raw.toolMajor
- El valor del eje
ABS_TOOL_WIDTH
oABS_MT_WIDTH_MAJOR
, o 0 si no está disponible. -
raw.toolMinor
- 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
- 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 eje sin procesar
Las siguientes expresiones denotan los límites de los valores brutos. Se obtienen llamando a EVIOCGABS
ioctl para cada eje.
-
raw.*.min
- El valor mínimo inclusivo del eje sin procesar.
-
raw.*.max
- El valor máximo inclusivo del eje sin procesar.
-
raw.*.range
- Equivalente a
raw.*.max - raw.*.min
. -
raw.*.fuzz
- La precisión del eje sin procesar. 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 la 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 informarán a aplicaciones como píxeles de pantalla.
-
output.width
- El ancho de salida. Para las pantallas táctiles (asociadas con una pantalla), este es el ancho de la pantalla en píxeles. Para las almohadillas táctiles (no asociadas con una pantalla), el ancho de salida es igual a
raw.width
, lo que indica que no se realizará 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 las almohadillas táctiles (no asociadas con una pantalla), la altura de salida es igual a
raw.height
, lo que indica que no se realizará 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 los valores de calibración. La siguiente tabla describe algunas propiedades de configuración de uso general. Todas las demás propiedades se describen en las siguientes secciones junto con los campos que se utilizan 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 untouchPad
no asociado con una pantalla.Si el valor es un
pointer
, el dispositivo táctil es un panel táctil no asociado con 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 de acuerdo con 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.
Antes de Honeycomb, 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 se rotan cada vez que cambia la orientación de la pantalla.Si el valor es
0
, las posiciones táctiles informadas por el dispositivo táctil son inmunes a los cambios de orientación de la pantalla.
El valor predeterminado es 1
si el dispositivo es una pantalla táctil, 0
caso contrario.
El sistema distingue entre pantallas y pantallas táctiles internas y externas. Una pantalla táctil interna consciente de la orientación se gira en función de la orientación de la pantalla interna. Una pantalla táctil externa consciente de la orientación se gira en función de la orientación de la pantalla externa.
El conocimiento 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 en el sentido de las agujas del reloj 90 grados 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 notifiquen con el mismo sistema de coordenadas que usan 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.
touch.gestureMode
Definición: touch.gestureMode
= pointer
| spots
| default
Especifica el modo de presentación para los gestos del puntero. Esta propiedad de configuración solo es relevante cuando el dispositivo táctil es de tipo 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 son
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, spots
.
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 de posición 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 Size
Los campos TouchMajor
y TouchMinor
describen las dimensiones aproximadas del área de contacto en unidades de salida (píxeles).
Los campos ToolMajor
y ToolMinor
describen las dimensiones aproximadas de la 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 puede detectar el dispositivo táctil. El tamaño normalizado más pequeño posible es 0.0 (sin contacto o no se puede medir) y el tamaño normalizado más grande posible es 1.0 (el área del sensor está saturada).
Cuando se pueden medir tanto la longitud como la anchura aproximadas, 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
serán iguales.
Asimismo, el campo ToolMajor
especifica la dimensión más larga y el campo ToolMinor
especifica la dimensión más corta del área de la sección transversal de la herramienta.
Si el tamaño táctil no está disponible pero el tamaño de la herramienta está disponible, entonces el tamaño de la herramienta se establecerá 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 está disponible, entonces el tamaño táctil se establecerá 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 formas. La implementación actual admite tres tipos diferentes de medidas: diámetro, área y cuadro delimitador geométrico en unidades de superficie.
touch.size.calibration
Definición: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Especifica el tipo de medición que utiliza el controlador táctil para informar el tamaño del toque 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óngeometric
si el ejeraw.touchMajor
oraw.toolMajor
está disponible; de lo contrario, usa la calibraciónnone
.
touch.size.scale
Definición: touch.size.scale
= <a número de punto flotante no negativo>
Especifica un factor de escala constante utilizado en la calibración.
El valor predeterminado es 1.0
.
touch.size.bias
Definición: touch.size.bias
= <a número de punto flotante no negativo>
Especifica un valor de sesgo constante utilizado en la calibración.
El valor predeterminado es 0.0
.
touch.size.isSummed
Definición: touch.size.isSummed
= 0
| 1
Especifica si el tamaño se informa como la suma de los tamaños de todos los contactos activos o se informa individualmente para cada contacto.
Si el valor es
1
, el tamaño informado se dividirá por el número de contactos antes de su uso.Si el valor es
0
, el tamaño informado se utilizará tal cual.
El valor predeterminado es 0
.
Algunos dispositivos táctiles, en particular los dispositivos "Semi-MT", no pueden distinguir las dimensiones individuales de varios contactos, por lo que informan una medida de tamaño que representa su área total o ancho. Esta propiedad solo debe establecerse en 1
para dichos dispositivos. En caso de duda, establezca este valor en 0
.
Cálculo
El cálculo de los 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 Pressure
El campo Pressure
describe la presión física aproximada aplicada al dispositivo táctil como un valor normalizado entre 0.0 (sin tocar) y 1.0 (fuerza total).
Una presión cero indica que la herramienta está flotando.
touch.pressure.calibration
Definición: touch.pressure.calibration
= none
| physical
| amplitude
| default
Especifica el tipo de medición que utiliza el controlador táctil para informar la presión.
Si el valor es
none
, se desconoce la presión, por lo que se establece en 1.0 al tocar y 0.0 cuando se desplaza.If the value is
physical
, the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
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
.
Calculation
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 may 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 ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.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 theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calculation
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 thescaled
calibration if the distance axis available, otherwise usesnone
.
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
.
Calculation
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
Example
# 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 will 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 may 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 be0x01
. - <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
.
Example
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.