O Android oferece suporte a uma variedade de telas sensíveis ao toque e touch pads, incluindo tablets digitalizadores baseados em caneta.
Telas sensíveis ao toque são dispositivos sensíveis ao toque associados a uma tela de forma que o usuário tenha a impressão de manipular diretamente os itens na tela.
Touch pads são dispositivos sensíveis ao toque que não estão associados a uma tela, como uma mesa digitalizadora. 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.
Os dispositivos sensíveis ao toque podem ter botões cujas funções são semelhantes às dos botões do mouse.
Às vezes, os dispositivos de toque podem ser manipulados usando uma variedade de ferramentas diferentes, como os dedos ou uma caneta, dependendo da tecnologia do sensor de toque subjacente.
Dispositivos sensíveis ao 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 tem dupla finalidade como parte de um teclado sensível ao toque.
Devido à grande variedade de dispositivos sensíveis ao toque, o Android depende de um grande número de propriedades de configuração para descrever as características e o comportamento desejado de cada dispositivo.
Classificação de dispositivos de toque
Um dispositivo de entrada é classificado como um dispositivo multitoque se ambas as condições a seguir forem válidas:
- 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 de 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 forem válidas:
- O dispositivo de entrada não é classificado como dispositivo multitoque. Um dispositivo de entrada é classificado como dispositivo de toque único ou como 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-chaveBTN_TOUCH
.
Quando um dispositivo de entrada é classificado como 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 teclas virtuais estiver disponível, o arquivo de layout de teclas do dispositivo também será carregado. Consulte [Arquivos de mapa de chave virtual](#virtual-key-map-files) para obter informações sobre a localização e o formato desses arquivos.
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 de dispositivos 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, como telas sensíveis ao toque USB externas ou Bluetooth HID ou touch pads. Esses padrões não foram projetados para telas sensíveis ao toque integradas e podem resultar em comportamento incorreto.
Depois que a configuração do dispositivo de entrada é carregada, o sistema classifica o dispositivo de entrada como tela sensível ao toque , touch pad ou dispositivo apontador .
- Um dispositivo touch screen é usado para manipulação direta de objetos na tela. O usuário toca diretamente na tela, de forma que o sistema não necessita de recursos adicionais para indicar os objetos que estão sendo manipulados.
- Um dispositivo touch pad é usado para fornecer informações de posicionamento absoluto a um aplicativo sobre toques em uma determinada área do sensor. Pode ser útil para tablets digitalizadores.
- Um dispositivo 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 indiretos do ponteiro multitoque 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 apontador.
- Se a propriedade
touch.deviceType
estiver definida, o tipo de dispositivo será definido conforme indicado. - Se o dispositivo de entrada relatar a presença da propriedade de entrada
INPUT_PROP_DIRECT
(por meio do ioctlEVIOCGPROP
), o tipo de dispositivo será definido como touch screen . Esta 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
(por meio do ioctlEVIOCGPROP
), o tipo de dispositivo será definido como pointer . - 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 . Esta condição resolve uma ambigüidade para dispositivos de entrada que consistem em um mouse e um touch pad. Nesse caso, o touch pad não é usado para controlar o ponteiro porque o mouse já o controla. - Caso contrário, o tipo de dispositivo será definido como pointer . Esse padrão garante que os touch pads que não foram designados para nenhuma outra finalidade especial controlem o ponteiro.
Botões
Botões são controles opcionais que os aplicativos podem usar para executar funções adicionais. Os botões em dispositivos sensíveis ao toque se comportam de maneira semelhante aos botões do mouse e são usados principalmente com dispositivos sensíveis ao 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 chaveKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
eBTN_EXTRA
: mapeado paraMotionEvent.BUTTON_FORWARD
. Pressionar este botão também sintetiza um pressionamento de tecla com o código de chaveKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: mapeado paraMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: mapeado paraMotionEvent.BUTTON_TERTIARY
.
Ferramentas e tipos de ferramentas
Uma ferramenta é um dedo, uma caneta ou outro aparelho usado para interagir com o dispositivo de toque. Alguns dispositivos sensíveis ao toque podem distinguir entre diferentes tipos de ferramentas.
Em outras partes do Android, como na API MotionEvent
, uma ferramenta costuma ser chamada de ponteiro .
Os seguintes tipos de ferramentas são suportados:
-
BTN_TOOL_FINGER
eMT_TOOL_FINGER
: Mapeado 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
: mapeado paraMotionEvent.TOOL_TYPE_FINGER
.
Ferramentas de pairar versus tocar
As ferramentas podem estar em contato com o dispositivo de toque ou ao alcance e pairar acima dele. Nem todos os dispositivos sensíveis ao toque conseguem detectar a presença de uma ferramenta pairando sobre o dispositivo sensível ao 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
distingue ferramentas de toque de ferramentas flutuantes. Da mesma forma, ferramentas de toque e ferramentas de flutuação 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 de pairar 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 de driver de dispositivo de toque
- Os drivers de dispositivos de toque devem registrar apenas os eixos e códigos-chave dos eixos e botões que eles suportam. O registro de eixos ou códigos-chave não suportados 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 reportar o código da chave
BTN_TOUCH
, o sistema assume queBTN_TOUCH
é sempre usado para indicar se a ferramenta está tocando a tela. Portanto,BTN_TOUCH
não deve ser usado para indicar que a ferramenta está apenas no intervalo e pairando. - Dispositivos de toque único usam os seguintes eventos de entrada do Linux:
-
ABS_X
: (OBRIGATÓRIO) Informa a coordenada X da ferramenta. -
ABS_Y
: (OBRIGATÓRIO) Informa a coordenada Y da ferramenta. -
ABS_PRESSURE
: (opcional) Informa a pressão física aplicada à ponta da ferramenta ou a intensidade 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 a partir da superfície do dispositivo de toque ao longo do eixo X. -
ABS_TILT_Y
: (opcional) Informa a inclinação da ferramenta a partir da superfície do dispositivo de toque ao longo do eixo Y. -
BTN_TOUCH
: (OBRIGATÓ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
: Informa o tipo de ferramenta .
-
- 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 à ponta da ferramenta ou a intensidade 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 mais longa 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 reportando 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 mais longa da própria ferramenta. Não use este eixo a menos que conheça as dimensões da própria ferramenta. -
ABS_MT_WIDTH_MINOR
: (opcional) Informa o comprimento da dimensão mais curta da própria ferramenta. Este eixo não deve ser utilizado seABS_MT_WIDTH_MAJOR
estiver reportando 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 arbitrário não negativo usado para identificar e rastrear cada ferramenta de forma independente quando diversas ferramentas estão ativas. Por exemplo, quando vários dedos tocam o dispositivo, cada dedo deve receber um ID de rastreamento distinto que será usado 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 utilizar o protocolo multitoque Linux 'B'. Consulte a documentação do protocolo multitoque do Linux para obter mais detalhes. -
BTN_TOUCH
: (OBRIGATÓ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
: Informa o tipo de ferramenta .
-
- Se os eixos para o protocolo de toque único e multitoque forem definidos, apenas os eixos multitoque serão usados e os eixos de toque único serão ignorados.
Os valores mínimo e máximo dos eixos
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 sensível ao 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 da tela 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 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 depois se mover para fora 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 fixar as coordenadas de toque nos limites da área ativa. Se um toque sair da área ativa, deverá ser relatado como estando fora da área ativa ou não deverá ser relatado de forma alguma.
Por exemplo, se o dedo do usuário estiver tocando próximo ao canto superior esquerdo da tela sensível ao toque, ele poderá reportar uma coordenada de (minX, minY). Se o dedo continuar a se mover para fora da área ativa, a tela sensível ao toque deverá começar a reportar coordenadas com componentes menores que minX e minY, como (minX - 2, minY - 3), ou deverá parar de reportar o toque completamente. Em outras palavras, a tela sensível ao toque não deve reportar (minX, minY) quando o dedo do usuário está realmente tocando fora da área ativa.
Fixar as coordenadas de toque na borda da tela cria um limite rígido artificial ao redor da borda da tela, o que impede o sistema de rastrear suavemente os movimentos que entram ou saem dos limites da área de exibição.
Os valores relatados por
ABS_PRESSURE
ouABS_MT_PRESSURE
, se forem relatados, devem ser diferentes de zero quando a ferramenta estiver tocando o dispositivo e zero caso contrário, para indicar que a ferramenta está pairando.Relatar informações sobre pressão é opcional , mas altamente recomendado. Os aplicativos podem usar informações de pressão para implementar desenhos sensíveis à 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.Relatar informações sobre tamanho é opcional , mas altamente recomendado. Os aplicativos podem usar informações de pressão para implementar desenhos sensíveis ao tamanho e outros efeitos.
Os valores informados por
ABS_DISTANCE
ouABS_MT_DISTANCE
devem aproximar-se 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 com caneta.
Os valores informados por
ABS_TILT_X
eABS_TILT_Y
devem ser zero quando a ferramenta estiver perpendicular ao dispositivo. Uma inclinação diferente de zero indica que a ferramenta é mantida inclinada.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.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 com caneta.
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 tipo de ferramenta será padronizado comoMotionEvent.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.Esta condição implica que
InputReader
precisa ter pelo menos alguma informação sobre a natureza da ferramenta, seja ela tocante, ou pelo menos o seu tipo de ferramenta. Se nenhuma informação estiver disponível, a ferramenta será considerada inativa (fora do intervalo).- Ao usar o protocolo multitoque 'A', a ferramenta fica ativa sempre que aparece no relatório de sincronização mais recente. Quando a ferramenta deixa de aparecer nos relatórios de sincronização, ela deixa de existir.
- Ao utilizar o protocolo multitoque 'B', a ferramenta fica ativa enquanto tiver 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
, então a ferramenta não está pairando, mesmo que uma das condições a seguir seja verdadeira. - Se a ferramenta estiver ativa e o driver reportar informações de pressão, e a pressão reportada for zero, então a ferramenta está pairando.
- Se a ferramenta estiver ativa e o driver suportar o código-chave
BTN_TOUCH
eBTN_TOUCH
tiver um valor zero, a ferramenta estará pairando.
- Se a ferramenta for
-
InputReader
suporta protocolo multitoque 'A' e 'B'. Novos drivers devem usar o protocolo 'B', mas ambos funcionam. A partir do Android 4.0, os drivers da tela sensível ao toque podem precisar ser alterados para ficarem em conformidade com a especificação do protocolo de entrada do Linux.
As seguintes alterações podem ser necessárias:
Quando uma ferramenta fica inativa (o dedo sobe), 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 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 suportado.
As informações de pressão física ou intensidade 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 sobre o tamanho do 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.
Operação do dispositivo de toque
A seguir está um breve resumo da operação do dispositivo de toque no Android.
-
EventHub
lê eventos brutos do driverevdev
. -
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 BACK ou FORWARD foi pressionado ou liberado,
InputReader
notificaInputDispatcher
sobre o evento chave. -
InputReader
determina se ocorreu um pressionamento de tecla virtual. Nesse caso, ele notificaInputDispatcher
sobre o evento principal. -
InputReader
determina se o toque foi iniciado dentro dos limites da tela. Nesse caso, ele notificaInputDispatcher
sobre o evento touch. - Se não houver ferramentas de toque, mas houver pelo menos uma ferramenta de foco,
InputReader
notificaráInputDispatcher
sobre o evento de foco. - Se o tipo de dispositivo de toque for pointer ,
InputReader
executará a detecção do gesto do ponteiro, moverá o ponteiro e os pontos de acordo e notificaráInputDispatcher
sobre o evento do ponteiro. -
InputDispatcher
usaWindowManagerPolicy
para determinar se os eventos devem ser despachados e se devem ativar o dispositivo. Em seguida,InputDispatcher
entrega os eventos aos aplicativos apropriados.
Configuração do dispositivo de toque
O comportamento do dispositivo de toque é determinado pelos eixos, botões, propriedades de entrada, configuração do dispositivo de entrada, mapa de teclas virtuais e layout de teclas do dispositivo.
Consulte as seções a seguir para obter mais detalhes sobre os arquivos que participam da configuração do teclado:
Propriedades
O sistema depende de 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 dispositivos para dispositivos sensíveis ao 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 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, utilizamos as seguintes convenções para descrever os valores utilizados pelo sistema durante o processo de calibração.
Valores brutos do eixo
As expressões a seguir denotam os valores brutos relatados pelo driver do 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 de eixos brutos
As expressões a seguir denotam os limites dos 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 têm precisão de +/- 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
.
Intervalos de saída
As expressões a seguir denotam as características do sistema de coordenadas de saída. O sistema usa interpolação linear para traduzir informações de posição de toque das unidades de superfície usadas pelo dispositivo de toque nas unidades de saída que são relatadas aos 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 monitor), a largura de saída é igual
raw.width
, indicando que nenhuma interpolação é 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 uma tela), a altura de saída é igual
raw.height
, indicando que nenhuma interpolação é 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 por 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, juntamente 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 será uma tela sensível ao toque associada a um display.Se o valor for
touchPad
, o dispositivo de toque será um touch pad não associado a um monitor.Se o valor for
pointer
, o dispositivo de toque é um touch pad não associado a uma tela e seus movimentos são usados para gestos indiretos do ponteiro multitoque .Se o valor for
default
, o sistema detectará 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.
No Android 3 e versões anteriores, todos os dispositivos sensíveis ao toque eram considerados telas sensíveis ao toque.
touch.orientationAware
Definição: touch.orientationAware
= 0
| 1
Especifica se o dispositivo de toque deve reagir às alterações de orientação da tela.
Se o valor for
1
, as posições de toque informadas 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 informadas pelo dispositivo de toque serão imunes a alterações de orientação da tela.
O valor padrão é 1
se o dispositivo for uma tela sensível ao toque, 0
caso contrário.
O sistema distingue entre telas sensíveis ao toque e displays internos e externos. Uma tela sensível ao toque interna com orientação é girada com base na orientação da tela interna. Uma tela sensível ao toque externa com orientação é girada com base na orientação do monitor externo.
O reconhecimento de orientação é usado para oferecer 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 seja relatado como um toque no canto superior esquerdo canto do sistema de coordenadas girado 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, presumia-se que todos os dispositivos de toque tinham reconhecimento de 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 pointer .
Se o valor for
pointer
, os gestos do touch pad serão apresentados por meio de um cursor semelhante ao ponteiro do mouse.Se o valor for
spots
, os gestos do touch pad serão apresentados por uma âncora que representa o centróide 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
está 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 de posição do driver de toque são interpoladas linearmente no 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 tamanho
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 da 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 relatam 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.
Definição: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Especifica o tipo de medida usada 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
, presume-se que o tamanho seja especificado nas mesmas unidades de superfície que a posição, portanto, ele é dimensionado da mesma maneira.Se o valor for
diameter
, o tamanho será considerado proporcional ao diâmetro (largura) do toque ou da ferramenta.Se o valor for
area
, o tamanho será considerado proporcional à área do toque ou da ferramenta.Se o valor for
default
, o sistema utiliza a calibraçãogeometric
se o eixoraw.touchMajor
ouraw.toolMajor
estiver disponível, caso contrário utiliza a calibraçãonone
.
toque.tamanho.escala
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
.
toque.tamanho.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 individualmente para cada contato.
Se o valor for
1
, o tamanho relatado será dividido pelo número de contatos antes do uso.Se o valor for
0
, o tamanho relatado será usado como está.
O valor padrão é 0
.
Alguns dispositivos de toque, especialmente os dispositivos "Semi-MT", não conseguem distinguir as dimensões individuais de vários contatos, portanto, informam 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 esse valor como 0
.
Cálculo
O cálculo dos campos 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 pressão
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 (pressão normal).
Uma pressão zero indica que a ferramenta está pairando.
toque.pressão.calibração
Definição: touch.pressure.calibration
= none
| physical
| amplitude
| default
Especifica o tipo de medição usada 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
, presume-se que o eixo de pressão mede a intensidade física real da pressão aplicada ao touch pad.Se o valor for
amplitude
, assume-se que o eixo de pressão mede a amplitude do sinal, que está relacionada ao tamanho do contato e à pressão aplicada.Se o valor for
default
, o sistema utiliza a calibraçãophysical
se o eixo de pressão estiver disponível, caso contrário não utilizanone
.
toque.pressão.escala
Definição: touch.pressure.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 / raw.pressure.max
. Pressure.max .
Cálculo
O cálculo do campo pressure
depende dos parâmetros de calibração especificados.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
campos de orientação e inclinação
O campo orientation
descreve a orientação do toque e da ferramenta como uma medida angular. Uma orientação de 0
indica que o eixo principal está orientado verticalmente, -PI/2
indica que o eixo principal está orientado para a esquerda, PI/2
indica que o eixo principal está orientado para a direita. Quando uma ferramenta de caneta está presente, o intervalo de orientação pode ser descrito em um círculo completo de -PI
ou PI
.
O campo tilt
descreve a inclinação da ferramenta como uma medida angular. Uma inclinação de 0
indica que a ferramenta está perpendicular à superfície. Uma inclinação de PI/2
indica que a ferramenta está plana na superfície.
toque.orientação.calibração
Definição: touch.orientation.calibration
= none
| interpolated
| vector
| default
Especifica o tipo de medida usada pelo driver de toque para relatar a orientação.
- Se o valor for
none
, a orientação é desconhecida, portanto é definida como 0. - Se o valor for
interpolated
, a orientação será interpolada linearmente de modo que um valor bruto deraw.orientation.min
seja mapeado para-PI/2
e um valor bruto deraw.orientation.max
seja mapeado paraPI/2
. O valor central de(raw.orientation.min + raw.orientation.max) / 2
é mapeado para0
. - Se o valor for
vector
, a orientação será interpretada como um vetor compactado que consiste em dois campos assinados de 4 bits. Esta representação é usada em peças do Atmel Object Based Protocol. Quando decodificado, o vetor produz um ângulo de orientação e uma magnitude de confiança. A magnitude de confiança é usada para dimensionar as informações de tamanho, a menos que seja geométrica. - Se o valor for
default
, o sistema usará a calibraçãointerpolated
se o eixo de orientação estiver disponível, caso contrário, usaránone
.
Cálculo
O cálculo dos campos de orientation
e tilt
depende dos parâmetros de calibração especificados e das entradas disponíveis.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
campo de distância
O campo distance
descreve a distância entre a ferramenta e a superfície do dispositivo de toque. Um valor de 0,0 indica contato direto e valores maiores indicam aumento da distância da superfície.
toque.distância.calibração
Definição: touch.distance.calibration
= none
| scaled
| default
Especifica o tipo de medição usada pelo driver de toque para relatar a distância.
Se o valor for
none
, a distância é desconhecida, portanto é definida como 0.Se o valor for
scaled
, a distância informada será multiplicada por um fator de escala constante.Se o valor for
default
, o sistema usará a calibraçãoscaled
se o eixo de distância estiver disponível, caso contrário, usaránone
.
toque.distância.escala
Definição: touch.distance.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
.
Cálculo
O cálculo do campo distance
depende dos parâmetros de calibração especificados.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Exemplo
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Notas de compatibilidade
As propriedades de configuração dos dispositivos sensíveis ao toque mudaram significativamente no Android Ice Cream Sandwich 4.0. Todos os arquivos de configuração de dispositivos de entrada para dispositivos de toque devem ser atualizados para usar as novas propriedades de configuração.
Drivers de dispositivos de toque mais antigos também podem precisar ser atualizados.
Arquivos de mapa de chave virtual
Dispositivos sensíveis ao toque podem ser usados para implementar teclas virtuais.
Existem várias maneiras de fazer isso, dependendo dos recursos do controlador de toque. Alguns controladores de toque podem ser configurados diretamente para implementar teclas programáveis, definindo registros de firmware. Outras vezes é desejável realizar o mapeamento das coordenadas de toque para os códigos-chave no software.
Quando chaves virtuais são implementadas em software, o kernel deve exportar um arquivo de mapa de chave virtual chamado virtualkeys.<devicename>
como uma propriedade da placa. Por exemplo, se os drivers do dispositivo de tela sensível ao toque relatarem seu nome como "touchyfeely", o arquivo de mapa de chave virtual deverá ter o caminho /sys/board_properties/virtualkeys.touchyfeely
.
Um arquivo de mapa de teclas virtuais descreve as coordenadas e os códigos das teclas virtuais do Linux na tela de toque.
Além do arquivo de mapa de teclas virtuais, deve haver um arquivo de layout de teclas e um arquivo de mapa de caracteres de teclas correspondentes para mapear os códigos de teclas do Linux para os códigos de teclas do Android e para especificar o tipo de dispositivo de teclado (geralmente SPECIAL_FUNCTION
).
Sintaxe
Um arquivo de mapa de chave virtual é um arquivo de texto simples que consiste em uma sequência de descrições de layout de chave virtual separadas por novas linhas ou dois pontos.
As linhas de comentários começam com '#' e continuam até o final da linha.
Cada chave virtual é descrita por 6 componentes delimitados por dois pontos:
-
0x01
: Um código de versão. Deve ser sempre0x01
. - <Código chave Linux>: O código chave Linux da chave virtual.
- <centerX>: A coordenada de pixel X do centro da chave virtual.
- <centerY>: A coordenada de pixel Y do centro da chave virtual.
- <width>: A largura da chave virtual em pixels.
- <height>: A altura da chave virtual em pixels.
Todas as coordenadas e tamanhos são especificados em termos do sistema de coordenadas de exibição.
Aqui está um arquivo de mapa de chave virtual escrito em uma linha.
# 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
O mesmo arquivo de mapa de chave virtual também pode ser gravado em múltiplas linhas.
# 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
No exemplo acima, a tela sensível ao toque tem resolução de 480x800. Assim, todas as teclas virtuais têm uma coordenada <centerY> de 835, que fica um pouco abaixo da área visível da tela sensível ao toque.
A primeira chave tem um código de varredura Linux de 158
( KEY_BACK
), centerX de 55
, centerY de 835
, largura de 90
e altura de 55
.
Exemplo
Arquivo de mapa de chave virtual: /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
Arquivo de layout de chave: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Arquivo de mapa de caracteres principais: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gestos indiretos de ponteiro multitoque
No modo ponteiro, o sistema interpreta os seguintes gestos:
- Toque com um dedo: clique.
- Movimento de um dedo: mova o ponteiro.
- Movimento de um dedo mais pressionamento de botão: arraste o ponteiro.
- Movimento de dois dedos, ambos os dedos se movendo na mesma direção: arraste a área sob o ponteiro nessa direção. O ponteiro em si não se move.
- Movimento de dois dedos, ambos os dedos movendo-se um em direção ao outro ou separados em direções diferentes: deslocar/dimensionar/girar a área ao redor do ponteiro. O ponteiro em si não se move.
- Movimento de vários dedos: gesto de forma livre.
Rejeição de palma
A partir do Android 13, o sistema pode rejeitar automaticamente entradas do Palm quando a estrutura integrada estiver habilitada. Soluções internas personalizadas ainda são suportadas, embora possam precisar ser modificadas para retornar o sinalizador TOOL_TYPE_PALM
quando um palm for detectado. A estrutura integrada também funciona em conjunto com soluções personalizadas.
O modelo real analisa os primeiros 90 ms de dados de gesto, o ponteiro atual e os ponteiros circundantes e, em seguida, considera a que distância da borda da tela os toques estão. Em seguida, ele determina, por ponteiro, quais dos ponteiros são palmas. Também leva em consideração o tamanho de cada contato, conforme relatado por touchMajor
e touchMinor
. A estrutura do Android remove os ponteiros marcados como palmas do fluxo de toque.
Se um ponteiro já foi enviado para os aplicativos, o sistema:
- (Se houver outros ponteiros ativos) Cancela o ponteiro com
ACTION_POINTER_UP
eFLAG_CANCELED
definidos. - (Se este for o único ponteiro) Cancela o ponteiro com
ACTION_CANCEL
.
Uma API pública, MotionEvent.FLAG_CANCELED
, indica que o evento atual não deve acionar a ação do usuário. Este sinalizador é definido para ACTION_CANCEL
e ACTION_POINTER_UP
.
Se o ponteiro da palma não foi enviado para os aplicativos, o sistema simplesmente descarta o ponteiro.
Ativar rejeição de palma
- No seu driver de toque, use a macro
input_abs_set_res
para definir as resoluções para os seguintes campos (as unidades são pixels por mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
O suporte para
ABS_MT_TOUCH_MINOR
é opcional. No entanto, se o seu dispositivo for compatível, certifique-se de que a resolução esteja definida corretamente. -
- Para confirmar se os campos estão configurados corretamente, execute:
$ adb shell getevent -li
- Para habilitar o recurso durante o tempo de execução, execute:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Reinicie o processo
system_server
.$ adb shell stop && adb shell start
- Confirme se
adb shell dumpsys input
mostra que há rejeitores de palm dentro deUnwantedInteractionBlocker
. Caso contrário, verifique os logs relacionados à entrada para encontrar pistas sobre o que pode estar configurado incorretamente.Veja o exemplo a seguir para referência:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Para ativar permanentemente o recurso, adicione o comando sysprop correspondente em seu arquivo
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
Leitura adicional
,O Android oferece suporte a uma variedade de telas sensíveis ao toque e touch pads, incluindo tablets digitalizadores baseados em caneta.
Telas sensíveis ao toque são dispositivos sensíveis ao toque associados a uma tela de forma que o usuário tenha a impressão de manipular diretamente os itens na tela.
Touch pads são dispositivos sensíveis ao toque que não estão associados a uma tela, como uma mesa digitalizadora. 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.
Os dispositivos sensíveis ao toque podem ter botões cujas funções são semelhantes às dos botões do mouse.
Às vezes, os dispositivos de toque podem ser manipulados usando uma variedade de ferramentas diferentes, como os dedos ou uma caneta, dependendo da tecnologia do sensor de toque subjacente.
Dispositivos sensíveis ao 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 tem dupla finalidade como parte de um teclado sensível ao toque.
Devido à grande variedade de dispositivos sensíveis ao toque, o Android depende de um grande número de propriedades de configuração para descrever as características e o comportamento desejado de cada dispositivo.
Classificação de dispositivos de toque
Um dispositivo de entrada é classificado como um dispositivo multitoque se ambas as condições a seguir forem válidas:
- 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 de 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 forem válidas:
- O dispositivo de entrada não é classificado como dispositivo multitoque. Um dispositivo de entrada é classificado como dispositivo de toque único ou como 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-chaveBTN_TOUCH
.
Quando um dispositivo de entrada é classificado como 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 teclas virtuais estiver disponível, o arquivo de layout de teclas do dispositivo também será carregado. Consulte [Arquivos de mapa de chave virtual](#virtual-key-map-files) para obter informações sobre a localização e o formato desses arquivos.
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 de dispositivos 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, como telas sensíveis ao toque USB externas ou Bluetooth HID ou touch pads. Esses padrões não foram projetados para telas sensíveis ao toque integradas e podem resultar em comportamento incorreto.
Depois que a configuração do dispositivo de entrada é carregada, o sistema classifica o dispositivo de entrada como tela sensível ao toque , touch pad ou dispositivo apontador .
- Um dispositivo touch screen é usado para manipulação direta de objetos na tela. O usuário toca diretamente na tela, de forma que o sistema não necessita de recursos adicionais para indicar os objetos que estão sendo manipulados.
- Um dispositivo touch pad é usado para fornecer informações de posicionamento absoluto a um aplicativo sobre toques em uma determinada área do sensor. Pode ser útil para tablets digitalizadores.
- Um dispositivo 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 indiretos do ponteiro multitoque 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 apontador.
- Se a propriedade
touch.deviceType
estiver definida, o tipo de dispositivo será definido conforme indicado. - Se o dispositivo de entrada relatar a presença da propriedade de entrada
INPUT_PROP_DIRECT
(por meio do ioctlEVIOCGPROP
), o tipo de dispositivo será definido como touch screen . Esta 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
(por meio do ioctlEVIOCGPROP
), o tipo de dispositivo será definido como pointer . - 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 . Esta condição resolve uma ambigüidade para dispositivos de entrada que consistem em um mouse e um touch pad. Nesse caso, o touch pad não é usado para controlar o ponteiro porque o mouse já o controla. - Caso contrário, o tipo de dispositivo será definido como pointer . Esse padrão garante que os touch pads que não foram designados para nenhuma outra finalidade especial controlem o ponteiro.
Botões
Botões são controles opcionais que os aplicativos podem usar para executar funções adicionais. Os botões em dispositivos sensíveis ao toque se comportam de maneira semelhante aos botões do mouse e são usados principalmente com dispositivos sensíveis ao 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 chaveKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
eBTN_EXTRA
: mapeado paraMotionEvent.BUTTON_FORWARD
. Pressionar este botão também sintetiza um pressionamento de tecla com o código de chaveKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: mapeado paraMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: mapeado paraMotionEvent.BUTTON_TERTIARY
.
Ferramentas e tipos de ferramentas
Uma ferramenta é um dedo, uma caneta ou outro aparelho usado para interagir com o dispositivo de toque. Alguns dispositivos sensíveis ao toque podem distinguir entre diferentes tipos de ferramentas.
Em outras partes do Android, como na API MotionEvent
, uma ferramenta costuma ser chamada de ponteiro .
Os seguintes tipos de ferramentas são suportados:
-
BTN_TOOL_FINGER
eMT_TOOL_FINGER
: Mapeado 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
: mapeado paraMotionEvent.TOOL_TYPE_FINGER
.
Ferramentas de pairar versus tocar
As ferramentas podem estar em contato com o dispositivo de toque ou ao alcance e pairar acima dele. Nem todos os dispositivos sensíveis ao toque conseguem detectar a presença de uma ferramenta pairando sobre o dispositivo sensível ao 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
distingue ferramentas de toque de ferramentas flutuantes. Da mesma forma, ferramentas de toque e ferramentas de flutuação 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 de pairar 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 de driver de dispositivo de toque
- Os drivers de dispositivos de toque devem registrar apenas os eixos e códigos-chave dos eixos e botões que eles suportam. O registro de eixos ou códigos-chave não suportados 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 reportar o código da chave
BTN_TOUCH
, o sistema assume queBTN_TOUCH
é sempre usado para indicar se a ferramenta está tocando a tela. Portanto,BTN_TOUCH
não deve ser usado para indicar que a ferramenta está apenas no intervalo e pairando. - Dispositivos de toque único usam os seguintes eventos de entrada do Linux:
-
ABS_X
: (OBRIGATÓRIO) Informa a coordenada X da ferramenta. -
ABS_Y
: (OBRIGATÓRIO) Informa a coordenada Y da ferramenta. -
ABS_PRESSURE
: (opcional) Informa a pressão física aplicada à ponta da ferramenta ou a intensidade 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 a partir da superfície do dispositivo de toque ao longo do eixo X. -
ABS_TILT_Y
: (opcional) Informa a inclinação da ferramenta a partir da superfície do dispositivo de toque ao longo do eixo Y. -
BTN_TOUCH
: (OBRIGATÓ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
: Informa o tipo de ferramenta .
-
- 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 à ponta da ferramenta ou a intensidade 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 mais longa 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 reportando 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 mais longa da própria ferramenta. Não use este eixo a menos que conheça as dimensões da própria ferramenta. -
ABS_MT_WIDTH_MINOR
: (opcional) Informa o comprimento da dimensão mais curta da própria ferramenta. Este eixo não deve ser utilizado seABS_MT_WIDTH_MAJOR
estiver reportando 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 arbitrário não negativo usado para identificar e rastrear cada ferramenta de forma independente quando diversas ferramentas estão ativas. Por exemplo, quando vários dedos tocam o dispositivo, cada dedo deve receber um ID de rastreamento distinto que será usado 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 utilizar o protocolo multitoque Linux 'B'. Consulte a documentação do protocolo multitoque do Linux para obter mais detalhes. -
BTN_TOUCH
: (OBRIGATÓ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
: Informa o tipo de ferramenta .
-
- Se os eixos para o protocolo de toque único e multitoque forem definidos, apenas os eixos multitoque serão usados e os eixos de toque único serão ignorados.
Os valores mínimo e máximo dos eixos
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 sensível ao 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 da tela 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 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 depois se mover para fora 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 fixar as coordenadas de toque nos limites da área ativa. Se um toque sair da área ativa, deverá ser relatado como estando fora da área ativa ou não deverá ser relatado de forma alguma.
Por exemplo, se o dedo do usuário estiver tocando próximo ao canto superior esquerdo da tela sensível ao toque, ele poderá reportar uma coordenada de (minX, minY). Se o dedo continuar a se mover para fora da área ativa, a tela sensível ao toque deverá começar a reportar coordenadas com componentes menores que minX e minY, como (minX - 2, minY - 3), ou deverá parar de reportar o toque completamente. Em outras palavras, a tela sensível ao toque não deve reportar (minX, minY) quando o dedo do usuário está realmente tocando fora da área ativa.
Fixar as coordenadas de toque na borda da tela cria um limite rígido artificial ao redor da borda da tela, o que impede o sistema de rastrear suavemente os movimentos que entram ou saem dos limites da área de exibição.
Os valores relatados por
ABS_PRESSURE
ouABS_MT_PRESSURE
, se forem relatados, devem ser diferentes de zero quando a ferramenta estiver tocando o dispositivo e zero caso contrário, para indicar que a ferramenta está pairando.Relatar informações sobre pressão é opcional , mas altamente recomendado. Os aplicativos podem usar informações de pressão para implementar desenhos sensíveis à 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.Relatar informações sobre tamanho é opcional , mas altamente recomendado. Os aplicativos podem usar informações de pressão para implementar desenhos sensíveis ao tamanho e outros efeitos.
Os valores informados por
ABS_DISTANCE
ouABS_MT_DISTANCE
devem aproximar-se 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 com caneta.
Os valores informados por
ABS_TILT_X
eABS_TILT_Y
devem ser zero quando a ferramenta estiver perpendicular ao dispositivo. Uma inclinação diferente de zero indica que a ferramenta é mantida inclinada.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.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 com caneta.
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 tipo de ferramenta será padronizado comoMotionEvent.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.Esta condição implica que
InputReader
precisa ter pelo menos alguma informação sobre a natureza da ferramenta, seja ela tocante, ou pelo menos o seu tipo de ferramenta. Se nenhuma informação estiver disponível, a ferramenta será considerada inativa (fora do intervalo).- Ao usar o protocolo multitoque 'A', a ferramenta fica ativa sempre que aparece no relatório de sincronização mais recente. Quando a ferramenta deixa de aparecer nos relatórios de sincronização, ela deixa de existir.
- Ao utilizar o protocolo multitoque 'B', a ferramenta fica ativa enquanto tiver 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
, então a ferramenta não está pairando, mesmo que uma das condições a seguir seja verdadeira. - Se a ferramenta estiver ativa e o driver reportar informações de pressão, e a pressão reportada for zero, então a ferramenta está pairando.
- Se a ferramenta estiver ativa e o driver suportar o código-chave
BTN_TOUCH
eBTN_TOUCH
tiver um valor zero, a ferramenta estará pairando.
- Se a ferramenta for
-
InputReader
suporta protocolo multitoque 'A' e 'B'. Novos drivers devem usar o protocolo 'B', mas ambos funcionam. A partir do Android 4.0, os drivers da tela sensível ao toque podem precisar ser alterados para ficarem em conformidade com a especificação do protocolo de entrada do Linux.
As seguintes alterações podem ser necessárias:
Quando uma ferramenta fica inativa (o dedo sobe), 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 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 suportado.
As informações de pressão física ou intensidade 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 sobre o tamanho do 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.
Operação do dispositivo de toque
A seguir está um breve resumo da operação do dispositivo de toque no Android.
-
EventHub
lê eventos brutos do driverevdev
. -
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 BACK ou FORWARD foi pressionado ou liberado,
InputReader
notificaInputDispatcher
sobre o evento chave. -
InputReader
determina se ocorreu um pressionamento de tecla virtual. Nesse caso, ele notificaInputDispatcher
sobre o evento principal. -
InputReader
determina se o toque foi iniciado dentro dos limites da tela. Nesse caso, ele notificaInputDispatcher
sobre o evento touch. - Se não houver ferramentas de toque, mas houver pelo menos uma ferramenta de foco,
InputReader
notificaráInputDispatcher
sobre o evento de foco. - Se o tipo de dispositivo de toque for pointer ,
InputReader
executará a detecção do gesto do ponteiro, moverá o ponteiro e os pontos de acordo e notificaráInputDispatcher
sobre o evento do ponteiro. -
InputDispatcher
usaWindowManagerPolicy
para determinar se os eventos devem ser despachados e se devem ativar o dispositivo. Em seguida,InputDispatcher
entrega os eventos aos aplicativos apropriados.
Configuração do dispositivo de toque
O comportamento do dispositivo de toque é determinado pelos eixos, botões, propriedades de entrada, configuração do dispositivo de entrada, mapa de teclas virtuais e layout de teclas do dispositivo.
Consulte as seções a seguir para obter mais detalhes sobre os arquivos que participam da configuração do teclado:
Propriedades
O sistema depende de 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 dispositivos para dispositivos sensíveis ao 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 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, utilizamos as seguintes convenções para descrever os valores utilizados pelo sistema durante o processo de calibração.
Valores brutos do eixo
As expressões a seguir denotam os valores brutos relatados pelo driver do 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 de eixos brutos
As expressões a seguir denotam os limites dos 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 têm precisão de +/- 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
.
Intervalos de saída
As expressões a seguir denotam as características do sistema de coordenadas de saída. O sistema usa interpolação linear para traduzir informações de posição de toque das unidades de superfície usadas pelo dispositivo de toque nas unidades de saída que são relatadas aos 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 monitor), a largura de saída é igual
raw.width
, indicando que nenhuma interpolação é 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 uma tela), a altura de saída é igual
raw.height
, indicando que nenhuma interpolação é 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 por 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, juntamente 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 será uma tela sensível ao toque associada a um display.Se o valor for
touchPad
, o dispositivo de toque será um touch pad não associado a um monitor.Se o valor for
pointer
, o dispositivo de toque é um touch pad não associado a uma tela e seus movimentos são usados para gestos indiretos do ponteiro multitoque .Se o valor for
default
, o sistema detectará 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.
No Android 3 e versões anteriores, todos os dispositivos sensíveis ao toque eram considerados telas sensíveis ao toque.
touch.orientationAware
Definição: touch.orientationAware
= 0
| 1
Especifica se o dispositivo de toque deve reagir às alterações de orientação da tela.
Se o valor for
1
, as posições de toque informadas 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 informadas pelo dispositivo de toque serão imunes a alterações de orientação da tela.
O valor padrão é 1
se o dispositivo for uma tela sensível ao toque, 0
caso contrário.
O sistema distingue entre telas sensíveis ao toque e displays internos e externos. Uma tela sensível ao toque interna com orientação é girada com base na orientação da tela interna. Uma tela sensível ao toque externa com orientação é girada com base na orientação do monitor externo.
O reconhecimento de orientação é usado para oferecer 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 seja relatado como um toque no canto superior esquerdo canto do sistema de coordenadas girado 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, presumia-se que todos os dispositivos de toque tinham reconhecimento de 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 pointer .
Se o valor for
pointer
, os gestos do touch pad serão apresentados por meio de um cursor semelhante ao ponteiro do mouse.Se o valor for
spots
, os gestos do touch pad serão apresentados por uma âncora que representa o centróide 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
está 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 de posição do driver de toque são interpoladas linearmente no 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 tamanho
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 da 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 relatam 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.
Definição: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Especifica o tipo de medida usada 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
, presume-se que o tamanho seja especificado nas mesmas unidades de superfície que a posição, portanto, ele é dimensionado da mesma maneira.Se o valor for
diameter
, o tamanho será considerado proporcional ao diâmetro (largura) do toque ou da ferramenta.Se o valor for
area
, o tamanho será considerado proporcional à área do toque ou da ferramenta.Se o valor for
default
, o sistema utiliza a calibraçãogeometric
se o eixoraw.touchMajor
ouraw.toolMajor
estiver disponível, caso contrário utiliza a calibraçãonone
.
toque.tamanho.escala
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
.
toque.tamanho.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 individualmente para cada contato.
Se o valor for
1
, o tamanho relatado será dividido pelo número de contatos antes do uso.Se o valor for
0
, o tamanho relatado será usado como está.
O valor padrão é 0
.
Alguns dispositivos de toque, especialmente os dispositivos "Semi-MT", não conseguem distinguir as dimensões individuais de vários contatos, portanto, informam 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 esse valor como 0
.
Cálculo
O cálculo dos campos 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 pressão
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 (pressão normal).
Uma pressão zero indica que a ferramenta está pairando.
toque.pressão.calibração
Definição: touch.pressure.calibration
= none
| physical
| amplitude
| default
Especifica o tipo de medição usada 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
, presume-se que o eixo de pressão mede a intensidade física real da pressão aplicada ao touch pad.Se o valor for
amplitude
, assume-se que o eixo de pressão mede a amplitude do sinal, que está relacionada ao tamanho do contato e à pressão aplicada.Se o valor for
default
, o sistema utiliza a calibraçãophysical
se o eixo de pressão estiver disponível, caso contrário não utilizanone
.
toque.pressão.escala
Definição: touch.pressure.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 / raw.pressure.max
. Pressure.max .
Cálculo
O cálculo do campo pressure
depende dos parâmetros de calibração especificados.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
campos de orientação e inclinação
O campo orientation
descreve a orientação do toque e da ferramenta como uma medida angular. Uma orientação de 0
indica que o eixo principal está orientado verticalmente, -PI/2
indica que o eixo principal está orientado para a esquerda, PI/2
indica que o eixo principal está orientado para a direita. Quando uma ferramenta de caneta está presente, o intervalo de orientação pode ser descrito em um círculo completo de -PI
ou PI
.
O campo tilt
descreve a inclinação da ferramenta como uma medida angular. Uma inclinação de 0
indica que a ferramenta está perpendicular à superfície. Uma inclinação de PI/2
indica que a ferramenta está plana na superfície.
toque.orientação.calibração
Definição: touch.orientation.calibration
= none
| interpolated
| vector
| default
Especifica o tipo de medida usada pelo driver de toque para relatar a orientação.
- Se o valor for
none
, a orientação é desconhecida, portanto é definida como 0. - Se o valor for
interpolated
, a orientação será interpolada linearmente de modo que um valor bruto deraw.orientation.min
seja mapeado para-PI/2
e um valor bruto deraw.orientation.max
seja mapeado paraPI/2
. O valor central de(raw.orientation.min + raw.orientation.max) / 2
é mapeado para0
. - Se o valor for
vector
, a orientação será interpretada como um vetor compactado que consiste em dois campos assinados de 4 bits. Esta representação é usada em peças do Atmel Object Based Protocol. Quando decodificado, o vetor produz um ângulo de orientação e uma magnitude de confiança. A magnitude de confiança é usada para dimensionar as informações de tamanho, a menos que seja geométrica. - Se o valor for
default
, o sistema usará a calibraçãointerpolated
se o eixo de orientação estiver disponível, caso contrário, usaránone
.
Cálculo
O cálculo dos campos de orientation
e tilt
depende dos parâmetros de calibração especificados e das entradas disponíveis.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
campo de distância
O campo distance
descreve a distância entre a ferramenta e a superfície do dispositivo de toque. Um valor de 0,0 indica contato direto e valores maiores indicam aumento da distância da superfície.
toque.distância.calibração
Definição: touch.distance.calibration
= none
| scaled
| default
Especifica o tipo de medição usada pelo driver de toque para relatar a distância.
Se o valor for
none
, a distância é desconhecida, portanto é definida como 0.Se o valor for
scaled
, a distância informada será multiplicada por um fator de escala constante.Se o valor for
default
, o sistema usará a calibraçãoscaled
se o eixo de distância estiver disponível, caso contrário, usaránone
.
toque.distância.escala
Definição: touch.distance.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
.
Cálculo
O cálculo do campo distance
depende dos parâmetros de calibração especificados.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Exemplo
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Notas de compatibilidade
As propriedades de configuração dos dispositivos sensíveis ao toque mudaram significativamente no Android Ice Cream Sandwich 4.0. Todos os arquivos de configuração de dispositivos de entrada para dispositivos de toque devem ser atualizados para usar as novas propriedades de configuração.
Drivers de dispositivos de toque mais antigos também podem precisar ser atualizados.
Arquivos de mapa de chave virtual
Dispositivos sensíveis ao toque podem ser usados para implementar teclas virtuais.
Existem várias maneiras de fazer isso, dependendo dos recursos do controlador de toque. Alguns controladores de toque podem ser configurados diretamente para implementar teclas programáveis, definindo registros de firmware. Outras vezes é desejável realizar o mapeamento das coordenadas de toque para os códigos-chave no software.
Quando chaves virtuais são implementadas em software, o kernel deve exportar um arquivo de mapa de chave virtual chamado virtualkeys.<devicename>
como uma propriedade da placa. Por exemplo, se os drivers do dispositivo de tela sensível ao toque relatarem seu nome como "touchyfeely", o arquivo de mapa de chave virtual deverá ter o caminho /sys/board_properties/virtualkeys.touchyfeely
.
Um arquivo de mapa de teclas virtuais descreve as coordenadas e os códigos das teclas virtuais do Linux na tela de toque.
Além do arquivo de mapa de teclas virtuais, deve haver um arquivo de layout de teclas e um arquivo de mapa de caracteres de teclas correspondentes para mapear os códigos de teclas do Linux para os códigos de teclas do Android e para especificar o tipo de dispositivo de teclado (geralmente SPECIAL_FUNCTION
).
Sintaxe
Um arquivo de mapa de chave virtual é um arquivo de texto simples que consiste em uma sequência de descrições de layout de chave virtual separadas por novas linhas ou dois pontos.
As linhas de comentários começam com '#' e continuam até o final da linha.
Cada chave virtual é descrita por 6 componentes delimitados por dois pontos:
-
0x01
: Um código de versão. Deve ser sempre0x01
. - <Código chave Linux>: O código chave Linux da chave virtual.
- <centerX>: A coordenada de pixel X do centro da chave virtual.
- <centerY>: A coordenada de pixel Y do centro da chave virtual.
- <width>: A largura da chave virtual em pixels.
- <height>: A altura da chave virtual em pixels.
Todas as coordenadas e tamanhos são especificados em termos do sistema de coordenadas de exibição.
Aqui está um arquivo de mapa de chave virtual escrito em uma linha.
# 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
O mesmo arquivo de mapa de chave virtual também pode ser gravado em múltiplas linhas.
# 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
No exemplo acima, a tela sensível ao toque tem resolução de 480x800. Assim, todas as teclas virtuais têm uma coordenada <centerY> de 835, que fica um pouco abaixo da área visível da tela sensível ao toque.
A primeira chave tem um código de varredura Linux de 158
( KEY_BACK
), centerX de 55
, centerY de 835
, largura de 90
e altura de 55
.
Exemplo
Arquivo de mapa de chave virtual: /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
Arquivo de layout de chave: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Arquivo de mapa de caracteres principais: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gestos indiretos de ponteiro multitoque
No modo ponteiro, o sistema interpreta os seguintes gestos:
- Toque com um dedo: clique.
- Movimento de um dedo: mova o ponteiro.
- Movimento de um dedo mais pressionamento de botão: arraste o ponteiro.
- Movimento de dois dedos, ambos os dedos se movendo na mesma direção: arraste a área sob o ponteiro nessa direção. O ponteiro em si não se move.
- Movimento de dois dedos, ambos os dedos movendo-se um em direção ao outro ou separados em direções diferentes: deslocar/dimensionar/girar a área ao redor do ponteiro. O ponteiro em si não se move.
- Movimento de vários dedos: gesto de forma livre.
Rejeição de palma
A partir do Android 13, o sistema pode rejeitar automaticamente entradas do Palm quando a estrutura integrada estiver habilitada. Soluções internas personalizadas ainda são suportadas, embora possam precisar ser modificadas para retornar o sinalizador TOOL_TYPE_PALM
quando um palm for detectado. A estrutura integrada também funciona em conjunto com soluções personalizadas.
O modelo real analisa os primeiros 90 ms de dados de gestos, o ponteiro atual e os ponteiros circundantes e, em seguida, considera a que distância da borda da tela os toques estão. Em seguida, ele determina, por ponteiro, quais dos ponteiros são palmas. Também leva em consideração o tamanho de cada contato, conforme relatado por touchMajor
e touchMinor
. A estrutura do Android remove os ponteiros marcados como palmas do fluxo de toque.
Se um ponteiro já foi enviado para os aplicativos, o sistema:
- (Se houver outros ponteiros ativos) Cancela o ponteiro com
ACTION_POINTER_UP
eFLAG_CANCELED
definidos. - (Se este for o único ponteiro) Cancela o ponteiro com
ACTION_CANCEL
.
Uma API pública, MotionEvent.FLAG_CANCELED
, indica que o evento atual não deve acionar a ação do usuário. Este sinalizador é definido para ACTION_CANCEL
e ACTION_POINTER_UP
.
Se o ponteiro da palma não foi enviado para os aplicativos, o sistema simplesmente descarta o ponteiro.
Ativar rejeição de palma
- No seu driver de toque, use a macro
input_abs_set_res
para definir as resoluções para os seguintes campos (as unidades são pixels por mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
O suporte para
ABS_MT_TOUCH_MINOR
é opcional. No entanto, se o seu dispositivo for compatível, certifique-se de que a resolução esteja definida corretamente. -
- Para confirmar se os campos estão configurados corretamente, execute:
$ adb shell getevent -li
- Para habilitar o recurso durante o tempo de execução, execute:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Reinicie o processo
system_server
.$ adb shell stop && adb shell start
- Confirme se
adb shell dumpsys input
mostra que há rejeitores de palm dentro deUnwantedInteractionBlocker
. Caso contrário, verifique os logs relacionados à entrada para encontrar pistas sobre o que pode estar configurado incorretamente.Veja o exemplo a seguir para referência:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Para ativar permanentemente o recurso, adicione o comando sysprop correspondente em seu arquivo
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1