Dispositivos por toque

O Android é compatível com uma variedade de touchscreens e touchpads, incluindo tablets digitalizadores com stylus.

Telas sensíveis ao toque são dispositivos de toque associados a uma tela que o usuário tem a impressão de manipular diretamente itens na tela.

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

Dispositivos de toque podem ter botões com funções semelhantes aos botões do mouse.

Dispositivos de toque às vezes podem ser manipulados usando uma variedade de ferramentas diferentes como dedos ou uma stylus, dependendo da tecnologia do sensor de toque.

Dispositivos de toque às vezes são usados para implementar teclas virtuais. Por exemplo, em em alguns dispositivos Android, a área do sensor da tela touch se estende além da borda na tela e tem duas funções 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 propriedades de configuração para descrever as características e o comportamento desejado de cada dispositivo.

Classificação do dispositivo por toque

Um dispositivo de entrada será classificado como multitoque se os dois as seguintes condições serão mantidas:

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

Um dispositivo de entrada é classificado como de toque único se as duas as seguintes condições são mantidas:

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

Quando um dispositivo de entrada é classificado como touchscreen, a presença de chaves virtuais é determinado ao tentar carregar o arquivo de mapeamento de chave virtual para o dispositivo. Se um mapa de tecla virtual estiver disponível, o layout da chave para o dispositivo também é carregado. Consulte [Arquivos de mapa de chave virtual](#virtual-key-map-files) para informações sobre o local e o formato desses arquivos.

Em seguida, o sistema carrega o arquivo de configuração do dispositivo de entrada para o touchscreen.

Todos os dispositivos de toque integrados precisam ter arquivos de configuração de dispositivo de entrada. Se nenhum arquivo de configuração do dispositivo de entrada estiver presente, o sistema escolhe uma configuração padrão apropriada para o uso geral periféricos de toque, como touchscreens USB externos ou Bluetooth HID ou touchpads. Esses padrões não são projetados para touchscreens integrados e pode resultar em um comportamento incorreto.

Após o carregamento da configuração do dispositivo de entrada, o sistema classifica a dispositivo de entrada como um dispositivo de tela touch, touch pad ou apontador.

  • Um dispositivo de tela touch é usado para manipulação direta de objetos no tela. O usuário toca diretamente na tela, de modo que o sistema não exigem affordances adicionais para indicar os objetos manipulados.
  • Um dispositivo touchpad é usado para fornecer informações de posicionamento absoluto a um app sobre toques em uma determinada área do sensor. Pode ser útil para tablets digitalizadores.
  • Um dispositivo de ponteiro é usado para manipulação indireta de objetos na tela usando um cursor. Os dedos são interpretados como um ponteiro multitoque gestos. Outras ferramentas, como canetas stylus, são interpretadas usando posições absolutas. Consulte Ponteiro multitoque indireto gestos para mais informações.

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

  • Se a propriedade touch.deviceType for definida, o tipo de dispositivo será definido conforme indicado.
  • Se o dispositivo de entrada informar a presença da INPUT_PROP_DIRECT entrada (pelo ioctl EVIOCGPROP), o tipo de dispositivo será Defina como tela touch. Essa condição pressupõe que o toque de entrada direta estão conectados a uma tela que também está conectada.
  • Se o dispositivo de entrada informar a presença da INPUT_PROP_POINTER propriedade de entrada (usando o ioctl EVIOCGPROP) e o tipo de dispositivo Defina como pointer.
  • Se o dispositivo de entrada informar a presença de REL_X ou REL_Y eixos relativos, o tipo de dispositivo será definido como touch pad. Esta condição resolve uma ambiguidade para dispositivos de entrada que consistem em mouse e um touchpad. Nesse caso, o touchpad não é usado para controlar o ponteiro porque o mouse já o controla.
  • Caso contrário, o tipo de dispositivo será definido como ponteiro. Esse padrão garante os touch pads sem nenhuma outra finalidade especial controlar o ponteiro.

Botões

Botões são controles opcionais que podem ser usados pelos apps para executar funções adicionais. Botões em dispositivos touchscreen se comportam de maneira semelhante ao mouse e são usados principalmente com dispositivos de toque do tipo ponteiro ou com um 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 este botão também sintetiza um pressionamento de tecla com o código de tecla KeyEvent.KEYCODE_BACK:
  • BTN_FORWARD e BTN_EXTRA: mapeados para MotionEvent.BUTTON_FORWARD Pressionar este botão também sintetiza um pressionamento de tecla pelo código de tecla KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: mapeado para MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: mapeado para MotionEvent.BUTTON_TERTIARY.

Ferramentas e tipos de ferramentas

Uma ferramenta é um dedo, uma stylus ou outro aparelho usado para interagir com o touchscreen. Alguns dispositivos touchscreen podem distinguir diferentes de ferramentas.

Em outros lugares no Android, como na API MotionEvent, uma ferramenta é frequentemente chamada como um ponteiro.

Há suporte para os seguintes tipos de ferramentas:

  • 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: mapeado para MotionEvent.TOOL_TYPE_FINGER.

Passar o cursor ou tocar em ferramentas

As ferramentas podem estar em contato com o touchscreen ou ao alcance e ao passar o cursor acima dela. Nem todos os dispositivos sensíveis ao toque conseguem detectar a presença de uma ferramenta passando o cursor sobre o dispositivo sensível ao toque. Aquelas que têm, como digitalizadores de stylus baseados em RF, pode detectar quando a ferramenta está dentro de uma faixa limitada do digitalizador.

O componente InputReader distingue ferramentas de toque de passar o cursor ferramentas de visualização. Da mesma forma, os apps recebem informações ao tocar nas ferramentas e ao passar o cursor sobre elas. 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 relatadas 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 do dispositivo touchscreen

  • Os drivers de dispositivos touchscreen precisam registrar apenas os eixos e os códigos de tecla deles. e botões compatíveis. Registrar eixos ou códigos de tecla incompatíveis Pode confundir o algoritmo de classificação de dispositivos ou fazer com que o sistema sofra erros detectar os recursos do dispositivo. Por exemplo, se o dispositivo informar o Código da tecla BTN_TOUCH, o sistema presume que BTN_TOUCH é sempre usado para indicar se a ferramenta está tocar na tela. Portanto, BTN_TOUCH não deve ser usado para indicar que a ferramenta está meramente no intervalo e passando o cursor.
  • Os 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 à gorjeta. da ferramenta ou a intensidade do sinal do contato de toque.
    • ABS_TOOL_WIDTH: (opcional) informa a área da seção transversal ou a largura de o contato de toque ou da própria ferramenta.
    • ABS_DISTANCE: (opcional) informa a distância entre a ferramenta e a plataforma. do touchscreen.
    • ABS_TILT_X: (opcional) informa a inclinação da ferramenta a partir da superfície da o dispositivo touchscreen ao longo do eixo X.
    • ABS_TILT_Y: (opcional) informa a inclinação da ferramenta a partir da superfície da o dispositivo sensível ao 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) Estado do botão Relatórios.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN e BTN_TOOL_RUBBER. BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcional) Informa o tipo de ferramenta.
  • Os dispositivos multitoque usam os seguintes eventos de entrada do Linux:
    • ABS_MT_POSITION_X: (OBRIGATÓRIO) informa a coordenada X da ferramenta.
    • ABS_MT_POSITION_Y: (OBRIGATÓRIO) informa a coordenada Y da ferramenta.
    • ABS_MT_PRESSURE: (opcional) informa a pressão física aplicada ao a 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 maior dimensão do contato de toque.
    • ABS_MT_TOUCH_MINOR: (opcional) informa o tamanho da dimensão mais curta do contato de toque. Este eixo não deve ser usado se ABS_MT_TOUCH_MAJOR for para informar uma medida de área.
    • ABS_MT_WIDTH_MAJOR: (opcional) informa a área da seção transversal do ferramenta ou o comprimento da dimensão maior da própria ferramenta. Não usar este eixo a menos que você conheça as dimensões da própria ferramenta.
    • ABS_MT_WIDTH_MINOR: (opcional) informa o tamanho da dimensão mais curta da própria ferramenta. Este eixo não deve ser usado se ABS_MT_WIDTH_MAJOR estiver informando uma medida 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 a partir do superfície do touchscreen.
    • 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 acompanhamento da ferramenta. O ID de acompanhamento é um número inteiro arbitrário não negativo usado para identificar e acompanhar cada ferramenta de forma independente quando várias ferramentas estiverem ativas. Por exemplo: quando vários dedos estiverem tocando o dispositivo, será preciso atribuir um dedo diferente a cada um deles ID de acompanhamento usado enquanto o dedo permanece em contato. IDs de acompanhamento poderão ser reutilizadas quando as ferramentas associadas a ela ficarem fora do alcance.
    • ABS_MT_SLOT: (opcional) informa o código de espaço da ferramenta ao usar o Protocolo multitoque do Linux "B". Consulte a documentação do protocolo multitoque do Linux para 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) Estado do botão Relatórios.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN e BTN_TOOL_RUBBER. BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (opcional) Informa o tipo de ferramenta.
  • Se os eixos para protocolo de toque único e multitoque estiverem definidos, então somente os eixos multitoque são usados, e os eixos de toque único são ignorados.
  • Os valores mínimo e máximo dos parâmetros ABS_X, ABS_Y, ABS_MT_POSITION_X, e os eixos 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 touchscreen que de fato cobre a tela.

    Para uma tela sensível ao toque, o sistema interpola automaticamente o toque informado posições em unidades de superfície para obter posições de toque em pixels de exibição de acordo para o seguinte cálculo:

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    Uma tela touch pode informar toques fora da área ativa informada.

    Os toques iniciados fora da área ativa não são entregues aos apps mas pode ser usado para chaves virtuais.

    Toques que são iniciados dentro da área ativa ou que entram e saem da tela são exibidas aos apps. Consequentemente, se um toque começar dentro da limites de um aplicativo e depois sai da área ativa, o aplicativo pode receber eventos de toque com coordenadas de exibição negativas ou além do limites da tela. Esse é o comportamento esperado.

    Um dispositivo sensível ao toque nunca deve fixar coordenadas de toque aos limites do área Se um toque sair da área ativa, ele deverá ser informado como estando fora área ativa, ou ela não deve ser informada.

    Por exemplo, se o dedo do usuário estiver tocando perto do canto superior esquerdo do ou uma tela sensível ao toque, ele poderá informar uma coordenada de (minX, minY). Se o dedo continuar para se mover para fora da área ativa, a tela sensível ao toque deve começar coordenadas de relatório com componentes menores que minX e minY, como (mínX - 2, minY - 3) ou, então, deixará de registrar o toque completamente. Em outras palavras, a tela touch não deve gerar relatórios (minX, minY). quando o dedo do usuário está realmente tocando fora da área ativa.

    Fixar coordenadas de toque na borda da tela cria uma imagem limite rígido em torno da borda da tela, o que impede que o sistema Rastreando suavemente movimentos que entram ou saem dos limites da área de exibição.

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

    As informações sobre pressão de relatórios são opcionais, mas altamente recomendadas. Os apps podem usar informações de pressão para implementar o desenho sensível à 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 deverá ser diferente de zero quando a ferramenta está tocando o dispositivo e zero, caso contrário, mas isso não é necessário. Por exemplo, o touchscreen pode ser capaz de medir o tamanho do toque do dedo contatos, mas não contatos de toque da stylus.

    As informações de tamanho dos relatórios são opcionais, mas altamente recomendadas. 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.

    Os relatórios de informações de distância são opcional, mas recomendados para e 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 é mantida em um local inclinado.

    Os ângulos de inclinação ao longo dos eixos X e Y são especificados em graus da perpendicular. É indicado o ponto central (perpendicular perfeitamente) 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 representar uma inclinação para baixo ou para a direita.

    InputReader converte os componentes de inclinação X e Y em um elemento ângulo de inclinação de 0 a PI / 2 radianos e um ângulo de orientação plano variando de -PI a PI radianos. Essa representação resulta em uma uma descrição da orientação compatível com o que é usado para descrever toques com o dedo.

    A geração de relatórios de informações de inclinação é opcional, mas recomendada para dispositivos com stylus.

  • Se o tipo de ferramenta for informado por ABS_MT_TOOL_TYPE, ele substituirá qualquer ferramenta. tipo de informação relatada por BTN_TOOL_*. Se nenhuma informação de tipo de ferramenta estiver disponível, o tipo de ferramenta será definido por padrão. MotionEvent.TOOL_TYPE_FINGER:

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

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

      Esta condição implica que InputReader precisa ter pelo menos algumas informações sobre a natureza da ferramenta, seja por toque, 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 e os relatórios sincronizados, ele deixa de existir.
    • Ao usar o protocolo multitoque "B", a ferramenta ficará ativa desde que ele tem um espaço ativo. Quando o slot é apagado, a ferramenta deixa de existir.
  • Uma ferramenta passa o cursor com base nestas condições:
    • Se a ferramenta for BTN_TOOL_MOUSE ou BTN_TOOL_LENS, ela não estiver passando o cursor, mesmo que uma das condições a seguir seja verdadeira.
    • Se a ferramenta estiver ativa e o motorista relatar informações de pressão, e a pressão relatada for zero, a ferramenta estará passando.
    • Se a ferramenta estiver ativa e o driver oferecer suporte ao código de tecla BTN_TOUCH e BTN_TOUCH tem o valor zero, então a ferramenta está passando o cursor.
  • InputReader oferece suporte ao protocolo multitoque "A" e "B". Novos motoristas deve usar "B" mas também funciona.
  • A partir do Android 4.0, pode ser necessário alterar drivers de 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 se torna inativa (o dedo sobe para cima), ela deve parar de aparecer nos relatórios subsequentes de sincronização multitoque. Quando todas as ferramentas ficam inativas (com todos os dedos para cima), o motorista enviará um pacote vazio de relatório de sincronização, como SYN_MT_REPORT seguido por SYN_REPORT.

      Versões anteriores do Android esperavam "up" eventos a serem relatados enviando com um valor de pressão igual a zero. O comportamento antigo era incompatível com a Especificação do protocolo de entrada do Linux e não é mais compatível.

    • As informações de pressão física ou intensidade do sinal devem ser relatadas usando ABS_MT_PRESSURE:

      As versões anteriores do Android recuperam informações sobre pressão a partir 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 de toque precisam ser informadas usando ABS_MT_TOUCH_MAJOR.

      As versões anteriores do Android recuperavam informações de tamanho dos 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 de toque não precisam mais de personalizações específicas do Android. Ao contar com o protocolo de entrada padrão do Linux, o Android pode oferecer suporte a uma maior variedade de periféricos de toque, como dispositivos HID multitoque externos telas touch, usando drivers não modificados.

Operação do dispositivo touchscreen

Veja a seguir um breve resumo da operação da touchscreen no Android.

  1. 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 monitora estados de botão.
  3. Se BACK ou FORWARD tiver sido pressionado ou liberado, InputReader notifica InputDispatcher sobre o evento principal.
  4. InputReader determina se uma tecla virtual foi pressionada. Nesse caso, ele notifica InputDispatcher sobre o evento principal.
  5. InputReader determina se o toque foi iniciado no limites da tela. Em caso afirmativo, 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, InputReader notifica InputDispatcher sobre o evento de passar o cursor.
  7. Se o tipo de touchscreen for ponteiro, o InputReader vai executar o ponteiro. detecção de gestos, move o ponteiro e os pontos de acordo e notifica InputDispatcher sobre o evento do ponteiro.
  8. InputDispatcher usa WindowManagerPolicy para determinar se os eventos devem ser enviados e se eles devem despertar o dispositivo. Em seguida, o InputDispatcher entrega os eventos aos apps apropriados.

Configuração do touchscreen

O comportamento do touchscreen é determinado pelos eixos, botões, propriedades de entrada configuração do dispositivo de entrada, mapa de tecla virtual e layout de tecla.

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 do dispositivo de entrada para configurar e calibrar o comportamento do touchscreen.

Uma razão para isso é que os drivers de dispositivo para dispositivos de toque costumam informar as características dos toques usando unidades específicas do dispositivo.

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

O sistema usa parâmetros de calibração codificados na configuração do dispositivo de entrada para decodificar, transformar e normalizar os valores informados pelo em uma representação padrão mais simples que os apps possam 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 denotam os valores brutos informados pelo toque driver de dispositivo 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 indisponí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 indisponível.
raw.toolMajor
O valor do eixo ABS_TOOL_WIDTH ou ABS_MT_WIDTH_MAJOR, ou 0 se indisponível.
raw.toolMinor
O valor do eixo ABS_MT_WIDTH_MINOR, ou raw.toolMajor se não disponíveis.
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 indisponível.
raw.tiltX
O valor do eixo ABS_TILT_X ou 0 se não estiver disponível.
raw.tiltY
O valor do eixo ABS_TILT_Y ou 0 se não estiver disponível.

Intervalos brutos do eixo

As expressões a seguir denotam os limites de valores brutos. Eles são obtidos chame a ioctl EVIOCGABS de 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 inclusive da área de toque, equivalente a raw.x.range + 1.
raw.height
É a altura inclusive 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 converter informações de posição de toque de as unidades de superfície usadas pelo touchscreen nas unidades de saída que são informados a apps, como pixels de exibição.

output.width
A largura da saída. Para touchscreens (associadas a uma tela), este é a largura da tela em pixels. Para touch pads (não associados a uma tela), a largura da saída for igual a raw.width, indicando que nenhuma interpolação é realizada.
output.height
A altura da saída. Para touchscreens (associadas a uma tela), este é a altura da tela em pixels. Para touch pads (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 dispositivo de entrada de configuração do Terraform para especificar os valores de calibração. A tabela a seguir descreve algumas propriedades de configuração de uso geral. Todas as outras propriedades estão descritas nas seções a seguir, junto com os campos que eles são usados para calibrar.

touch.deviceType

Definição:touch.deviceType = touchScreen | touchPad | pointer | default

Especifica o tipo de touchscreen.

  • Se o valor for touchScreen, o touchscreen é uma tela touchscreen associada com uma tela.

  • Se o valor for touchPad, isso significa que o touchscreen é um touchpad não associado com uma tela.

  • Se o valor for pointer, isso significa que o touchscreen é um touchpad não associado com uma tela, e seus movimentos são usados para gestos de ponteiro multitoque indiretos.

  • 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 mais detalhes sobre como o tipo de dispositivo influencia o comportamento da touchscreen.

No Android 3 e versões anteriores, todos os dispositivos touchscreen eram considerados telas sensíveis ao toque.

touch.orientationAware

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

Especifica se o dispositivo touchscreen deve reagir às mudanças de orientação da tela.

  • Se o valor for 1, as posições de toque informadas pelo touchscreen serão giradas. sempre que a orientação da tela mudar.

  • Se o valor for 0, as posições de toque informadas pelo touchscreen são imunes para mostrar as mudanças de orientação.

O valor padrão será 1 se o dispositivo for uma tela touchscreen, 0 caso contrário.

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

O reconhecimento de orientação é usado para oferecer suporte à rotação de touchscreens em dispositivos. como o Nexus One. Por exemplo, quando o dispositivo é girado em 90 graus no sentido horário da orientação natural, as posições absolutas dos toques são remapeadas de que um toque no canto superior esquerdo do sistema de coordenadas absolutas da tela touch é relatado como um toque no canto superior esquerdo do sistema de coordenadas girado da tela. Isso é feito para que os toques sejam reportados com o mesmo sistema de coordenadas que que os aplicativos usam para desenhar seus elementos visuais.

Antes do Honeycomb, todos os dispositivos de toque eram considerados cientes da 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 touchscreen é do tipo ponteiro.

  • Se o valor for pointer, os gestos do touchpad serão apresentados usando um cursor. semelhante a um ponteiro de 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 é definido ou spots, caso contrário.

Campos X e Y

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

Cálculo

O cálculo é simples: as informações de posição do driver de toque são interpolado linearmente com 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 e 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 o maior toque possível que o dispositivo sensível ao toque possa detectar. As menores o tamanho normalizado possível é 0,0 (sem contato ou é imensurável) e o maior o tamanho normalizado possível é 1,0 (a área do sensor está saturada).

Quando o comprimento e a amplitude aproximados puderem ser medidos, Campo touchMajor Especifica a dimensão maior 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 maior e a toolMinor especifica a menor dimensão da área da seção transversal da ferramenta.

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

Os dispositivos de toque medem ou informam o tamanho do toque e da ferramenta de várias maneiras. A implementação atual é compatível com 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 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 no mesmo unidades de superfície que a posição, por isso é dimensionado da mesma maneira.

  • Se o valor for diameter, o tamanho será considerado proporcional a é o diâmetro (largura) do toque ou da ferramenta.

  • Se o valor for area, o tamanho será considerado proporcional ao área do toque ou da ferramenta.

  • Se o valor for default, o sistema usará a calibração de geometric se o raw.touchMajor ou raw.toolMajor está disponível. Caso contrário, usa da calibração none.

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 calibragem.

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 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 todas contatos ativos ou é informado 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 no estado em que se encontra.

O valor padrão é 0.

Alguns dispositivos sensíveis ao toque, especialmente "Semi-MT" os dispositivos não conseguem distinguir dimensões individuais de vários contatos para que eles informem uma medida de tamanho que representa a área ou largura total deles. Esta propriedade só deve ser definida como 1 para esses dispositivos. Em caso de dúvida, defina esse valor como 0.

Cálculo

O cálculo de 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á passando o cursor.

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 é desconhecida, então ela é definida como 1,0 quando tocando e 0,0 ao passar o cursor.

  • Se o valor for physical, presume-se que o eixo de pressão meça o valor real intensidade física da pressão aplicada ao touchpad.

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

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

touch.pressure.scale

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

Especifica um fator de escala 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

orientação e campos de 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 maior eixo é orientado verticalmente, -PI/2 indica que o maior eixo está orientado para a esquerda, PI/2 indica que o eixo principal está orientado para a direita. Quando uma stylus estiver presente, o intervalo de orientação pode ser descrito em um intervalo completo de círculos de -PI ou PI.

O campo tilt descreve a inclinação da ferramenta como uma medida angular. Uma inclinação 0 indica que a ferramenta é perpendicular à superfície. Uma inclinação 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 usado pelo driver de toque para informar a orientação.

  • Se o valor for none, a orientação será desconhecida, então será definida como 0.
  • Se o valor for interpolated, a orientação será interpolada linearmente de modo que uma o valor bruto de raw.orientation.min é mapeado para -PI/2 e um valor bruto de raw.orientation.max é 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 consistente de dois campos assinados de 4 bits. Essa representação é usada no protocolo baseado em objetos Atmel partes Quando decodificado, o vetor produz um ângulo de orientação e confiança magnitude do modelo. A magnitude de confiança é usada para dimensionar as informações de tamanho, a menos que seja geométrico.
  • Se o valor for default, o sistema vai usar a calibração de interpolated. se o eixo de orientação estiver disponível. Caso contrário, usa none.

Cálculo

O cálculo dos campos orientation e tilt depende do parâmetros de calibração especificados e 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 "distance"

O campo distance descreve a distância entre a ferramenta e o touchscreen. superfície Um valor de 0,0 indica contato direto e valores maiores indicam distância cada vez maior 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, então ela será 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ção de scaled se o eixo de distância disponível. Caso contrário, usa none.

touch.distance.scale

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

Especifica um fator de escala constante usado na calibragem.

O valor padrão é 1.0.

Cálculo

O cálculo do campo distance depende da calibragem especificada parâmetros.

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 de compatibilidade

As propriedades de configuração dos dispositivos de toque mudaram significativamente em Android Ice Cream Sandwich 4.0 Todos os arquivos de configuração de dispositivos de entrada para toque os dispositivos precisam ser atualizados para usar as novas propriedades de configuração.

Drivers de dispositivos touchscreen mais antigos também podem precisar ser atualizado.

Arquivos de mapa de chave virtual

Dispositivos de toque podem ser usados para implementar teclas virtuais.

Há várias maneiras de fazer isso, dependendo dos recursos controlador touchscreen. Alguns controladores de toque podem ser configurados diretamente para implementar usando as teclas de função, configurando os registros de firmware. Outras vezes é desejável realizar o mapeamento de coordenadas de toque para códigos de teclas no software.

Quando chaves virtuais são implementadas em software, o kernel deve exportar um mapa de chave virtual chamado virtualkeys.<devicename> como uma propriedade do quadro. Por exemplo: se os drivers do dispositivo com tela sensível ao toque informarem seu nome como "touchyfeely" então o arquivo de mapa de chave virtual deve ter o caminho /sys/board_properties/virtualkeys.touchyfeely:

Um arquivo de mapa de chave virtual descreve as coordenadas e os códigos de tecla do Linux para as chaves virtuais na tela sensível ao toque.

Além do arquivo de mapa de chave virtual, deve haver um layout de chave correspondente e um arquivo de mapeamento de caracteres para mapear os códigos de tecla do Linux para os códigos de tecla do Android e para especificar o tipo 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 chaves virtuais descrições de layout separadas por novas linhas ou por dois pontos.

As linhas de comentários começam com "'#'" e continuar 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.
  • <Código da chave Linux>: o código da chave virtual do Linux.
  • <centerX>: a coordenada X do pixel do centro da chave virtual.
  • <centerY>: a coordenada em pixel Y do centro da chave virtual.
  • <width>: a largura da chave virtual em pixels.
  • <height>: a altura, em pixels, da chave virtual.

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

Este é um arquivo de mapa de chave virtual escrito em uma única 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 escrito 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 touch tem uma resolução de 480 x 800. Portanto, todas as chaves virtuais têm um <centerY> coordenada 835, que está um pouco abaixo a área visível da tela sensível ao toque.

A primeira chave tem um código de leitura do Linux de 158 (KEY_BACK), centerX de 55, centro: 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 da tecla: /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 de ponteiro multitoque indiretos

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

  • Tocar com um dedo: clique.
  • Movimento de um dedo: mova o ponteiro.
  • Movimento de um dedo e pressionamento de botão: arraste o ponteiro.
  • Faça um movimento de dois dedos com os dois dedos na mesma direção: arraste a área sob o ponteiro nessa direção. O ponteiro em si não se move.
  • Faça um movimento de dois dedos com os dedos na direção oposta ou para trás para diferentes direções: movimente/dimensione/gira a área ao redor do ponteiro. O ponteiro em si não se move.
  • Movimento com vários dedos: gesto em formato livre.

Rejeição da palma da mão

A partir do Android 13, o sistema pode rejeitar automaticamente entradas de palmas quando o framework integrado é ativado. Soluções internas ainda têm suporte, embora precisem ser modificados para retornar a flag TOOL_TYPE_PALM quando uma palma é detectado. O framework integrado também funciona com soluções personalizadas.

O modelo real analisa os primeiros 90 ms de dados de gestos, o ponteiro atual e a os ponteiros ao redor e considera a distância da borda da tela em que os toques estão. Em seguida, ele determina, por ponteiro, quais ponteiros são palmas. Ele também leva conta o tamanho de cada contato, conforme relatado por touchMajor e touchMinor. Em seguida, o framework do Android remove os ponteiros marcados como as palmas das mãos do fluxo de toque.

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

  • (Se houver outros ponteiros ativos) cancela o ponteiro com ACTION_POINTER_UP. e FLAG_CANCELED definido.
  • (Se este for o único ponteiro) O ponteiro é cancelado com ACTION_CANCEL.

Uma API pública, MotionEvent.FLAG_CANCELED, indica que a instância não deve acionar uma ação do usuário. Essa flag é definida para ACTION_CANCEL e ACTION_POINTER_UP.

Se o ponteiro da palma da mão não tiver sido enviado aos apps, o sistema simplesmente vai soltar o ponteiro.

Ativar rejeição de palmas

  1. No driver de toque, use o Macro input_abs_set_res para definir as resoluções para os seguintes campos (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 suporte, verifique se a resolução está definida corretamente.

  2. Para confirmar se os campos estão definidos corretamente, execute:
        $ adb shell getevent -li
    
  3. Para ativar o recurso durante o tempo de 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 o adb shell dumpsys input mostra que há rejeidores de palma dentro da tela UnwantedInteractionBlocker. Caso contrário, verifique os registros relacionados à entrada para encontrar pistas sobre o que pode estar configurado incorretamente.

    Confira o exemplo abaixo como 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 init**rc arquivo:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Leia mais