O Android oferece suporte a uma variedade de touch screens e touch pads, incluindo tablets digitalizadores com stylus.
Touch screens são dispositivos de toque associados a uma tela, de modo 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 normalmente são usados para apontar ou para posicionamento indireto absoluto ou controle baseado em gestos de uma interface do usuário.
Os dispositivos de toque podem ter botões com funções semelhantes às dos botões do mouse.
Às vezes, os dispositivos touchscreen podem ser manipulados usando várias ferramentas diferentes, como dedos ou uma stylus, dependendo da tecnologia do sensor de toque.
Os dispositivos de toque às vezes são usados para implementar teclas virtuais. Por exemplo, em alguns dispositivos Android, a área do sensor da touch screen se estende além da borda da tela e tem uma dupla finalidade como parte de um teclado sensível ao toque.
Devido à grande variedade de dispositivos touchscreen, 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 atendidas:
- O dispositivo de entrada informa a presença dos eixos absolutos
ABS_MT_POSITION_XeABS_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 de multitoque, nunca ambos.
- O dispositivo de entrada informa a presença dos eixos absolutos
ABS_XeABS_Ye a presença do código de teclaBTN_TOUCH.
Quando um dispositivo de entrada é classificado como um dispositivo de toque, a presença de teclas virtuais é determinada pela tentativa de carregar o arquivo de mapa de teclas virtuais do dispositivo. Se um mapa de teclas virtuais estiver disponível, o arquivo de layout de teclas para o dispositivo também será carregado. Consulte [Arquivos de mapa de teclas virtuais](#virtual-key-map-files) para saber mais sobre o local 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 vai escolher uma configuração padrão adequada para periféricos de toque de uso geral, como touchscreens ou touchpads USB externos ou Bluetooth HID. Esses padrões não foram projetados para touch screens integradas e podem resultar em um comportamento incorreto.
Depois que a configuração do dispositivo de entrada é carregada, o sistema o classifica como um dispositivo de touch screen, touch pad ou 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 precisa de outras indicações para mostrar os objetos que estão sendo manipulados.
- Um dispositivo de 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 apontador é usado para a manipulação indireta de objetos na tela usando um cursor. Os dedos são interpretados como gestos de ponteiro multitoque. Outras ferramentas, como as stylus, são interpretadas usando posições absolutas. Consulte Gestos de ponteiro multitoque indiretos para mais informações.
As regras a seguir são usadas para classificar o dispositivo de entrada como touch screen, touch pad ou dispositivo apontador.
- Se a propriedade
touch.deviceTypeestiver 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 ioctlEVIOCGPROP), o tipo de dispositivo será definido como touch screen. Essa condição pressupõe que os dispositivos de toque de entrada direta estejam conectados a uma tela que também esteja conectada. - Se o dispositivo de entrada informar a presença da propriedade de entrada
INPUT_PROP_POINTER(pelo ioctlEVIOCGPROP), o tipo de dispositivo será definido como pointer. - Se o dispositivo de entrada informar a presença dos eixos relativos
REL_XouREL_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 pointer. Esse padrão garante que os touchpads que não foram designados para outra finalidade especial controlem o ponteiro.
Botões
Os botões são controles opcionais que os apps podem usar para executar outras funções. Os botões em dispositivos touchscreen se comportam de maneira semelhante aos botões do mouse e são usados principalmente com dispositivos touchscreen do tipo ponteiro ou com uma stylus.
Os seguintes botões são compatíveis:
BTN_LEFT: mapeado paraMotionEvent.BUTTON_PRIMARY.BTN_RIGHT: mapeado paraMotionEvent.BUTTON_SECONDARY.BTN_MIDDLE: mapeado paraMotionEvent.BUTTON_MIDDLE.BTN_BACKeBTN_SIDE: mapeados paraMotionEvent.BUTTON_BACK. Pressionar esse botão também sintetiza o pressionamento de uma tecla com o códigoKeyEvent.KEYCODE_BACK.BTN_FORWARDeBTN_EXTRA: mapeados paraMotionEvent.BUTTON_FORWARD. Pressionar esse botão também sintetiza o pressionamento de uma tecla com o códigoKeyEvent.KEYCODE_FORWARD.BTN_STYLUS: mapeado paraMotionEvent.BUTTON_SECONDARY.BTN_STYLUS2: mapeado paraMotionEvent.BUTTON_TERTIARY.
Ferramentas e tipos de ferramentas
Uma ferramenta é um dedo, uma stylus ou outro aparelho usado para interagir com o dispositivo de toque. Alguns dispositivos de toque podem distinguir entre diferentes tipos de ferramentas.
Em outras partes do Android, como na API MotionEvent, uma ferramenta é frequentemente chamada de ponteiro.
Os seguintes tipos de ferramentas são compatíveis:
BTN_TOOL_FINGEReMT_TOOL_FINGER: mapeados paraMotionEvent.TOOL_TYPE_FINGER.BTN_TOOL_PENeMT_TOOL_PEN: mapeados paraMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_RUBBER: mapeado paraMotionEvent.TOOL_TYPE_ERASER.BTN_TOOL_BRUSH: mapeado paraMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_PENCIL: mapeado paraMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_AIRBRUSH: mapeado paraMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_MOUSE: mapeado paraMotionEvent.TOOL_TYPE_MOUSE.BTN_TOOL_LENS: mapeado paraMotionEvent.TOOL_TYPE_MOUSE.BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAPeBTN_TOOL_QUADTAP: mapeados paraMotionEvent.TOOL_TYPE_FINGER.
Ferramentas de passar o cursor x tocar
As ferramentas podem estar em contato com o dispositivo de toque ou dentro do alcance e flutuando sobre ele. Nem todos os dispositivos de toque podem detectar a presença de uma ferramenta sobre eles. As que fazem isso, como os digitalizadores de stylus baseados em RF, geralmente podem detectar quando a ferramenta está dentro de um intervalo limitado do digitalizador.
O componente InputReader distingue as ferramentas de toque das ferramentas de
passagem. Da mesma forma, as ferramentas de toque e de passagem 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 passagem 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 do driver de dispositivo por toque
- Os drivers de dispositivos de toque precisam registrar apenas os eixos e os códigos de tecla dos eixos
e botões que eles aceitam. O registro de eixos ou códigos de tecla 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 de tecla
BTN_TOUCH, o sistema vai presumir queBTN_TOUCHé sempre usado para indicar se a ferramenta está tocando na tela. Portanto,BTN_TOUCHnão deve ser usado para indicar que a ferramenta está apenas no alcance 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 à ponta da ferramenta ou a intensidade do sinal do contato de toque.ABS_TOOL_WIDTH: (opcional) informa a área transversal ou a largura do toque ou da própria ferramenta.ABS_DISTANCE: (opcional) informa a distância da ferramenta em relação à 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 na superfície do dispositivo de toque ao longo do eixo Y.BTN_TOUCH: (OBRIGATÓRIO) indica se a ferramenta está tocando o dispositivo.BTN_LEFT,BTN_RIGHT,BTN_MIDDLE,BTN_BACK,BTN_SIDE,BTN_FORWARD,BTN_EXTRA,BTN_STYLUS,BTN_STYLUS2: (opcional) Informa os estados do botão.BTN_TOOL_FINGER,BTN_TOOL_PEN,BTN_TOOL_RUBBER,BTN_TOOL_BRUSH,BTN_TOOL_PENCIL,BTN_TOOL_AIRBRUSH,BTN_TOOL_MOUSE,BTN_TOOL_LENS,BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP,BTN_TOOL_QUADTAP: (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 à ponta da ferramenta ou a intensidade do sinal do contato de toque.ABS_MT_TOUCH_MAJOR: (opcional) informa a área transversal do toque ou o comprimento da dimensão mais longa do toque.ABS_MT_TOUCH_MINOR: (opcional) informa o comprimento da dimensão mais curta do contato por toque. Esse eixo não deve ser usado seABS_MT_TOUCH_MAJORestiver 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ê saiba as dimensões da ferramenta.ABS_MT_WIDTH_MINOR: (opcional) informa o comprimento da dimensão mais curta da própria ferramenta. Esse eixo não deve ser usado seABS_MT_WIDTH_MAJORestiver 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 em relação à superfície do dispositivo de toque.ABS_MT_TOOL_TYPE: (opcional) informa o tipo de ferramenta comoMT_TOOL_FINGERouMT_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 ferramentas estão ativas. Por exemplo, quando vários dedos estão tocando o dispositivo, cada um precisa receber 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 o dispositivo.BTN_LEFT,BTN_RIGHT,BTN_MIDDLE,BTN_BACK,BTN_SIDE,BTN_FORWARD,BTN_EXTRA,BTN_STYLUS,BTN_STYLUS2: (opcional) Informa os estados do botão.BTN_TOOL_FINGER,BTN_TOOL_PEN,BTN_TOOL_RUBBER,BTN_TOOL_BRUSH,BTN_TOOL_PENCIL,BTN_TOOL_AIRBRUSH,BTN_TOOL_MOUSE,BTN_TOOL_LENS,BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP,BTN_TOOL_QUADTAP: (opcional) informa o tipo de ferramenta.
- Se os eixos para os protocolos de toque único e multitoque forem definidos, somente os eixos multitoque serão usados, e os eixos de toque único serão ignorados.
Os valores mínimo e máximo dos eixos
ABS_X,ABS_Y,ABS_MT_POSITION_XeABS_MT_POSITION_Ydefinem os limites da área ativa do dispositivo em unidades de superfície específicas do dispositivo. No caso de uma touch screen, a área ativa descreve a parte do dispositivo de toque que realmente cobre a tela.Para uma touch screen, o sistema interpola automaticamente as posições de toque informadas em unidades de superfície para obter posições de toque em pixels de tela de acordo com o seguinte cálculo:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)Uma touch screen 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. Este é o comportamento esperado.
Um dispositivo touch nunca deve fixar as coordenadas de toque aos limites da área ativa. Se um toque sair da área ativa, ele precisará ser informado como estando fora da área ativa ou não ser informado.
Por exemplo, se o dedo do usuário estiver tocando perto do canto superior esquerdo da touch screen, ele poderá informar uma coordenada de (minX, minY). Se o dedo continuar a se mover para fora da área ativa, a touch screen precisará começar a informar coordenadas com componentes menores que minX e minY, como (minX - 2, minY - 3), ou parar de informar o toque. Em outras palavras, a touch screen 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 da tela, 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_PRESSUREouABS_MT_PRESSURE, se forem informados, precisam ser diferentes de zero quando a ferramenta estiver tocando o dispositivo e zero quando não estiver, para indicar que a ferramenta está passando o cursor.Informar a 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_MAJORouABS_MT_WIDTH_MINORprecisam ser diferentes de zero quando a ferramenta está tocando o dispositivo e zero quando não está, 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 a 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_DISTANCEouABS_MT_DISTANCEprecisam se aproximar de zero quando a ferramenta está tocando o 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_XeABS_TILT_Yprecisam ser zero quando a ferramenta está perpendicular ao dispositivo. Uma inclinação diferente de zero indica que a ferramenta está inclinada.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) é fornecido por
(max + min) / 2para cada eixo. Valores menores que o ponto central representam uma inclinação para cima ou para a esquerda, e valores maiores que o ponto central representam uma inclinação para baixo ou para a direita.InputReaderconverte os componentes de inclinação X e Y em um ângulo de inclinação perpendicular que varia de 0 aPI / 2radianos e um ângulo de orientação planar que varia de-PIaPIradianos. Essa representação resulta em uma descrição de orientação compatível com o que é usado para descrever toques de 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 porBTN_TOOL_*. Se não houver nenhuma informação disponível 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 estará ativa se
BTN_TOUCHouBTN_TOOL_*for 1.Essa condição implica que
InputReaderprecisa 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 alcance).- Ao usar o protocolo multitoque "A", a ferramenta fica ativa sempre que aparece no relatório de sincronização mais recente. Quando a ferramenta deixa de aparecer nos relatórios de sincronização, ela deixa de existir.
- Ao usar o protocolo multitoque "B", a ferramenta fica ativa enquanto tem um slot ativo. Quando o espaço é limpo, a ferramenta deixa de existir.
- Uma ferramenta é considerada em suspensão com base nas seguintes condições:
- Se a ferramenta for
BTN_TOOL_MOUSEouBTN_TOOL_LENS, ela não estará em modo de passagem, 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á em modo de passagem.
- Se a ferramenta estiver ativa, o driver for compatível com o código de tecla
BTN_TOUCHeBTN_TOUCHtiver um valor igual a zero, a ferramenta estará em modo de passagem.
- Se a ferramenta for
- O
InputReaderé compatível com os protocolos multitoque "A" e "B". Os novos drivers precisam usar o protocolo "B", mas ambos funcionam. No Android 4.0 e versões mais recentes, os drivers de touch screen podem precisar ser alterados 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 é levantado), ela precisa parar de aparecer nos relatórios de sincronização multitoque subsequentes. Quando todas as ferramentas ficarem inativas (todos os dedos forem "levantados"), o driver vai enviar um pacote de relatório de sincronização vazio, como
SYN_MT_REPORTseguido porSYN_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 aceito.
As informações de pressão física ou intensidade do sinal precisam 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 aceito.- 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 aceito.
Operação do dispositivo por toque
Veja a seguir um breve resumo da operação do dispositivo de toque no Android.
- O
EventHublê eventos brutos do driverevdev. InputReaderconsome 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ão.- Se BACK ou FORWARD foi pressionado ou liberado,
InputReadernotificaInputDispatchersobre o evento de tecla. InputReaderdetermina se uma tecla virtual foi pressionada. Se sim, ele notificaInputDispatchersobre o evento principal.InputReaderdetermina se o toque foi iniciado dentro dos limites da tela. Se sim, ele notificaInputDispatchersobre o evento de toque.- Se não houver ferramentas de toque, mas houver pelo menos uma ferramenta de passagem,
InputReadernotificaráInputDispatchersobre o evento de passagem. - Se o tipo de dispositivo de toque for ponteiro,
InputReadervai realizar a detecção de gestos do ponteiro, mover o ponteiro e os pontos de acordo e notificarInputDispatchersobre o evento do ponteiro. - O
InputDispatcherusa oWindowManagerPolicypara determinar se os eventos precisam ser enviados e se eles precisam ativar o dispositivo. Em seguida, oInputDispatcherenvia os eventos para os 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 do dispositivo.
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 dispositivo de toque.
Um dos motivos para isso é que os drivers de dispositivos de 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 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 de tamanho bruto não seria significativo para os apps, porque eles precisariam saber o tamanho físico e outras características dos nós do sensor do dispositivo de toque.
O sistema usa parâmetros de calibração codificados em arquivos de configuração do dispositivo de entrada para decodificar, transformar e normalizar os valores informados pelo dispositivo de toque 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 indicam os valores brutos informados pelo driver do dispositivo
de toque como eventos EV_ABS.
raw.x- O valor do eixo
ABS_XouABS_MT_POSITION_X. raw.y- O valor do eixo
ABS_YouABS_MT_POSITION_Y. raw.pressure- O valor do eixo
ABS_PRESSUREouABS_MT_PRESSUREou 0, se não estiver disponível. raw.touchMajor- O valor do eixo
ABS_MT_TOUCH_MAJORou 0, se não estiver disponível. raw.touchMinor- O valor do eixo
ABS_MT_TOUCH_MINORouraw.touchMajor, se não estiver disponível. raw.toolMajor- O valor do eixo
ABS_TOOL_WIDTHouABS_MT_WIDTH_MAJORou 0, se não estiver disponível. raw.toolMinor- O valor do eixo
ABS_MT_WIDTH_MINORouraw.toolMajor, se não estiver disponível. raw.orientation- O valor do eixo
ABS_MT_ORIENTATIONou 0, se não estiver disponível. raw.distance- O valor do eixo
ABS_DISTANCEouABS_MT_DISTANCEou 0, se não estiver disponível. raw.tiltX- O valor do eixo
ABS_TILT_Xou 0, se não estiver disponível. raw.tiltY- O valor do eixo
ABS_TILT_You 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 o ioctl EVIOCGABS para cada eixo.
raw.*.min- O valor mínimo inclusivo do eixo bruto.
raw.*.max- O valor máximo inclusivo do eixo bruto.
raw.*.range- Equivalente a
raw.*.max - raw.*.min. raw.*.fuzz- A precisão do eixo bruto. Por exemplo, fuzz = 1 implica que os valores são precisos para +/- 1 unidade.
raw.width- A largura inclusiva da área de toque, equivalente a
raw.x.range + 1. raw.height- A altura inclusiva da área de toque, equivalente a
raw.y.range + 1.
Intervalos de saída
As expressões a seguir indicam as características do sistema de coordenadas de saída. O sistema usa interpolação linear para converter as informações de posição de toque das unidades de superfície usadas pelo dispositivo de toque em unidades de saída que são informadas aos apps, como pixels de tela.
output.width- A largura da saída. Para touch screens (associadas a uma tela), essa é a largura da tela em pixels. Para touchpads (não associados a uma tela),
a largura de saída é igual a
raw.width, indicando que nenhuma interpolação é realizada. output.height- A altura da saída. Para touch screens (associadas a uma tela), essa
é a altura da tela em pixels. Para touchpads (não associados a uma tela),
a altura de 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 calibração. A tabela a seguir descreve algumas propriedades de configuração de uso geral. Todas as outras propriedades são descritas nas seções a seguir, junto com os campos que elas calibram.
touch.deviceType
Definição: touch.deviceType = touchScreen |
touchPad | pointer | default
Especifica o tipo de dispositivo de toque.
-
Se o valor for
touchScreen, o dispositivo de toque é uma touch screen associada a uma tela. -
Se o valor for
touchPad, o dispositivo de toque é um touchpad não associado a uma tela. -
Se o valor for
pointer, o dispositivo de toque é um touchpad não associado a uma tela, e os movimentos dele são usados para gestos de ponteiro multitoque indiretos. -
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 touch screens.
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 serão imunes a mudanças na orientação da tela.
O valor padrão será 1 se o dispositivo tiver uma touch screen, caso contrário, será
0.
O sistema diferencia entre telas e touch screens internas e externas. Uma touch screen interna que reconhece a orientação é girada com base na orientação da tela interna. Uma tela touch externa que reconhece a orientação é girada com base na orientação da tela externa.
A detecção de orientação é usada para oferecer suporte à rotação de touch screens em dispositivos como o Nexus One. Por exemplo, quando o dispositivo é girado 90 graus no sentido horário em relação à orientação natural, as posições absolutas dos toques são remapeadas para que um toque no canto superior esquerdo do sistema de coordenadas absolutas da touch screen seja informado como um toque no canto superior esquerdo do sistema de coordenadas giradas 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 touchscreen eram considerados sensíveis à orientação.
touch.gestureMode
Definição: touch.gestureMode = pointer | spots |
default
Especifica o modo de apresentação para gestos de ponteiro. 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 ao 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 cada dedo.
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
Campos touchMajor, touchMinor, toolMajor, toolMinor, size
Os campos touchMajor e touchMinor descrevem as dimensões aproximadas
da área de contato em unidades de saída (pixels).
Os campos toolMajor e toolMinor descrevem as dimensões aproximadas da 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
tamanho normalizado possível é 1,0 (a área do sensor está saturada).
Quando o comprimento e a largura aproximados podem ser medidos, o campo
touchMajor
especifica a dimensão mais longa e o campo touchMinor especifica a dimensão mais curta
da área de contato. Quando apenas o diâmetro aproximado da área de contato pode ser medido,
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 de toque medem ou informam o tamanho do toque e da ferramenta de várias maneiras. A implementação atual aceita três tipos diferentes de medições: diâmetro, área e caixa delimitadora geométrica em unidades de superfície.
<touch.size.calibration< h4=""></touch.size.calibration<>
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 que a posição, portanto, 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á considerado proporcional à área do toque ou da ferramenta. -
Se o valor for
default, o sistema vai usar a calibragemgeometricse o eixoraw.touchMajorouraw.toolMajorestiver disponível. Caso contrário, vai usar a calibragemnone.
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 calibração.
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 de toque, principalmente os "Semi-MT", não conseguem distinguir as
dimensões individuais de vários contatos. Por isso, eles informam uma medida de tamanho
que representa a área ou largura total. Essa 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 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á flutuando.
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 e, portanto, 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 vai usar a calibragemphysicalse o eixo de pressão estiver disponível. Caso contrário, vai usarnone.
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,
PI/2 indica que o eixo principal está orientado para a direita. Quando uma ferramenta de 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 medida angular.
Uma inclinação de 0 indica que a ferramenta está perpendicular à superfície.
Uma inclinação de PI/2 indica que a ferramenta está plana na superfície.
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 é desconhecida e definida como 0. - Se o valor for
interpolated, a orientação será interpolada linearmente para que um valor bruto deraw.orientation.minseja mapeado para-PI/2e um valor bruto deraw.orientation.maxseja mapeado paraPI/2. O valor central de(raw.orientation.min + raw.orientation.max) / 2é mapeado para0. - Se o valor for
vector, a orientação será interpretada como um vetor compactado que consiste em dois campos assinados de 4 bits. Essa representação é usada em partes do protocolo baseado em objeto 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 sejam geométricas. - Se o valor for
default, o sistema vai usar a calibrageminterpolatedse o eixo de orientação estiver disponível. Caso contrário, vai usarnone.
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
sensível ao toque. Um valor de 0,0 indica contato direto, e valores maiores indicam
uma distância maior da superfície.
touch.distance.calibration
Definição: touch.distance.calibration = none |
scaled | default
Especifica o tipo de medida usado pelo driver de toque para informar a distância.
-
Se o valor for
none, a distância é desconhecida e, portanto, definida como 0. -
Se o valor for
scaled, a distância informada será multiplicada por um fator de escalonamento constante. -
Se o valor for
default, o sistema vai usar a calibragemscaledse o eixo de distância estiver disponível. Caso contrário, vai usarnone.
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 touchscreen 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.
Os drivers de dispositivos de toque mais antigos também podem precisar ser atualizados.
Arquivos de mapa de teclas virtuais
Dispositivos de toque podem ser usados para implementar teclas virtuais.
Há várias maneiras de fazer isso, dependendo dos recursos do controlador de toque. Alguns controladores de toque podem ser configurados diretamente para implementar teclas de função definindo registros de firmware. Em outros casos, é recomendável realizar o mapeamento de coordenadas de toque para códigos de tecla no software.
Quando as teclas virtuais são implementadas no software, o kernel precisa exportar um arquivo de mapa de teclas virtuais
chamado virtualkeys.<devicename> como uma propriedade de placa. Por exemplo,
se os drivers do dispositivo de touch screen informarem o nome como "touchyfeely",
o arquivo de mapa de teclas virtuais 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 touch screen.
Além do arquivo de mapa de teclas virtuais, é necessário que haja um arquivo de layout de teclas
e um arquivo de mapa de caracteres de teclas correspondentes para mapear os códigos de teclas do Linux para os códigos de teclas do Android e
especificar o tipo do dispositivo de teclado (geralmente SPECIAL_FUNCTION).
Sintaxe
Um arquivo de mapa de teclas virtuais é 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 final da linha.
Cada chave virtual é descrita por seis componentes delimitados por dois-pontos:
0x01: um código de versão. Precisa ser sempre0x01.- <Linux key code>: o código de tecla do Linux da tecla virtual.
- <centerX>: a coordenada de pixel X do centro da tecla virtual.
- <centerY>: a coordenada de pixel Y 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.
Este é um arquivo de mapa de teclas virtuais 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 teclas virtuais 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 touch screen 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 touch screen.
A primeira tecla tem um código de verificação 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 de tecla: /system/usr/keychars/touchyfeely.kcm.
type SPECIAL_FUNCTION
Gestos indiretos de ponteiro multitoque
No modo de ponteiro, o sistema interpreta os seguintes gestos:
- Toque com um dedo: clique.
- Movimento com um dedo: move o ponteiro.
- Movimento de um dedo mais pressionamento de botão: arrasta o ponteiro.
- Movimento com dois dedos na mesma direção: arrasta a área sob o ponteiro nessa direção. O ponteiro em si não se move.
- Movimento de dois dedos, com os dois dedos se aproximando ou se afastando em direções diferentes: deslocar/dimensionar/girar a área ao redor do ponteiro. O ponteiro em si não se move.
- Movimento com vários dedos: gesto de 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 está ativado. As soluções personalizadas internas ainda são compatíveis,
mas talvez precisem ser modificadas para retornar a flag TOOL_TYPE_PALM quando uma palma
for detectada. O framework integrado 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 e, em seguida, considera a distância entre os toques e a borda da tela.
Em seguida, ele determina, para cada ponteiro, quais são palmas. Ele também considera
o tamanho de cada contato, conforme informado por touchMajor e
touchMinor. Em seguida, o framework do Android remove do fluxo de toque os ponteiros marcados como
palmas.
Se um ponteiro já tiver sido enviado aos apps, o sistema vai:
- (Se houver outros ponteiros ativos) Cancela o ponteiro com
ACTION_POINTER_UPeFLAG_CANCELEDdefinidos. - (Se esse 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 tiver sido enviado aos apps, o sistema vai descartá-lo.
Ativar a rejeição de palmas
- No driver de toque, use a
macro
input_abs_set_respara definir as resoluções dos seguintes campos (as unidades são pixels por mm):ABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_TOUCH_MAJORABS_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á definida corretamente. - Para confirmar se os campos estão definidos corretamente, execute:
$ adb shell getevent -li - Para ativar o recurso durante o ambiente de execução, execute:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1 - Reinicie o processo
system_server.$ adb shell stop && adb shell start - Confirme se
adb shell dumpsys inputmostra que há rejeições de palma dentro deUnwantedInteractionBlocker. Se não estiver, verifique os registros relacionados à entrada para encontrar pistas sobre o que pode estar configurado incorretamente.Veja o exemplo a seguir para referência:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Para ativar o recurso permanentemente, adicione o comando sysprop correspondente ao arquivo
init**rc:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1