O Android é compatível com uma variedade de telas sensíveis ao toque e touch pads, incluindo tablets digitalizadores baseados em caneta.
As telas de toque são dispositivos de toque que estão associados a uma tela de modo que o usuário tenha a impressão de manipular diretamente os itens na tela.
Os touch pads são dispositivos de toque que não estão associados a uma tela, como um tablet digitalizador. Os touch pads são normalmente usados para apontar ou para posicionamento indireto absoluto ou controle baseado em gestos de uma interface de usuário.
Dispositivos de toque podem ter botões cujas funções são semelhantes aos botões do mouse.
Os dispositivos de toque às vezes podem ser manipulados usando uma variedade de ferramentas diferentes, como dedos ou uma caneta, dependendo da tecnologia de sensor de toque subjacente.
Os dispositivos de toque às vezes são usados para implementar teclas virtuais. Por exemplo, em alguns dispositivos Android, a área do sensor da tela sensível ao toque se estende além da borda da tela e serve a dupla finalidade como parte de um teclado sensível ao toque.
Devido à grande variedade de dispositivos de toque, o Android conta com um grande número de propriedades de configuração para descrever as características e o comportamento desejado de cada dispositivo.
Classificação do dispositivo de toque
Um dispositivo de entrada é classificado como um dispositivo multitoque se ambas as condições a seguir ocorrerem:
O dispositivo de entrada informa a presença dos eixos absolutos
ABS_MT_POSITION_X
eABS_MT_POSITION_Y
.O dispositivo de entrada não possui botões do gamepad. Esta condição resolve uma ambiguidade com certos gamepads que reportam eixos com códigos que se sobrepõem aos dos eixos MT.
Um dispositivo de entrada é classificado como um dispositivo de toque único se ambas as condições a seguir ocorrerem:
O dispositivo de entrada não é classificado como um dispositivo multitoque. Um dispositivo de entrada é classificado como um dispositivo de toque único ou como um dispositivo multitoque, nunca ambos.
O dispositivo de entrada informa a presença dos eixos absolutos
ABS_X
eABS_Y
e a presença do código da teclaBTN_TOUCH
.
Uma vez que um dispositivo de entrada tenha sido classificado como um dispositivo de toque, a presença de teclas virtuais é determinada pela tentativa de carregar o arquivo de mapa de teclas virtuais para o dispositivo. Se um mapa de chave virtual estiver disponível, o arquivo de layout de chave para o dispositivo também será carregado.
Consulte a seção abaixo sobre a localização e o formato dos arquivos de mapa de chave virtual.
Em seguida, o sistema carrega o arquivo de configuração do dispositivo de entrada para o dispositivo de toque.
Todos os dispositivos de toque integrados devem ter arquivos de configuração do dispositivo de entrada. Se nenhum arquivo de configuração do dispositivo de entrada estiver presente, o sistema escolherá uma configuração padrão apropriada para periféricos de toque de uso geral típicos, como telas de toque ou touch pads USB ou Bluetooth HID externos. Esses padrões não são projetados para telas de toque integradas e provavelmente resultarão em comportamento incorreto.
Depois que a configuração do dispositivo de entrada for carregada, o sistema classificará o dispositivo de entrada como uma tela sensível ao toque , touch pad ou dispositivo de ponteiro .
Um dispositivo de tela sensível ao toque é usado para manipulação direta de objetos na tela. Como o usuário está tocando diretamente na tela, o sistema não requer recursos adicionais para indicar os objetos que estão sendo manipulados.
Um dispositivo touch pad é usado para fornecer informações de posicionamento absoluto para um aplicativo sobre toques em uma determinada área do sensor. Pode ser útil para tablets digitalizadores.
Um dispositivo de ponteiro é usado para manipulação indireta de objetos na tela usando um cursor. Os dedos são interpretados como gestos de ponteiro multitoque. Outras ferramentas, como canetas, são interpretadas usando posições absolutas.
Consulte Gestos do ponteiro multitoque indireto para obter mais informações.
As regras a seguir são usadas para classificar o dispositivo de entrada como tela sensível ao toque , touch pad ou dispositivo de ponteiro .
Se a propriedade
touch.deviceType
estiver configurada, o tipo de dispositivo será configurado conforme indicado.Se o dispositivo de entrada relatar a presença da propriedade de entrada
INPUT_PROP_DIRECT
(viaEVIOCGPROP
ioctl), o tipo de dispositivo será definido como touch screen . Essa condição pressupõe que os dispositivos de toque de entrada direta estejam conectados a um monitor que também esteja conectado.Se o dispositivo de entrada relatar a presença da propriedade de entrada
INPUT_PROP_POINTER
(viaEVIOCGPROP
ioctl), o tipo de dispositivo será definido como ponteiro .Se o dispositivo de entrada relatar a presença dos eixos relativos
REL_X
ouREL_Y
, o tipo de dispositivo será definido como touch pad . Essa condição resolve uma ambiguidade para dispositivos de entrada que consistem em um mouse e um touch pad. Nesse caso, o touch pad não será usado para controlar o ponteiro porque o mouse já o controla.Caso contrário, o tipo de dispositivo será definido como ponteiro . Esse padrão garante que os touch pads que não foram designados para nenhum outro propósito especial servirão para controlar o ponteiro.
Botões
Os botões são controles opcionais que podem ser usados por aplicativos para executar funções adicionais. Os botões em dispositivos de toque se comportam de maneira semelhante aos botões do mouse e são usados principalmente com dispositivos de toque do tipo ponteiro ou com uma caneta.
Os seguintes botões são suportados:
BTN_LEFT
: mapeado paraMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: mapeado paraMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: mapeado paraMotionEvent.BUTTON_MIDDLE
.BTN_BACK
eBTN_SIDE
: mapeados paraMotionEvent.BUTTON_BACK
. Pressionar este botão também sintetiza um pressionamento de tecla com o código de teclaKeyEvent.KEYCODE_BACK
.BTN_FORWARD
eBTN_EXTRA
: mapeados paraMotionEvent.BUTTON_FORWARD
. Pressionar este botão também sintetiza um pressionamento de tecla com o código de teclaKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: mapeado paraMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: mapeado paraMotionEvent.BUTTON_TERTIARY
.
Ferramentas e tipos de ferramentas
Uma ferramenta é um dedo, caneta ou outro aparelho que é usado para interagir com o dispositivo de toque. Alguns dispositivos de toque podem distinguir entre diferentes tipos de ferramentas.
Em outros lugares do Android, como na API MotionEvent
, uma ferramenta geralmente é chamada de ponteiro .
Os seguintes tipos de ferramentas são suportados:
BTN_TOOL_FINGER
eMT_TOOL_FINGER
: mapeados paraMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
eMT_TOOL_PEN
: mapeados paraMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: mapeado paraMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: mapeado paraMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: mapeado paraMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: mapeado paraMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: mapeado paraMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: mapeado paraMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
eBTN_TOOL_QUADTAP
: mapeados paraMotionEvent.TOOL_TYPE_FINGER
.
Ferramentas de pairar versus tocar
As ferramentas podem estar em contato com o dispositivo de toque ou ao alcance e pairando sobre ele. Nem todos os dispositivos de toque são capazes de detectar a presença de uma ferramenta pairando acima do dispositivo de toque. Aqueles que o fazem, como digitalizadores de caneta baseados em RF, muitas vezes podem detectar quando a ferramenta está dentro de um alcance limitado do digitalizador.
O componente InputReader
tem o cuidado de distinguir as ferramentas de toque das ferramentas de passar o mouse. Da mesma forma, as ferramentas de toque e as ferramentas de passar o mouse são relatadas aos aplicativos de maneiras diferentes.
As ferramentas de toque são relatadas aos aplicativos como eventos de toque usando MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
e MotionEvent.ACTION_POINTER_UP
.
As ferramentas flutuantes são relatadas aos aplicativos como eventos de movimento genéricos usando MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
e MotionEvent.ACTION_HOVER_EXIT
.
Requisitos do driver do dispositivo de toque
Os drivers de dispositivo de toque devem registrar apenas eixos e códigos de tecla para os eixos e botões que eles realmente suportam. O registro de eixos ou códigos de chave em excesso pode confundir o algoritmo de classificação do dispositivo ou fazer com que o sistema detecte incorretamente os recursos do dispositivo.
Por exemplo, se o dispositivo informar o código da tecla
BTN_TOUCH
, o sistema assumirá queBTN_TOUCH
sempre será usado para indicar se a ferramenta está realmente tocando a tela. Portanto,BTN_TOUCH
não deve ser usado para indicar que a ferramenta está apenas no alcance e pairando.Dispositivos de toque único usam os seguintes eventos de entrada do Linux:
ABS_X
: (NECESSÁRIO) Informa a coordenada X da ferramenta.ABS_Y
: (NECESSÁRIO) Informa a coordenada Y da ferramenta.ABS_PRESSURE
: (opcional) Informa a pressão física aplicada na ponta da ferramenta ou a força do sinal do contato de toque.ABS_TOOL_WIDTH
: (opcional) Informa a área da seção transversal ou largura do contato de toque ou da própria ferramenta.ABS_DISTANCE
: (opcional) Informa a distância da ferramenta da superfície do dispositivo de toque.ABS_TILT_X
: (opcional) Informa a inclinação da ferramenta da superfície do dispositivo de toque ao longo do eixo X.ABS_TILT_Y
: (opcional) Informa a inclinação da ferramenta da superfície do dispositivo de toque ao longo do eixo Y.BTN_TOUCH
: (NECESSÁRIO) Indica se a ferramenta está tocando o dispositivo.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcional) Informa os estados do botão .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 o tipo de ferramenta .
Os dispositivos multitoque usam os seguintes eventos de entrada do Linux:
ABS_MT_POSITION_X
: (OBRIGATÓRIO) Informa a coordenada X da ferramenta.ABS_MT_POSITION_Y
: (OBRIGATÓRIO) Informa a coordenada Y da ferramenta.ABS_MT_PRESSURE
: (opcional) Informa a pressão física aplicada na ponta da ferramenta ou a força do sinal do contato de toque.ABS_MT_TOUCH_MAJOR
: (opcional) Informa a área da seção transversal do contato de toque ou o comprimento da dimensão maior do contato de toque.ABS_MT_TOUCH_MINOR
: (opcional) Informa o comprimento da dimensão mais curta do contato de toque. Este eixo não deve ser usado seABS_MT_TOUCH_MAJOR
estiver relatando uma medição de área.ABS_MT_WIDTH_MAJOR
: (opcional) Informa a área da seção transversal da própria ferramenta, ou o comprimento da dimensão maior da própria ferramenta. Este eixo não deve ser utilizado se as dimensões da própria ferramenta forem desconhecidas.ABS_MT_WIDTH_MINOR
: (opcional) Informa o comprimento da dimensão mais curta da própria ferramenta. Este eixo não deve ser usado seABS_MT_WIDTH_MAJOR
estiver relatando uma medição de área ou se as dimensões da própria ferramenta forem desconhecidas.ABS_MT_ORIENTATION
: (opcional) Informa a orientação da ferramenta.ABS_MT_DISTANCE
: (opcional) Informa a distância da ferramenta da superfície do dispositivo de toque.ABS_MT_TOOL_TYPE
: (opcional) informa o tipo de ferramenta comoMT_TOOL_FINGER
ouMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (opcional) Informa o ID de rastreamento da ferramenta. O ID de rastreamento é um número inteiro não negativo arbitrário que é usado para identificar e rastrear cada ferramenta independentemente quando várias ferramentas estão ativas. Por exemplo, quando vários dedos estão tocando o dispositivo, cada dedo deve receber uma identificação de rastreamento distinta que é usada enquanto o dedo permanecer em contato. Os IDs de rastreamento podem ser reutilizados quando suas ferramentas associadas saem do alcance.ABS_MT_SLOT
: (opcional) Informa o id do slot da ferramenta, ao usar o protocolo multitoque Linux 'B'. Consulte a documentação do protocolo multitoque do Linux para obter mais detalhes.BTN_TOUCH
: (NECESSÁRIO) Indica se a ferramenta está tocando o dispositivo.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opcional) Informa os estados do botão .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 o tipo de ferramenta .
Se os eixos para protocolo de toque único e multitoque forem definidos, somente os eixos multitoque serão usados e os eixos de toque único serão ignorados.
Os valores mínimo e máximo dos
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
eABS_MT_POSITION_Y
definem os limites da área ativa do dispositivo em unidades de superfície específicas do dispositivo. No caso de uma tela sensível ao toque, a área ativa descreve a parte do dispositivo de toque que realmente cobre a tela.Para uma tela sensível ao toque, o sistema interpola automaticamente as posições de toque relatadas em unidades de superfície para obter posições de toque em pixels de exibição de acordo com o seguinte cálculo:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Uma tela sensível ao toque pode relatar toques fora da área ativa relatada.
Os toques iniciados fora da área ativa não são entregues aos aplicativos, mas podem ser usados para teclas virtuais.
Os toques que são iniciados dentro da área ativa ou que entram e saem da área de exibição são entregues aos aplicativos. Conseqüentemente, se um toque começar dentro dos limites de um aplicativo e, em seguida, sair da área ativa, o aplicativo poderá receber eventos de toque com coordenadas de exibição negativas ou além dos limites da exibição. Este é o comportamento esperado.
Um dispositivo de toque nunca deve prender as coordenadas de toque aos limites da área ativa. Se um toque sair da área ativa, deve ser relatado como fora da área ativa ou não deve ser relatado.
Por exemplo, se o dedo do usuário estiver tocando próximo ao canto superior esquerdo da tela sensível ao toque, ele poderá relatar uma coordenada de (minX, minY). Se o dedo continuar a se mover para fora da área ativa, a tela sensível ao toque deve começar a relatar coordenadas com componentes menores que minX e minY, como (minX - 2, minY - 3), ou deve parar de relatar o toque completamente. Em outras palavras, a tela sensível ao toque não deve informar (minX, minY) quando o dedo do usuário estiver realmente tocando fora da área ativa.
Fixar as coordenadas de toque na borda da tela cria um limite rígido artificial em torno da borda da tela que impede que o sistema rastreie suavemente os movimentos que entram ou saem dos limites da área de exibição.
Os valores reportados por
ABS_PRESSURE
ouABS_MT_PRESSURE
, se forem reportados, devem ser diferentes de zero quando a ferramenta estiver tocando o dispositivo e zero caso contrário para indicar que a ferramenta está pairando.O relatório de informações de pressão é opcional , mas altamente recomendado. Os aplicativos podem usar informações de pressão para implementar o desenho sensível à pressão e outros efeitos.
Os valores relatados por
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
ouABS_MT_WIDTH_MINOR
devem ser diferentes de zero quando a ferramenta estiver tocando o dispositivo e zero caso contrário, mas isso não é obrigatório. Por exemplo, o dispositivo de toque pode ser capaz de medir o tamanho dos contatos de toque do dedo, mas não dos contatos de toque da caneta.As informações de tamanho do relatório são opcionais , mas altamente recomendadas. Os aplicativos podem usar as informações de pressão para implementar o desenho sensível ao tamanho e outros efeitos.
Os valores relatados por
ABS_DISTANCE
ouABS_MT_DISTANCE
devem se aproximar de zero quando a ferramenta estiver tocando o dispositivo. A distância pode permanecer diferente de zero mesmo quando a ferramenta está em contato direto. Os valores exatos relatados dependem da maneira como o hardware mede a distância.O relatório de informações de distância é opcional , mas recomendado para dispositivos stylus.
Os valores reportados por
ABS_TILT_X
eABS_TILT_Y
devem ser zero quando a ferramenta estiver perpendicular ao dispositivo. Uma inclinação diferente de zero é considerada como uma indicação de que a ferramenta é mantida em uma inclinação.Os ângulos de inclinação ao longo dos eixos X e Y são considerados especificados em graus a partir da perpendicular. O ponto central (perfeitamente perpendicular) é dado por
(max + min) / 2
para cada eixo. Valores menores que o ponto central representam uma inclinação para cima ou para a esquerda, valores maiores que o ponto central representam uma inclinação para baixo ou para a direita.O
InputReader
converte os componentes de inclinação X e Y em um ângulo de inclinação perpendicular variando de 0 aPI / 2
radianos e um ângulo de orientação planar variando de-PI
aPI
radianos. Essa representação resulta em uma descrição de orientação compatível com o que é usado para descrever os toques dos dedos.O relatório de informações de inclinação é opcional , mas recomendado para dispositivos stylus.
Se o tipo de ferramenta for relatado por
ABS_MT_TOOL_TYPE
, ele substituirá qualquer informação de tipo de ferramenta relatada porBTN_TOOL_*
. Se nenhuma informação de tipo de ferramenta estiver disponível, o padrão do tipo de ferramentaMotionEvent.TOOL_TYPE_FINGER
.Uma ferramenta é determinada como ativa com base nas seguintes condições:
Ao usar o protocolo de toque único, a ferramenta estará ativa se
BTN_TOUCH
ouBTN_TOOL_*
for 1.Essa condição implica que o
InputReader
precisa ter pelo menos alguma informação sobre a natureza da ferramenta, seja ela tocando, ou pelo menos seu tipo de ferramenta. Se nenhuma informação estiver disponível, então a ferramenta é considerada inativa (fora da faixa).Ao usar o protocolo multitoque 'A', a ferramenta fica ativa sempre que aparece no relatório de sincronização mais recente. Quando a ferramenta para de aparecer nos relatórios de sincronização, ela deixa de existir.
Ao usar o protocolo multitoque 'B', a ferramenta fica ativa desde que tenha um slot ativo. Quando o slot é limpo, a ferramenta deixa de existir.
Uma ferramenta é determinada como pairando com base nas seguintes condições:
Se a ferramenta for
BTN_TOOL_MOUSE
ouBTN_TOOL_LENS
, a ferramenta não está pairando, mesmo que uma das seguintes condições seja verdadeira.Se a ferramenta estiver ativa e o driver relatar informações de pressão e a pressão informada for zero, a ferramenta está pairando.
Se a ferramenta estiver ativa e o driver suportar o código de chave
BTN_TOUCH
eBTN_TOUCH
tiver um valor zero, a ferramenta está pairando.
O
InputReader
suporta o protocolo multitoque 'A' e 'B'. Novos drivers devem usar o protocolo 'B', mas ambos funcionarão.A partir do Android Ice Cream Sandwich 4.0, os drivers da tela sensível ao toque podem precisar ser alterados para cumprir a especificação do protocolo de entrada do Linux.
As seguintes alterações podem ser necessárias:
Quando uma ferramenta se torna inativa (o dedo "para cima"), ela deve parar de aparecer nos relatórios de sincronização multitoque subsequentes. Quando todas as ferramentas ficam inativas (todos os dedos ficam "para cima"), o driver deve enviar um pacote de relatório de sincronização vazio, como
SYN_MT_REPORT
seguido porSYN_REPORT
.As versões anteriores do Android esperavam que os eventos "up" fossem relatados enviando um valor de pressão de 0. O comportamento antigo era incompatível com a especificação do protocolo de entrada do Linux e não é mais compatível.
As informações de pressão física ou força do sinal devem ser relatadas usando
ABS_MT_PRESSURE
.Versões anteriores do Android recuperavam informações de pressão de
ABS_MT_TOUCH_MAJOR
. O comportamento antigo era incompatível com a especificação do protocolo de entrada do Linux e não é mais suportado.As informações de tamanho de toque devem ser relatadas usando
ABS_MT_TOUCH_MAJOR
.Versões anteriores do Android recuperavam informações de tamanho de
ABS_MT_TOOL_MAJOR
. O comportamento antigo era incompatível com a especificação do protocolo de entrada do Linux e não é mais suportado.
Os drivers de dispositivo de toque não precisam mais de personalizações específicas do Android. Ao contar com o protocolo de entrada padrão do Linux, o Android pode oferecer suporte a uma variedade maior de periféricos de toque, como telas de toque multitoque HID externas, usando drivers não modificados.
Operação do dispositivo de toque
A seguir, um breve resumo da operação do dispositivo de toque no Android.
O
EventHub
lê eventos brutos do driverevdev
.O
InputReader
consome os eventos brutos e atualiza o estado interno sobre a posição e outras características de cada ferramenta. Ele também rastreia os estados dos botões.Se os botões BACK ou FORWARD foram pressionados ou liberados, o
InputReader
notifica oInputDispatcher
sobre o evento de chave.O
InputReader
determina se ocorreu um pressionamento de tecla virtual. Em caso afirmativo, ele notifica oInputDispatcher
sobre o evento de chave.O
InputReader
determina se o toque foi iniciado dentro dos limites da tela. Em caso afirmativo, ele notifica oInputDispatcher
sobre o evento de toque.Se não houver ferramentas de toque, mas houver pelo menos uma ferramenta de foco, o
InputReader
notificará oInputDispatcher
sobre o evento de foco.Se o tipo de dispositivo de toque for pointer , o
InputReader
realizará a detecção do gesto do ponteiro, moverá o ponteiro e os pontos de acordo e notificará oInputDispatcher
sobre o evento do ponteiro.O
InputDispatcher
usa oWindowManagerPolicy
para determinar se os eventos devem ser despachados e se devem ativar o dispositivo. Em seguida, oInputDispatcher
entrega os eventos aos aplicativos apropriados.
Configuração do dispositivo de toque
O comportamento do dispositivo de toque é determinado pelos eixos do dispositivo, botões, propriedades de entrada, configuração do dispositivo de entrada, mapa de teclas virtuais e layout de teclas.
Consulte as seções a seguir para obter mais detalhes sobre os arquivos que participam da configuração do teclado:
Propriedades
O sistema conta com muitas propriedades de configuração do dispositivo de entrada para configurar e calibrar o comportamento do dispositivo de toque.
Uma razão para isso é que os drivers de dispositivo para dispositivos de toque geralmente relatam as características dos toques usando unidades específicas do dispositivo.
Por exemplo, muitos dispositivos de toque medem a área de contato de toque usando uma escala interna específica do dispositivo, como o número total de nós de sensores que foram acionados pelo toque. Esse valor de tamanho bruto não seria significativo para os aplicativos porque eles precisariam saber sobre o tamanho físico e outras características dos nós sensores do dispositivo de toque.
O sistema usa parâmetros de calibração codificados em arquivos de configuração do dispositivo de entrada para decodificar, transformar e normalizar os valores relatados pelo dispositivo de toque em uma representação padrão mais simples que os aplicativos possam entender.
Convenções de Documentação
Para fins de documentação, usaremos as seguintes convenções para descrever os valores usados pelo sistema durante o processo de calibração.
Valores brutos do eixo
As expressões a seguir denotam os valores brutos relatados pelo driver de dispositivo de toque como eventos EV_ABS
.
-
raw.x
- O valor do eixo
ABS_X
ouABS_MT_POSITION_X
. -
raw.y
- O valor do eixo
ABS_Y
ouABS_MT_POSITION_Y
. -
raw.pressure
- O valor do eixo
ABS_PRESSURE
ouABS_MT_PRESSURE
, ou 0 se não estiver disponível. -
raw.touchMajor
- O valor do eixo
ABS_MT_TOUCH_MAJOR
ou 0 se não estiver disponível. -
raw.touchMinor
- O valor do eixo
ABS_MT_TOUCH_MINOR
ouraw.touchMajor
se não estiver disponível. -
raw.toolMajor
- O valor do eixo
ABS_TOOL_WIDTH
ouABS_MT_WIDTH_MAJOR
ou 0 se não estiver disponível. -
raw.toolMinor
- O valor do eixo
ABS_MT_WIDTH_MINOR
ouraw.toolMajor
se não estiver disponível. -
raw.orientation
- O valor do eixo
ABS_MT_ORIENTATION
ou 0 se não estiver disponível. -
raw.distance
- O valor do eixo
ABS_DISTANCE
ouABS_MT_DISTANCE
, ou 0 se não estiver disponível. -
raw.tiltX
- O valor do eixo
ABS_TILT_X
ou 0 se não estiver disponível. -
raw.tiltY
- O valor do eixo
ABS_TILT_Y
ou 0 se não estiver disponível.
Intervalos brutos do eixo
As expressões a seguir denotam os limites de valores brutos. Eles são obtidos chamando EVIOCGABS
ioctl para cada eixo.
-
raw.*.min
- O valor mínimo inclusivo do eixo bruto.
-
raw.*.max
- O valor máximo inclusivo do eixo bruto.
-
raw.*.range
- Equivalente a
raw.*.max - raw.*.min
. -
raw.*.fuzz
- A precisão do eixo bruto. por exemplo. fuzz = 1 implica que os valores são precisos para +/- 1 unidade.
-
raw.width
- A largura inclusiva da área de toque, equivalente a
raw.x.range + 1
. -
raw.height
- A altura inclusiva da área de toque, equivalente a
raw.y.range + 1
.
Faixas de saída
As seguintes expressões denotam as características do sistema de coordenadas de saída. O sistema usa interpolação linear para traduzir as informações de posição de toque das unidades de superfície usadas pelo dispositivo de toque nas unidades de saída que serão relatadas para aplicativos como pixels de exibição.
-
output.width
- A largura de saída. Para telas sensíveis ao toque (associadas a uma tela), esta é a largura da tela em pixels. Para touch pads (não associados a um display), a largura de saída é igual a
raw.width
, indicando que nenhuma interpolação será executada. -
output.height
- A altura de saída. Para telas sensíveis ao toque (associadas a uma tela), esta é a altura da tela em pixels. Para touch pads (não associados a um display), a altura de saída é igual a
raw.height
, indicando que nenhuma interpolação será executada. -
output.diag
- O comprimento diagonal do sistema de coordenadas de saída, equivalente a
sqrt(output.width ^2 + output.height ^2)
.
Configuração básica
O mapeador de entrada de toque usa muitas propriedades de configuração no arquivo de configuração do dispositivo de entrada para especificar valores de calibração. A tabela a seguir descreve algumas propriedades de configuração de uso geral. Todas as outras propriedades são descritas nas seções a seguir junto com os campos que são usados para calibrar.
touch.deviceType
Definição: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Especifica o tipo de dispositivo de toque.
Se o valor for
touchScreen
, o dispositivo de toque é uma tela de toque associada a uma tela.Se o valor for
touchPad
, o dispositivo de toque é um touch pad não associado a uma tela.Se o valor for
pointer
, o dispositivo de toque será um touch pad não associado a uma tela e seus movimentos serão usados para gestos indiretos de ponteiro multitoque .Se o valor for
default
, o sistema detecta automaticamente o tipo de dispositivo de acordo com o algoritmo de classificação.
Consulte a seção Classificação para obter mais detalhes sobre como o tipo de dispositivo influencia o comportamento do dispositivo de toque.
Antes do Honeycomb, todos os dispositivos de toque eram considerados telas de toque.
touch.orientationAware
Definição: touch.orientationAware
= 0
| 1
Especifica se o dispositivo de toque deve reagir às alterações de orientação de exibição.
Se o valor for
1
, as posições de toque relatadas pelo dispositivo de toque serão giradas sempre que a orientação da tela for alterada.Se o valor for
0
, as posições de toque relatadas pelo dispositivo de toque são imunes a alterações de orientação de exibição.
O valor padrão é 1
se o dispositivo for uma tela sensível ao toque, 0
caso contrário.
O sistema distingue entre telas e telas sensíveis ao toque internas e externas. Uma tela sensível ao toque interna com reconhecimento de orientação é girada com base na orientação da tela interna. Uma tela de toque externa com reconhecimento de orientação é girada com base na orientação da tela externa.
O reconhecimento de orientação é usado para dar suporte à rotação de telas sensíveis ao toque em dispositivos como o Nexus One. Por exemplo, quando o dispositivo é girado 90 graus no sentido horário a partir de sua orientação natural, as posições absolutas dos toques são remapeadas de modo que um toque no canto superior esquerdo do sistema de coordenadas absolutas da tela sensível ao toque é relatado como um toque no canto superior esquerdo canto do sistema de coordenadas giradas da tela. Isso é feito para que os toques sejam relatados com o mesmo sistema de coordenadas que os aplicativos usam para desenhar seus elementos visuais.
Antes do Honeycomb, todos os dispositivos de toque eram considerados sensíveis à orientação.
touch.gestureMode
Definição: touch.gestureMode
= pointer
| spots
| default
Especifica o modo de apresentação para gestos de ponteiro. Esta propriedade de configuração só é relevante quando o dispositivo de toque é do tipo ponteiro .
Se o valor for
pointer
, os gestos do touch pad são apresentados por meio de um cursor semelhante a um ponteiro do mouse.Se o valor for
spots
, os gestos do touch pad são apresentados por uma âncora que representa o centroide do gesto e um conjunto de pontos circulares que representam a posição de dedos individuais.
O valor padrão é pointer
quando a propriedade de entrada INPUT_PROP_SEMI_MT
é definida, ou spots
caso contrário.
Campos X
e Y
Os campos X e Y fornecem informações posicionais para o centro da área de contato.
Cálculo
O cálculo é simples: as informações posicionais do driver de toque são interpoladas linearmente para o sistema de coordenadas de saída.
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
Os campos TouchMajor
e TouchMinor
descrevem as dimensões aproximadas da área de contato em unidades de saída (pixels).
Os campos ToolMajor
e ToolMinor
descrevem as dimensões aproximadas da própria ferramenta em unidades de saída (pixels).
O campo Size
descreve o tamanho normalizado do toque em relação ao maior toque possível que o dispositivo de toque pode detectar. O menor tamanho normalizado possível é 0,0 (sem contato ou não é mensurável) e o maior tamanho normalizado possível é 1,0 (a área do sensor está saturada).
Quando o comprimento e a largura aproximados podem ser medidos, o campo TouchMajor
especifica a dimensão mais longa e o campo TouchMinor
especifica a dimensão mais curta da área de contato. Quando apenas o diâmetro aproximado da área de contato puder ser medido, os campos TouchMajor
e TouchMinor
serão iguais.
Da mesma forma, o campo ToolMajor
especifica a dimensão mais longa e o campo ToolMinor
especifica a dimensão mais curta da área de seção transversal da ferramenta.
Se o tamanho do toque não estiver disponível, mas o tamanho da ferramenta estiver disponível, o tamanho da ferramenta será definido como igual ao tamanho do toque. Por outro lado, se o tamanho da ferramenta não estiver disponível, mas o tamanho do toque estiver disponível, o tamanho do toque será definido como igual ao tamanho da ferramenta.
Os dispositivos de toque medem ou informam o tamanho do toque e o tamanho da ferramenta de várias maneiras. A implementação atual suporta três tipos diferentes de medidas: diâmetro, área e caixa delimitadora geométrica em unidades de superfície.
touch.size.calibration
Definição: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Especifica o tipo de medida usado pelo driver de toque para relatar o tamanho do toque e o tamanho da ferramenta.
Se o valor for
none
, o tamanho será definido como zero.Se o valor for
geometric
, supõe-se que o tamanho seja especificado nas mesmas unidades de superfície que a posição, portanto, é dimensionado da mesma maneira.Se o valor for
diameter
, assume-se que o tamanho é proporcional ao diâmetro (largura) do toque ou da ferramenta.Se o valor for
area
, assume-se que o tamanho é proporcional à área do toque ou da ferramenta.Se o valor for
default
, o sistema usará a calibraçãogeometric
se o eixoraw.touchMajor
ouraw.toolMajor
estiver disponível, caso contrário, usaránone
calibração.
touch.size.scale
Definição: touch.size.scale
= <um número de ponto flutuante não negativo>
Especifica um fator de escala constante usado na calibração.
O valor padrão é 1.0
.
touch.size.bias
Definição: touch.size.bias
= <um número de ponto flutuante não negativo>
Especifica um valor de polarização constante usado na calibração.
O valor padrão é 0.0
.
touch.size.isSummed
Definição: touch.size.isSummed
= 0
| 1
Especifica se o tamanho é relatado como a soma dos tamanhos de todos os contatos ativos ou é relatado individualmente para cada contato.
Se o valor for
1
, o tamanho informado será dividido pelo número de contatos antes do uso.Se o valor for
0
, o tamanho informado será usado como está.
O valor padrão é 0
.
Alguns dispositivos de toque, particularmente os dispositivos "Semi-MT", não conseguem distinguir as dimensões individuais de vários contatos, portanto, eles relatam uma medida de tamanho que representa sua área ou largura total. Esta propriedade só deve ser definida como 1
para tais dispositivos. Em caso de dúvida, defina este valor para 0
.
Cálculo
O cálculo dos TouchMajor
, TouchMinor
, ToolMajor
, ToolMinor
e Size
depende dos parâmetros de calibração 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
O campo Pressure
descreve a pressão física aproximada aplicada ao dispositivo de toque como um valor normalizado entre 0,0 (sem toque) e 1,0 (força total).
Uma pressão zero indica que a ferramenta está pairando.
touch.pressure.calibration
Definição: touch.pressure.calibration
= none
| physical
| amplitude
| default
Especifica o tipo de medição usado pelo driver de toque para relatar a pressão.
Se o valor for
none
, a pressão é desconhecida, portanto, é definida como 1,0 ao tocar e 0,0 ao pairar.Se o valor for
physical
, assume-se que o eixo de pressão mede a intensidade física real da pressão aplicada ao 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.