Dispositivos por toque

O Android é compatível com várias telas sensíveis ao toque e touchpads, incluindo tablets digitalizadores baseados em stylus.

As telas sensíveis ao toque são dispositivos de toque associados a uma tela para que o usuário tenha a impressão de manipular diretamente os itens na tela.

Touchpads são dispositivos de toque que não estão associados a uma tela, como um tablet digitalizador. Os touchpads são usados para apontar ou para posicionamento indireto absoluto ou controle baseado em gestos de uma interface do usuário.

Dispositivos sensíveis ao toque podem ter botões com funções semelhantes aos botões do mouse.

Os dispositivos sensíveis ao toque podem ser manipulados usando várias ferramentas diferentes, como dedos ou uma stylus, dependendo da tecnologia do sensor de toque.

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 serve 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 por toque

Um dispositivo de entrada é classificado como multitoque se as duas condições a seguir forem verdadeiras:

  • O dispositivo de entrada informa a presença dos eixos absolutos ABS_MT_POSITION_X e ABS_MT_POSITION_Y.
  • O dispositivo de entrada não tem botões de gamepad. Essa condição resolve uma ambiguidade com determinados gamepads que informam eixos com códigos que se sobrepõem aos dos eixos MT.

Um dispositivo de entrada é classificado como toque único se as duas condições a seguir forem atendidas:

  • O dispositivo de entrada não é classificado como um dispositivo multitoque. Um dispositivo de entrada é classificado como de toque único ou multitoque, nunca os dois.
  • O dispositivo de entrada informa a presença dos eixos absolutos ABS_X e ABS_Y e do código de tecla BTN_TOUCH.

Quando um dispositivo de entrada é classificado como um dispositivo de toque, a presença de teclas virtuais é determinada tentando carregar o arquivo de mapa de teclas virtuais para o dispositivo. Se um mapa de teclas virtual estiver disponível, o arquivo de layout de teclas do dispositivo também será carregado. Consulte [Arquivos de mapa de teclas virtuais](#virtual-key-map-files) para 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 precisam ter arquivos de configuração de dispositivo de entrada. Se nenhum arquivo de configuração de dispositivo de entrada estiver presente, o sistema escolherá uma configuração padrão adequada para periféricos de toque de uso geral, como telas sensíveis ao toque USB ou Bluetooth HID externas ou touchpads. 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 for carregada, o sistema vai classificar o dispositivo como uma tela sensível ao toque, um touchpad ou um ponteiro.

  • Um dispositivo com touch screen é usado para manipulação direta de objetos na tela. O usuário toca diretamente na tela, então o sistema não exige mais recursos para indicar os objetos que estão sendo manipulados.
  • Um dispositivo touchpad é usado para fornecer informações de posicionamento absoluto a um app sobre toques em uma determinada área do sensor. Isso 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 stylus, são interpretadas usando posições absolutas. Consulte Gestos indiretos de ponteiro multitoque para mais informações.

As regras a seguir são usadas para classificar o dispositivo de entrada como uma tela sensível ao toque, um touchpad ou um dispositivo de ponteiro.

  • Se a propriedade touch.deviceType estiver definida, o tipo de dispositivo será definido conforme indicado.
  • Se o dispositivo de entrada informar a presença da propriedade de entrada INPUT_PROP_DIRECT (pelo ioctl EVIOCGPROP), o tipo de dispositivo será definido como tela touchscreen. Essa condição pressupõe que dispositivos de toque de entrada direta estejam conectados a uma tela que também esteja conectada.
  • Se o dispositivo de entrada informar a presença da propriedade de entrada INPUT_PROP_POINTER (pelo ioctl EVIOCGPROP), o tipo de dispositivo será definido como ponteiro.
  • Se o dispositivo de entrada informar a presença dos eixos relativos REL_X ou REL_Y, o tipo de dispositivo será definido como touchpad. Essa condição resolve uma ambiguidade para dispositivos de entrada que consistem em um mouse e um touchpad. Nesse caso, o touchpad não é usado para controlar o ponteiro porque o mouse já faz isso.
  • Caso contrário, o tipo de dispositivo será definido como ponteiro. Esse padrão garante que os touchpads que não foram designados para nenhuma outra finalidade especial controlem o ponteiro.

Botões

Os botões são controles opcionais que os apps podem usar para realizar funções adicionais. Os botões em dispositivos de toque se comportam de maneira semelhante aos botões do mouse e são usados principalmente com dispositivos de toque do tipo ponteiro ou com uma caneta stylus.

Os seguintes botões são compatíveis:

  • BTN_LEFT: mapeado para MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: mapeado para MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: mapeado para MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK e BTN_SIDE: mapeados para MotionEvent.BUTTON_BACK. Pressionar esse botão também sintetiza uma ação de pressionar uma tecla com o código KeyEvent.KEYCODE_BACK.
  • BTN_FORWARD e BTN_EXTRA: mapeados para MotionEvent.BUTTON_FORWARD. Pressionar esse botão também sintetiza uma ação de pressionar uma tecla com o código KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: mapeado para MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: mapeado para MotionEvent.BUTTON_TERTIARY.

Ferramentas e tipos de ferramentas

Um instrumento é um dedo, uma stylus 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 outros lugares do Android, como na API MotionEvent, uma ferramenta é frequentemente chamada de ponteiro.

Os seguintes tipos de ferramentas são aceitos:

  • BTN_TOOL_FINGER e MT_TOOL_FINGER: mapeados para MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN e MT_TOOL_PEN: mapeados para MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: mapeado para MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: mapeado para MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: mapeado para MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: mapeado para MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: mapeado para MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: mapeado para MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP e BTN_TOOL_QUADTAP: mapeados para MotionEvent.TOOL_TYPE_FINGER.

Passar o cursor x tocar nas ferramentas

As ferramentas podem estar em contato com o dispositivo de toque ou dentro do alcance e pairando sobre ele. Nem todos os dispositivos de toque podem detectar a presença de uma ferramenta pairando sobre eles. Os que têm, como os digitalizadores de caneta stylus baseados em RF, podem detectar quando a ferramenta está dentro de um alcance limitado do digitalizador.

O componente InputReader distingue ferramentas de toque de ferramentas de passar o cursor. Da mesma forma, as ferramentas de toque e de passar o cursor são informadas aos apps de maneiras diferentes.

As ferramentas de toque são informadas aos apps 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 passar o cursor são informadas aos apps como eventos de movimento genéricos usando MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE e MotionEvent.ACTION_HOVER_EXIT.

Requisitos de driver para dispositivos de toque

  • Os drivers de dispositivos sensíveis ao toque devem registrar apenas os eixos e códigos de teclas para os eixos e botões que eles oferecem suporte. Registrar eixos ou códigos de teclas sem suporte pode confundir o algoritmo de classificação do dispositivo ou fazer com que o sistema detecte incorretamente os recursos do dispositivo. Por exemplo, se o dispositivo informar o código da tecla BTN_TOUCH, o sistema vai presumir que BTN_TOUCH sempre será usado para indicar se a ferramenta está tocando na tela. Portanto, BTN_TOUCH não deve ser usado para indicar que a ferramenta está apenas no intervalo e pairando.
  • Dispositivos com um único toque 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 por toque.
    • ABS_TOOL_WIDTH: (opcional) informa a área transversal ou a largura do contato do 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 em relação à superfície do dispositivo de toque ao longo do eixo X.
    • ABS_TILT_Y: (opcional) informa a inclinação da ferramenta em relação à superfície do dispositivo de toque ao longo do eixo Y.
    • BTN_TOUCH: (OBRIGATÓRIO) Indica se a ferramenta está tocando no dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcional) Informa os estados do botão.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcional) informa o tipo de ferramenta.
  • 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 transversal do contato por toque ou o comprimento da dimensão mais longa do contato por toque.
    • ABS_MT_TOUCH_MINOR: (opcional) informa o comprimento da dimensão menor do contato por toque. Esse eixo não deve ser usado se ABS_MT_TOUCH_MAJOR estiver informando uma medição de área.
    • ABS_MT_WIDTH_MAJOR: (opcional) informa a área transversal da ferramenta ou o comprimento da dimensão mais longa dela. Não use esse eixo, a menos que você conheça as dimensões da própria ferramenta.
    • ABS_MT_WIDTH_MINOR: (opcional) informa o comprimento da dimensão menor da própria ferramenta. Esse eixo não deve ser usado se ABS_MT_WIDTH_MAJOR estiver informando 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 como MT_TOOL_FINGER ou MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (opcional) informa o ID de rastreamento da ferramenta. O ID de rastreamento é um número inteiro não negativo arbitrário usado para identificar e rastrear cada ferramenta de forma independente quando várias estão ativas. Por exemplo, quando vários dedos tocam no dispositivo, cada um deles recebe um ID de rastreamento distinto que é usado enquanto o dedo permanece em contato. Os IDs de rastreamento podem ser reutilizados quando as ferramentas associadas saem do alcance.
    • ABS_MT_SLOT: (opcional) informa o ID do slot da ferramenta ao usar o protocolo multitoque 'B' do Linux. Consulte a documentação do protocolo multitoque do Linux para mais detalhes.
    • BTN_TOUCH: (OBRIGATÓRIO) Indica se a ferramenta está tocando no dispositivo.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opcional) Informa os estados do botão.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcional) informa o tipo de ferramenta.
  • Se os eixos para os protocolos de toque único e multitoque forem definidos, apenas os eixos multitoque serão usados, e os de toque único serão ignorados.
  • Os valores mínimo e máximo dos eixos ABS_X, ABS_Y, ABS_MT_POSITION_X e ABS_MT_POSITION_Y definem os limites da área ativa do dispositivo em unidades de superfície específicas do dispositivo. No caso de uma tela sensível ao toque, a área ativa descreve a parte do dispositivo de toque que realmente cobre a tela.

    Para uma tela sensível ao toque, o sistema interpola automaticamente as posições de toque informadas 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 informar toques fora da área ativa informada.

    Os toques iniciados fora da área ativa não são enviados aos apps, 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 enviados aos apps. Consequentemente, se um toque começar dentro dos limites de um app e depois sair da área ativa, o app poderá receber eventos de toque com coordenadas de exibição negativas ou além dos limites da tela. Esse é o comportamento esperado.

    Um dispositivo de toque nunca deve fixar as coordenadas de toque aos limites da área ativa. Se um toque sair da área ativa, ele deverá ser informado como fora dela ou não ser informado.

    Por exemplo, se o dedo do usuário estiver tocando perto do canto superior esquerdo da tela sensível ao toque, ele poderá informar uma coordenada de (minX, minY). Se o dedo continuar se movendo para fora da área ativa, a tela sensível ao toque vai começar a informar coordenadas com componentes menores que minX e minY, como (minX - 2, minY - 3), ou vai parar de informar o toque. Em outras palavras, a tela sensível ao toque não deve informar (minX, minY) quando o dedo do usuário estiver tocando fora da área ativa.

    Fixar as coordenadas de toque na borda da tela cria um limite rígido artificial ao redor da borda, o que impede que o sistema rastreie suavemente os movimentos que entram ou saem dos limites da área de exibição.

  • Os valores informados por ABS_PRESSURE ou ABS_MT_PRESSURE, se forem informados, precisam ser diferentes de zero quando a ferramenta estiver tocando no dispositivo e zero caso contrário para indicar que a ferramenta está pairando.

    Informar os dados de pressão é opcional, mas altamente recomendado. Os apps podem usar informações de pressão para implementar desenhos sensíveis à pressão e outros efeitos.

  • Os valores informados por ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR ou ABS_MT_WIDTH_MINOR precisam ser diferentes de zero quando a ferramenta está tocando no dispositivo e zero caso contrário, mas isso não é obrigatório. Por exemplo, o dispositivo de toque pode medir o tamanho dos contatos de toque com o dedo, mas não com uma stylus.

    Informar o tamanho é opcional, mas altamente recomendado. Os apps podem usar informações de pressão para implementar desenhos sensíveis ao tamanho e outros efeitos.

  • Os valores informados por ABS_DISTANCE ou ABS_MT_DISTANCE devem se aproximar de zero quando a ferramenta estiver tocando no dispositivo. A distância pode permanecer diferente de zero mesmo quando a ferramenta está em contato direto. Os valores exatos informados dependem da maneira como o hardware mede a distância.

    Informar a distância é opcional, mas recomendado para dispositivos com stylus.

  • Os valores informados por ABS_TILT_X e ABS_TILT_Y precisam ser zero quando a ferramenta está perpendicular ao dispositivo. Uma inclinação diferente de zero indica que a ferramenta está sendo segurada em um ângulo.

    Os ângulos de inclinação ao longo dos eixos X e Y são especificados em graus em relação à 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, e valores maiores 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 que varia de 0 a PI / 2 radianos e um ângulo de orientação planar que varia de -PI a PI radianos. Essa representação resulta em uma descrição de orientação compatível com o que é usado para descrever toques com os dedos.

    Informar dados de inclinação é opcional, mas recomendado para dispositivos com stylus.

  • Se o tipo de ferramenta for informado por ABS_MT_TOOL_TYPE, ele vai substituir qualquer informação de tipo de ferramenta informada por BTN_TOOL_*. Se não houver informações disponíveis sobre o tipo de ferramenta, o padrão será MotionEvent.TOOL_TYPE_FINGER.

  • Uma ferramenta é considerada ativa com base nas seguintes condições:

    • Ao usar o protocolo de toque único, a ferramenta fica ativa se BTN_TOUCH ou BTN_TOOL_* for 1.

      Essa condição implica que InputReader precisa ter pelo menos algumas informações sobre a natureza da ferramenta, seja se ela está tocando ou pelo menos o 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 para de aparecer nos relatórios de sincronização, ela deixa de existir.
    • Ao usar o protocolo multitoque "B", a ferramenta fica ativa enquanto tiver um slot ativo. Quando o slot é limpo, a ferramenta deixa de existir.
  • Uma ferramenta é considerada em espera com base nas seguintes condições:
    • Se a ferramenta for BTN_TOOL_MOUSE ou BTN_TOOL_LENS, ela não estará pairando, mesmo que uma das condições a seguir seja verdadeira.
    • Se a ferramenta estiver ativa e o driver informar informações de pressão, e a pressão informada for zero, a ferramenta estará pairando.
    • Se a ferramenta estiver ativa e o driver for compatível com o código de tecla BTN_TOUCH e BTN_TOUCH tiver um valor zero, a ferramenta estará pairando.
  • O InputReader é compatível com os protocolos multitoque "A" e "B". Os novos drivers podem usar o protocolo "B", mas qualquer um funciona.
  • A partir do Android 4.0, talvez seja necessário mudar os drivers da tela sensível ao toque para obedecer à especificação do protocolo de entrada do Linux.

    As seguintes mudanças podem ser necessárias:

    • Quando uma ferramenta fica inativa (o dedo é levantado), ela para de aparecer em relatórios de sincronização multitoque subsequentes. Quando todas as ferramentas ficarem inativas (todos os dedos ficam "para cima"), o driver precisa enviar um pacote de relatório de sincronização vazio, como SYN_MT_REPORT seguido de SYN_REPORT.

      As versões anteriores do Android esperavam que os eventos "up" fossem informados enviando um valor de pressão de 0. O comportamento antigo era incompatível com a especificação do protocolo de entrada do Linux e não é mais compatível.

    • A pressão física ou as informações de intensidade do sinal devem ser informadas usando ABS_MT_PRESSURE.

      As 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 compatível.

    • As informações de tamanho do toque precisam ser informadas usando ABS_MT_TOUCH_MAJOR.

      As 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 compatível.

    Os drivers de dispositivos sensíveis ao toque não precisam mais de personalizações específicas do Android. Ao usar o protocolo de entrada padrão do Linux, o Android pode oferecer suporte a uma variedade maior de periféricos de toque, como telas sensíveis ao toque multitoque HID externas, usando drivers não modificados.

Operação de dispositivo por toque

A seguir, há um breve resumo da operação do dispositivo de toque no Android.

  1. O EventHub lê eventos brutos do driver evdev.
  2. O InputReader consome os eventos brutos e atualiza o estado interno sobre a posição e outras características de cada ferramenta. Ele também rastreia estados de botões.
  3. Se BACK ou FORWARD foi pressionado ou solto, InputReader notifica InputDispatcher sobre o evento de tecla.
  4. InputReader determina se uma tecla virtual foi pressionada. Se sim, ele notifica InputDispatcher sobre o evento principal.
  5. InputReader determina se o toque foi iniciado dentro dos limites da tela. Se for o caso, ele notifica InputDispatcher sobre o evento de toque.
  6. Se não houver ferramentas de toque, mas houver pelo menos uma ferramenta de passar o cursor, o InputReader vai notificar o InputDispatcher sobre o evento de passar o cursor.
  7. Se o tipo de dispositivo de toque for ponteiro, InputReader vai realizar a detecção de gestos do ponteiro, movê-lo e detectar de acordo com a ação e notificar InputDispatcher sobre o evento do ponteiro.
  8. O InputDispatcher usa WindowManagerPolicy para determinar se os eventos precisam ser enviados e se eles precisam ativar o dispositivo. Em seguida, o InputDispatcher entrega os eventos aos apps adequados.

Configuração do dispositivo por 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.

Consulte as seções a seguir para mais detalhes sobre os arquivos que participam da configuração do teclado:

Propriedades

O sistema depende de muitas propriedades de configuração de dispositivos de entrada para configurar e calibrar o comportamento do dispositivo de toque.

Um dos motivos é que os drivers de dispositivos sensíveis ao toque geralmente informam as características dos toques usando unidades específicas do dispositivo.

Por exemplo, muitos dispositivos de toque medem a área de contato do toque usando uma escala interna específica do dispositivo, como o número total de nós de sensor que foram acionados pelo toque. Esse valor bruto não seria significativo para os apps, porque eles precisariam saber sobre o tamanho físico e outras características dos nós de sensor do dispositivo de toque.

O sistema usa parâmetros de calibragem codificados em arquivos de configuração do dispositivo de entrada para decodificar, transformar e normalizar os valores informados pelo dispositivo de toque em uma representação padrão mais simples que os apps podem entender.

Convenções de documentação

Para fins de documentação, usamos as seguintes convenções para descrever os valores usados pelo sistema durante o processo de calibragem.

Valores brutos do eixo

As expressões a seguir indicam os valores brutos informados pelo driver do dispositivo de toque como eventos EV_ABS.

raw.x
O valor do eixo ABS_X ou ABS_MT_POSITION_X.
raw.y
O valor do eixo ABS_Y ou ABS_MT_POSITION_Y.
raw.pressure
O valor do eixo ABS_PRESSURE ou ABS_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 ou raw.touchMajor se não estiver disponível.
raw.toolMajor
O valor do eixo ABS_TOOL_WIDTH ou ABS_MT_WIDTH_MAJOR, ou 0 se não estiver disponível.
raw.toolMinor
O valor do eixo ABS_MT_WIDTH_MINOR ou raw.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 ou ABS_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 indicam 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 são precisos em +/- 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 indicam as características do sistema de coordenadas de saída. O sistema usa a interpolação linear para traduzir informações de posição do toque das unidades de superfície usadas pelo dispositivo de toque para as unidades de saída informadas aos apps, como pixels da tela.

output.width
A largura da saída. Para telas touch (associadas a uma tela), essa é a largura da tela em pixels. Para touchpads (não associados a uma tela), a largura da saída é igual a raw.width, indicando que nenhuma interpolação é realizada.
output.height
A altura da saída. Para telas touch (associadas a uma tela), essa é a altura da tela em pixels. Para touchpads (não associados a uma tela), a altura da saída é igual a raw.height, indicando que nenhuma interpolação é realizada.
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 calibragem. A tabela a seguir descreve algumas propriedades de configuração de uso geral. Todas as outras propriedades são descritas nas seções a seguir, junto com os campos que elas usam 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 touchpad não associado a uma tela.

  • Se o valor for pointer, o dispositivo de toque será um touchpad não associado a uma tela, e os movimentos dele serão usados para gestos indiretos de ponteiro multitoque.

  • Se o valor for default, o sistema vai detectar automaticamente o tipo de dispositivo de acordo com o algoritmo de classificação.

Consulte a seção Classificação para 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 de toque eram considerados telas sensíveis ao toque.

touch.orientationAware

Definição:touch.orientationAware = 0 | 1

Especifica se o dispositivo de toque deve reagir a mudanças na 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 mudar.

  • Se o valor for 0, as posições de toque informadas pelo dispositivo de toque não serão afetadas por mudanças na orientação da tela.

O valor padrão é 1 se o dispositivo tiver uma tela sensível ao toque ou 0 caso contrário.

O sistema distingue entre telas sensíveis ao toque e telas internas e externas. Uma tela sensível ao toque interna com reconhecimento de orientação é girada com base na orientação da tela interna. Uma tela touch externa sensível à orientação é girada com base na orientação da tela externa.

A detecção de orientação é usada 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 da 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 absoluto da tela sensível ao toque seja informado como um toque no canto superior esquerdo do sistema de coordenadas girado da tela. Isso é feito para que os toques sejam informados com o mesmo sistema de coordenadas que os apps usam para desenhar os elementos visuais.

Antes do Honeycomb, todos os dispositivos sensíveis ao toque eram considerados compatíveis com a orientação.

touch.gestureMode

Definição:touch.gestureMode = pointer | spots | default

Especifica o modo de apresentação para gestos de ponteiro. Essa propriedade de configuração só é relevante quando o dispositivo de toque é do tipo pointer.

  • Se o valor for pointer, os gestos do touchpad serão apresentados por um cursor semelhante a um ponteiro do mouse.

  • Se o valor for spots, os gestos do touchpad serão apresentados por uma âncora que representa o centroide do gesto e um conjunto de pontos circulares que representam a posição de dedos individuais.

O valor padrão é pointer quando a propriedade de entrada INPUT_PROP_SEMI_MT está definida ou spots caso contrário.

Campos X e Y

Os campos X e Y fornecem informações de posição para o centro da área de contato.

Cálculo

O cálculo é simples: as informações posicionais do driver de toque são interpoladas linearmente para o sistema de coordenadas de saída.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchMajor, touchMinor, toolMajor, toolMinor, campos de 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 pode detectar. O menor tamanho normalizado possível é 0,0 (sem contato ou não mensurável), e o maior é 1,0 (área do sensor saturada).

Quando é possível medir o comprimento e a largura aproximados, o campo touchMajor especifica a dimensão mais longa e o campo touchMinor especifica a dimensão mais curta da área de contato. Quando só é possível medir o diâmetro aproximado da área de contato, os campos touchMajor e touchMinor sã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 transversal da ferramenta.

Se o tamanho do toque não estiver disponível, mas o tamanho da ferramenta estiver, 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, o tamanho do toque será definido como igual ao tamanho da ferramenta.

Os dispositivos sensíveis ao toque medem ou informam o tamanho do toque e da ferramenta de várias maneiras. A implementação atual oferece suporte a três tipos diferentes de medições: 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 medição usado pelo driver de toque para informar o tamanho do toque e da ferramenta.

  • Se o valor for none, o tamanho será definido como zero.

  • Se o valor for geometric, o tamanho será especificado nas mesmas unidades de superfície da posição e será 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á proporcional à área do toque ou da ferramenta.

  • Se o valor for default, o sistema usará a calibragem geometric se o eixo raw.touchMajor ou raw.toolMajor estiver disponível. Caso contrário, ele usará a calibragem none.

touch.size.scale

Definição:touch.size.scale = <um número de ponto flutuante não negativo>

Especifica um fator de escalonamento constante usado na calibragem.

O valor padrão é 1.0.

touch.size.bias

Definição:touch.size.bias = <um número de ponto flutuante não negativo>

Especifica um valor de viés constante usado na calibragem.

O valor padrão é 0.0.

touch.size.isSummed

Definição:touch.size.isSummed = 0 | 1

Especifica se o tamanho é informado como a soma dos tamanhos de todos os contatos ativos ou individualmente para cada contato.

  • Se o valor for 1, o tamanho informado será dividido pelo número de contatos antes do uso.

  • Se o valor for 0, o tamanho informado será usado como está.

O valor padrão é 0.

Alguns dispositivos sensíveis ao toque, principalmente os "Semi-MT", não conseguem distinguir as dimensões individuais de vários contatos. Por isso, eles informam uma medição de tamanho que representa a área ou largura total. Essa propriedade só deve ser definida como 1 para esses dispositivos. Se estiver em 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 calibragem 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.

touch.pressure.calibration

Definição:touch.pressure.calibration = none | physical | amplitude | default

Especifica o tipo de medição usado pelo driver de toque para informar a pressão.

  • Se o valor for none, a pressão será desconhecida. Portanto, ela será definida como 1,0 ao tocar e 0,0 ao passar o cursor.

  • Se o valor for physical, o eixo de pressão vai medir a intensidade física real da pressão aplicada ao touchpad.

  • Se o valor for amplitude, o eixo de pressão vai medir a amplitude do sinal, que está relacionada ao tamanho do contato e à pressão aplicada.

  • Se o valor for default, o sistema usará a calibragem physical se o eixo de pressão estiver disponível. Caso contrário, ele usará none.

touch.pressure.scale

Definição:touch.pressure.scale = <um número de ponto flutuante não negativo>

Especifica um fator de escalonamento constante usado na calibragem.

O valor padrão é 1.0 / raw.pressure.max.

Cálculo

O cálculo do campo pressure depende dos parâmetros de calibragem 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 medição 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 e PI/2 indica que o eixo principal está orientado para a direita. Quando uma ferramenta de caneta stylus está presente, o intervalo de orientação pode ser descrito em um intervalo de círculo completo de -PI ou PI.

O campo tilt descreve a inclinação da ferramenta como uma medição 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.

touch.orientation.calibration

Definição:touch.orientation.calibration = none | interpolated | vector | default

Especifica o tipo de medição usada pelo driver de toque para informar a orientação.

  • Se o valor for none, a orientação será desconhecida e será definida como 0.
  • Se o valor for interpolated, a orientação será interpolada linearmente para que um valor bruto de raw.orientation.min seja mapeado para -PI/2 e um valor bruto de raw.orientation.max seja mapeado para PI/2. O valor central de (raw.orientation.min + raw.orientation.max) / 2 é mapeado para 0.
  • Se o valor for vector, a orientação será interpretada como um vetor compactado composto por dois campos assinados de 4 bits. Essa representação é usada em peças do protocolo baseado em objetos da Atmel. Quando decodificado, o vetor gera 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 calibragem interpolated se o eixo de orientação estiver disponível. Caso contrário, ele usará none.

Cálculo

O cálculo dos campos orientation e tilt depende dos parâmetros de calibragem especificados e da entrada disponível.

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 uma distância crescente da superfície.

touch.distance.calibration

Definição:touch.distance.calibration = none | scaled | default

Especifica o tipo de medição usado pelo driver de toque para informar a distância.

  • Se o valor for none, a distância será desconhecida e definida como 0.

  • Se o valor for scaled, a distância informada será multiplicada por uma constante.

  • Se o valor for default, o sistema usará a calibragem scaled se o eixo de distância estiver disponível. Caso contrário, ele usará none.

touch.distance.scale

Definição:touch.distance.scale = <um número de ponto flutuante não negativo>

Especifica um fator de escalonamento constante usado na calibragem.

O valor padrão é 1.0.

Cálculo

O cálculo do campo distance depende dos parâmetros de calibragem 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

Observações sobre compatibilidade

As propriedades de configuração para 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 precisam ser atualizados para usar as novas propriedades de configuração.

Talvez seja necessário atualizar drivers de dispositivos de toque mais antigos.

Arquivos de mapa de teclas virtuais

Dispositivos de toque podem ser usados para implementar teclas virtuais.

Há várias maneiras de fazer isso, dependendo das capacidades do controlador de toque. Alguns controladores touchscreen podem ser configurados diretamente para implementar teclas virtuais definindo registros de firmware. Em outros momentos, é desejável realizar o mapeamento das coordenadas de toque para códigos de teclas no software.

Quando as chaves virtuais são implementadas em software, o kernel precisa exportar um arquivo de mapa de chaves virtuais chamado virtualkeys.<devicename> como uma propriedade da placa. Por exemplo, se os drivers do dispositivo touchscreen informarem o nome como "touchyfeely", o arquivo de mapa de teclas virtual precisará ter o caminho /sys/board_properties/virtualkeys.touchyfeely.

Um arquivo de mapa de teclas virtuais descreve as coordenadas e os códigos de teclas do Linux das teclas virtuais na tela sensível ao toque.

Além do arquivo de mapa de teclas virtual, é preciso ter um arquivo de layout de teclas e um arquivo de mapeamento de caracteres de teclas correspondentes para mapear os códigos de teclas do Linux para os códigos de teclas do Android e especificar o tipo do dispositivo de teclado (geralmente SPECIAL_FUNCTION).

Sintaxe

Um arquivo de mapa de teclas virtual é um arquivo de texto simples que consiste em uma sequência de descrições de layout de teclas virtuais separadas por novas linhas ou por dois-pontos.

As linhas de comentário começam com "#" e continuam até o fim da linha.

Cada chave virtual é descrita por seis componentes delimitados por dois-pontos:

  • 0x01: um código de versão. Precisa ser sempre 0x01.
  • <Linux key code>: o código da tecla virtual do Linux.
  • <centerX>: a coordenada X do pixel do centro da tecla virtual.
  • <centerY>: a coordenada Y do pixel do centro da tecla virtual.
  • <width>: a largura da tecla virtual em pixels.
  • <height>: a altura da tecla virtual em pixels.

Todas as coordenadas e tamanhos são especificados em termos do sistema de coordenadas de exibição.

Confira um arquivo de mapa de teclas 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 teclas virtuais também pode ser gravado em várias 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 uma resolução de 480 x 800. Assim, todas as teclas virtuais têm uma coordenada <centerY> de 835, que fica um pouco abaixo da área visível da tela touchscreen.

A primeira tecla tem um código de leitura do Linux de 158 (KEY_BACK), centerX de 55, centerY de 835, largura de 90 e altura de 55.

Exemplo

Arquivo de mapa de teclas virtuais: /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 teclas: /system/usr/keylayout/touchyfeely.kl.

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

Arquivo de mapa de caracteres da chave: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Gestos indiretos de ponteiro multitoque

No modo de ponteiro, o sistema interpreta os seguintes gestos:

  • Tocar com um dedo: clique.
  • Movimento com um dedo: move o ponteiro.
  • Movimento de um dedo mais pressionamento de botões: arraste o ponteiro.
  • Movimento com dois dedos movendo os dois na mesma direção: arraste a área abaixo do ponteiro nessa direção. O ponteiro não se move.
  • Movimento de dois dedos: os dois dedos se movem um em direção ao outro ou se afastam em direções diferentes: mova/ajuste a escala/gire a área ao redor do ponteiro. O ponteiro não se move.
  • Movimento com vários dedos: gesto livre.

Rejeição da palma da mão

No Android 13, o sistema pode rejeitar automaticamente entradas de palmas quando a estrutura integrada está ativada. As soluções internas e personalizadas ainda são compatíveis, mas talvez precisem ser modificadas para retornar a flag TOOL_TYPE_PALM quando uma palma for detectada. 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 ao redor. Em seguida, ele considera a distância das ações de tocar da borda da tela. Em seguida, ele determina, para cada ponteiro, quais deles são palmas. Ele também considera o tamanho de cada contato, conforme informado por touchMajor e touchMinor. Em seguida, o framework Android remove os ponteiros marcados como palmas do fluxo de toque.

Se um ponteiro já tiver sido enviado aos apps, o sistema vai:

  • (Se houver outros ponteiros ativos) Cancela o ponteiro com ACTION_POINTER_UP e FLAG_CANCELED definidos.
  • (Se 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. Essa flag é definida para ACTION_CANCEL e ACTION_POINTER_UP.

Se o ponteiro da palma não foi enviado aos apps, o sistema simplesmente o descarta.

Ativar a rejeição de palmas

  1. No driver de toque, use a macro input_abs_set_res para definir as resoluções dos 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 dispositivo for compatível, verifique se a resolução está configurada corretamente.

  2. Para confirmar se os campos estão definidos corretamente, execute:
        $ adb shell getevent -li
    
  3. Para ativar o recurso durante a execução, execute:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Reinicie o processo system_server.
         $ adb shell stop && adb shell start
        
  5. Confirme se adb shell dumpsys input mostra que há rejeitadores de palma dentro de UnwantedInteractionBlocker. Se não for, verifique os registros relacionados à entrada para encontrar pistas sobre o que pode estar mal configurado.

    Confira 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: {}
    
  6. Para ativar o recurso permanentemente, adicione o comando sysprop correspondente ao arquivo init**rc:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Leitura adicional