O Android oferece suporte a várias telas e touchpads sensíveis ao toque, incluindo tablets de digitalização com stylus.
As telas sensíveis ao toque são dispositivos associados a uma tela, de modo que o usuário tem a impressão de manipular itens diretamente na tela.
Touchpads são dispositivos de toque não associados a uma tela, como tablet digitalizador. Os touchpads geralmente são usados para apontar ou posicionamento indireto absoluto ou controle baseado em gestos de uma interface do usuário.
Os dispositivos touchscreen podem ter botões com funções semelhantes às dos 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 alguns dispositivos Android, a área do sensor da tela touchscreen se estende além da borda da tela e tem uma função dupla como parte de um teclado com teclas sensíveis 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 de dispositivos 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 dos eixos absolutos
ABS_MT_POSITION_X
eABS_MT_POSITION_Y
. - O dispositivo de entrada não tem botões de gamepad. Essa condição resolve uma ambiguidade com alguns gamepads que informam eixos com códigos que se sobrepõem aos eixos do MT.
Um dispositivo de entrada será classificado como de toque único se as duas as seguintes condições são mantidas:
- O dispositivo de entrada não é classificado como multitoque. Um dispositivo de entrada é classificado como dispositivo de toque único ou multitoque, nunca ambos.
- O dispositivo de entrada informa a presença dos valores absolutos
ABS_X
eABS_Y
. eixos e a presença do código de teclaBTN_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 teclas virtual estiver disponível, o arquivo de layout de teclas do dispositivo também será carregado. Consulte [Arquivos de mapa de chaves 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 touchscreen.
Todos os dispositivos de toque integrados precisam ter arquivos de configuração de dispositivo de entrada. Se nenhum arquivo de configuração de dispositivo de entrada estiver presente, o sistema escolherá uma configuração padrão adequada para periféricos touch de uso geral, como telas touch USB ou Bluetooth HID externas ou touchpads. Esses padrões não são projetados para telas sensíveis ao toque integradas e podem resultar em comportamento incorreto.
Depois que a configuração do dispositivo de entrada é carregada, o sistema classifica o dispositivo de entrada como tela tátil, touchpad ou ponteiro.
- Um dispositivo de tela touch é usado para manipulação direta de objetos no tela. O usuário toca diretamente na tela, então o sistema não exige recursos adicionais para indicar os objetos que estão sendo manipulados.
- Um dispositivo touch pad é usado para fornecer informações de posicionamento absoluto a um app sobre toques em uma determinada área do sensor. Ele pode ser útil para tablets de digitalização.
- Um dispositivo de ponteiro é usado para manipulação indireta de objetos na tela usando um cursor. Os dedos são interpretados como gestos de ponteiro multitoque. Outras ferramentas, como canetas 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 propriedade de entrada
INPUT_PROP_DIRECT
pelo ioctlEVIOCGPROP
, o tipo de dispositivo será definido como tela touchscreen. Essa condição pressupõe que os dispositivos de entrada por toque direto estejam conectados a uma tela que também esteja conectada. - Se o dispositivo de entrada informar a presença da
INPUT_PROP_POINTER
propriedade de entrada (usando o ioctlEVIOCGPROP
) e o tipo de dispositivo Defina como pointer. - Se o dispositivo de entrada informar a presença de
REL_X
ouREL_Y
eixos relativos, o tipo de dispositivo será definido como touch pad. Essa condição resolve uma ambiguidade para dispositivos de entrada que consistem em um mouse e um 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 que os touchpads que não foram designados para nenhum outro propósito 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 com tela touch se comportam de maneira semelhante aos botões do mouse e são usados principalmente com dispositivos de tipo apontamento 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_BACK
eBTN_SIDE
: mapeados paraMotionEvent.BUTTON_BACK
. Pressionar este botão também sintetiza um pressionamento de tecla com o código de teclaKeyEvent.KEYCODE_BACK
:BTN_FORWARD
eBTN_EXTRA
: mapeados paraMotionEvent.BUTTON_FORWARD
. Pressionar este botão também sintetiza um pressionamento de tecla pelo código de teclaKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: mapeado paraMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: mapeado paraMotionEvent.BUTTON_TERTIARY
.
Ferramentas e tipos de ferramentas
Uma ferramenta é um dedo, uma stylus ou outra ferramenta usada para interagir com o dispositivo touchscreen. Alguns dispositivos com tela sensível ao toque podem distinguir entre diferentes tipos de ferramentas.
Em outros lugares do Android, como na API MotionEvent
, uma ferramenta é frequentemente chamada
de ponteiro.
Os seguintes tipos de ferramentas são compatíveis:
BTN_TOOL_FINGER
eMT_TOOL_FINGER
: mapeados paraMotionEvent.TOOL_TYPE_FINGER
BTN_TOOL_PEN
eMT_TOOL_PEN
: mapeados paraMotionEvent.TOOL_TYPE_STYLUS
BTN_TOOL_RUBBER
: mapeado paraMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: mapeado paraMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: mapeado paraMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: mapeado paraMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: mapeado paraMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: mapeado paraMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
eBTN_TOOL_QUADTAP
: mapeados paraMotionEvent.TOOL_TYPE_FINGER
.
Passar o cursor ou tocar em ferramentas
As ferramentas podem estar em contato com o dispositivo de toque ou dentro do alcance e pairando acima dele. Nem todos os dispositivos com tela sensível ao toque podem detectar a presença de uma ferramenta pairada sobre eles. 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 do driver de dispositivo por toque
- Os drivers de dispositivos touchscreen precisam registrar apenas os eixos e os códigos de tecla deles.
e botões compatíveis. O registro de eixos ou códigos de teclas sem suporte
pode confundir o algoritmo de classificação do dispositivo ou fazer com que o sistema detecte incorretamente
os recursos do dispositivo. Por exemplo, se o dispositivo informar o
Código da tecla
BTN_TOUCH
, o sistema presume queBTN_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 do 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 da superfície do dispositivo touchscreen 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
,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 comprimento da dimensão menor do contato de toque. Este eixo não deve ser usado seABS_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 seABS_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 em relação à superfície do dispositivo com tela touch.ABS_MT_TOOL_TYPE
: (opcional) informa o tipo de ferramenta comoMT_TOOL_FINGER
ouMT_TOOL_PEN
.ABS_MT_TRACKING_ID
: (opcional) informa o ID de rastreamento da ferramenta. O ID de 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 ID do slot da ferramenta ao usar o protocolo multitoque 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
eBTN_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 do protocolo de toque único e multitoque forem definidos, somente os eixos multitoque serão usados, e os eixos de toque único serão ignorados.
Os valores mínimo e máximo dos eixos
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
eABS_MT_POSITION_Y
definem os limites da área ativa do dispositivo em unidades de superfície específicas do dispositivo. No caso de uma tela sensível ao toque, a área ativa descreve a parte do 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 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ça dentro do 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 comportamento é esperado.
Um dispositivo com tela touch nunca deve limitar as coordenadas de toque aos limites da área ativa. 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 perto do canto superior esquerdo da tela sensível ao toque, ele poderá informar uma coordenada de (minX, minY). Se o dedo continuar se movendo para fora da área ativa, a tela touch vai começar a informar coordenadas com componentes menores que minX e minY, como (minX - 2, minY - 3), ou vai parar de informar o toque. Em outras palavras, a tela touch não deve informar (minX, minY) quando o dedo do usuário estiver 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
ouABS_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.O envio de informações de pressão é opcional, mas altamente recomendado. Os apps podem usar informações de pressão para implementar desenhos sensíveis à pressão e outros efeitos.
Os valores informados por
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
ouABS_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 dispositivo de toque pode medir o tamanho dos contatos de toque do dedo, mas não os 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 o desenho sensível ao tamanho e outros efeitos.
Os valores informados por
ABS_DISTANCE
ouABS_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
eABS_TILT_Y
precisam ser zero quando a ferramenta estiver perpendicular ao dispositivo. Uma inclinação diferente de zero indica que a ferramenta é mantida em um local inclinada.Os ângulos de inclinação ao longo dos eixos X e Y são especificados em graus a partir da perpendicular. O ponto central (perfeitamente perpendicular) é dado por
(max + min) / 2
para cada eixo. Valores menores que o ponto central representam uma inclinação para cima ou para a esquerda, valores maiores que o ponto central representar uma inclinação para baixo ou para a direita.InputReader
converte os componentes de inclinação X e Y em um ângulo de inclinação perpendicular variando de 0 aPI / 2
radianos e um ângulo de orientação planar variando de-PI
aPI
radianos. Essa representação resulta em uma 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 porBTN_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
, ouBTN_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 de 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 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 é limpo, a ferramenta deixa de existir.
- Uma ferramenta passa o cursor com base nestas condições:
- Se a ferramenta for
BTN_TOOL_MOUSE
ouBTN_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
eBTN_TOUCH
tem o valor zero, então a ferramenta está passando o cursor.
- Se a ferramenta for
InputReader
oferece suporte ao protocolo multitoque "A" e "B". Novos motoristas deve usar "B" mas também funciona.A partir do Android 4.0, talvez seja necessário mudar os drivers da tela touch para obedecer à especificação do protocolo de entrada do Linux.
As seguintes mudanças podem ser necessárias:
Quando uma ferramenta fica inativa (o dedo "levanta"), ela deixa de aparecer em relatórios de sincronização com vários toques. Quando todas as ferramentas ficam inativas (todos os dedos estão "para cima"), o driver precisa enviar um pacote de relatório de sincronização vazio, como
SYN_MT_REPORT
seguido porSYN_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 sobre o tamanho do toque precisam ser informadas usando
ABS_MT_TOUCH_MAJOR
.As versões anteriores do Android extraíam informações de tamanho de
ABS_MT_TOOL_MAJOR
. O comportamento antigo era incompatível com a especificação do protocolo de entrada do Linux e não é mais compatível.
Operação do dispositivo touchscreen
Veja a seguir um breve resumo da operação da touchscreen no Android.
- O
EventHub
lê eventos brutos do driverevdev
. - A
InputReader
consome os eventos brutos e atualiza o estado interno sobre a posição e outras características de cada ferramenta. Ele também rastreia estados de botões. - Se BACK ou FORWARD foi pressionado ou liberado,
InputReader
notificaInputDispatcher
sobre o evento principal. InputReader
determina se uma tecla virtual foi pressionada. Nesse caso, ele notificaInputDispatcher
sobre o evento principal.InputReader
determina se o toque foi iniciado dentro dos limites da tela. Em caso afirmativo, ele notificaInputDispatcher
sobre o evento de toque.- Se não houver ferramentas de toque, mas houver pelo menos uma ferramenta de passar o cursor,
InputReader
notificaInputDispatcher
sobre o evento de passar o cursor. - 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 notificaInputDispatcher
sobre o evento do ponteiro. - O
InputDispatcher
usaWindowManagerPolicy
para determinar se os eventos precisam ser enviados e se eles precisam ativar o dispositivo. Em seguida,InputDispatcher
envia os eventos para os 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 dispositivo de toque.
Uma das razões para isso é que os drivers de dispositivos com tela touch geralmente informam as características de toques usando unidades específicas do dispositivo.
Por exemplo, muitos dispositivos com tela touch medem a área de contato usando uma escala interna específica do dispositivo, como o número total de nós de sensores acionados pelo toque. Esse valor de tamanho bruto não seria significativo para os apps, porque eles precisariam saber sobre o tamanho físico e outras características dos nós do sensor do dispositivo com tela touch.
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 táctil em uma representação padrão mais simples que os apps podem entender.
Convenções de documentação
Para fins de documentação, usamos as convenções a seguir para descrever os valores usados pelo sistema durante o processo de calibração.
Valores brutos do eixo
As expressões a seguir denotam os valores brutos informados pelo toque
driver de dispositivo como eventos EV_ABS
.
raw.x
- O valor do eixo
ABS_X
ouABS_MT_POSITION_X
. raw.y
- O valor do eixo
ABS_Y
ouABS_MT_POSITION_Y
. raw.pressure
- O valor do eixo
ABS_PRESSURE
ouABS_MT_PRESSURE
, ou 0 se 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
, ouraw.touchMajor
se indisponível. raw.toolMajor
- O valor do eixo
ABS_TOOL_WIDTH
ouABS_MT_WIDTH_MAJOR
, ou 0 se indisponível. raw.toolMinor
- O valor do eixo
ABS_MT_WIDTH_MINOR
ouraw.toolMajor
, se não disponível. raw.orientation
- O valor do eixo
ABS_MT_ORIENTATION
ou 0 se não estiver disponível. raw.distance
- O valor do eixo
ABS_DISTANCE
ouABS_MT_DISTANCE
, ou 0 se não estiver disponível. raw.tiltX
- O valor do eixo
ABS_TILT_X
ou 0 se não estiver disponível. raw.tiltY
- O valor do eixo
ABS_TILT_Y
ou 0 se não estiver disponível.
Intervalos brutos do eixo
As expressões a seguir denotam os limites dos 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 inclusive do eixo bruto.
raw.*.range
- É equivalente a
raw.*.max - raw.*.min
. raw.*.fuzz
- A precisão do eixo bruto. Por exemplo, fuzz = 1 implica que os valores são precisos em +/- 1 unidade.
raw.width
- A largura inclusiva da área de toque, equivalente a
raw.x.range + 1
. raw.height
- A altura inclusiva da área de toque, equivalente a
raw.y.range + 1
.
Intervalos de saída
As expressões a seguir 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 telas touch (associadas a uma tela), essa
é 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 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 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 dispositivo com tela touch.
-
Se o valor for
touchScreen
, o dispositivo de toque é uma tela touch 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 com uma tela, e os movimentos dele são usados para gestos indiretos de ponteiro multitoque. -
Se o valor for
default
, o sistema detectará automaticamente o tipo de dispositivo. de acordo com o algoritmo de classificação.
Consulte a seção Classificação para mais detalhes sobre como o tipo de dispositivo influencia o comportamento da touchscreen.
No Android 3 e versões anteriores, todos os dispositivos com tela sensível ao toque eram considerados telas sensíveis ao toque.
touch.orientationAware
Definição: touch.orientationAware
= 0
| 1
Especifica se o dispositivo com tela sensível ao toque precisa reagir às mudanças de orientação da tela.
-
Se o valor for
1
, as posições de toque informadas pelo dispositivo de toque serão giradas sempre que a orientação da tela mudar. -
Se o valor for
0
, as posições de toque informadas pelo dispositivo de toque não serão afetadas por mudanças de orientação da tela.
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 touch 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 no sentido horário em 90 graus da orientação natural, as posições absolutas dos toques são remapeadas de modo que um toque no canto superior esquerdo do sistema de coordenadas absoluto da tela sensível ao toque seja informado como um toque no canto superior esquerdo do sistema de coordenadas girado da tela. Isso é feito para que os toques sejam informados com o mesmo sistema de coordenadas que os apps usam para desenhar os elementos visuais.
Antes do Honeycomb, todos os dispositivos com tela touch eram considerados sensíveis à orientação.
touch.gestureMode
Definição: touch.gestureMode
= pointer
| spots
|
default
Especifica o modo de apresentação para gestos do ponteiro. Essa propriedade de configuração é relevante apenas quando o dispositivo com tela sensível ao toque é do tipo pointer.
-
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 centro 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
é definida ou spots
.
Campos X e Y
Os campos X e Y fornecem informações posicionais para o centro da área de contato.
Cálculo
O cálculo é simples: as informações posicionais do driver de toque são interpoladas linearmente para o sistema de coordenadas de saída.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, toolMajor, toolMinor 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 maior toque possível que o dispositivo pode detectar. As menores
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 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 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 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 disponível, ele será definido como igual ao da ferramenta.
Os dispositivos com tela sensível ao toque medem ou informam o tamanho da tela 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 tamanho do toque e da ferramenta.
-
Se o valor for
none
, o tamanho será definido como zero. -
Se o valor for
geometric
, o tamanho será especificado nas mesmas unidades de superfície da posição, sendo 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 à área do toque ou da ferramenta. -
Se o valor for
default
, o sistema vai usar a calibração degeometric
se oraw.touchMajor
ouraw.toolMajor
está disponível. Caso contrário, usa da calibraçãonone
.
toque.tamanho.escala
Definição: touch.size.scale
= <um número de ponto flutuante não negativo>
Especifica um fator de escala constante usado na 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 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 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 como está.
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. Essa propriedade só pode ser definida como
1
para esses dispositivos. Se tiver dúvidas, 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 touchscreen como um valor normalizado entre 0,0 (sem toque) e 1,0 (pressão normal).
Uma pressão zero indica que a ferramenta está pairando.
touch.pressure.calibration
Definição: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Especifica o tipo de medição usado pelo driver de toque para informar a pressão.
-
Se o valor for
none
, a pressão será desconhecida e será definida como 1,0 ao tocar e 0,0 ao passar o cursor. -
Se o valor for
physical
, o eixo de pressão será usado para medir a intensidade física real da pressão aplicada ao touchpad. -
Se o valor for
amplitude
, o eixo de pressão será usado para 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 calibraçãophysical
se o eixo de pressão estiver disponível. Caso contrário, ele vai usarnone
.
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 calibração especificados.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
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 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 0
indica que a ferramenta é 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 será desconhecida, então será definida como 0. - Se o valor for
interpolated
, a orientação será interpolada linearmente, de modo que um valor bruto deraw.orientation.min
seja mapeado para-PI/2
e um valor bruto deraw.orientation.max
seja mapeado paraPI/2
. O valor central de(raw.orientation.min + raw.orientation.max) / 2
é mapeado para0
. - Se o valor for
vector
, a orientação será interpretada como um vetor compactado composto por dois campos de 4 bits assinados. Essa representação é usada em partes do protocolo baseado em objeto da Atmel. Quando decodificado, o vetor gera um ângulo de orientação e uma magnitude de confiança. A magnitude de confiança é usada para dimensionar as informações de tamanho, a menos que seja geométrico. - Se o valor for
default
, o sistema vai usar a calibraçãointerpolated
se o eixo de orientação estiver disponível. Caso contrário, ele vai usarnone
.
Cálculo
O cálculo dos campos orientation
e tilt
depende dos
parâmetros de calibração 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 "Distância"
O campo distance
descreve a distância entre a ferramenta e a superfície do dispositivo
táctil. 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 vai usar a calibraçãoscaled
se 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 calibração.
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 sobre compatibilidade
As propriedades de configuração para dispositivos com tela touch mudaram significativamente no Android Ice Cream Sandwich 4.0. Todos os arquivos de configuração de dispositivos de entrada para dispositivos touch precisam ser atualizados para usar as novas propriedades de configuração.
Talvez seja necessário atualizar os drivers de dispositivos com tela touch mais antigos.
Arquivos de mapa de teclas virtuais
Dispositivos com tela touch 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 usando as teclas de função, configurando os registros de firmware. Outras vezes, é desejável realizar o mapeamento das coordenadas de toque para códigos de teclas no software.
Quando as chaves virtuais são implementadas no software, o kernel precisa exportar um arquivo de mapa de chaves virtuais
chamado virtualkeys.<devicename>
como uma propriedade do tabuleiro. Por exemplo,
se os drivers do dispositivo de tela touchscreen informarem o nome como "touchyfeely",
o arquivo de mapa de chaves virtual precisará 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 touch.
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 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 sempre0x01
.- <Linux key code>: o código de chave do Linux da chave virtual.
- <centerX>: a coordenada X do pixel do centro da chave virtual.
- <centerY>: a coordenada Y do pixel do centro da tecla virtual.
- <width>: a largura da tecla 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
, centerY de 835
, largura de 90
e altura de
55
.
Exemplo
Arquivo de mapa de chaves 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 da tecla: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Arquivo de mapa de caracteres-chave: /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.
- Movimento de dois dedos, com os dedos se movendo um em direção ao outro ou se afastando em direções diferentes: mova/redimensione/gire a área ao redor do ponteiro. O ponteiro não se move.
- Movimento de 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 é 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 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
. O framework do Android remove as ponteiras marcadas como
mãos do fluxo de toque.
Se um ponteiro já tiver sido enviado aos apps, o sistema:
- (Se houver outros ponteiros ativos) cancela o ponteiro com
ACTION_POINTER_UP
. eFLAG_CANCELED
definido. - (Se for o único ponteiro) Cancela o ponteiro com
ACTION_CANCEL
.
Uma API pública, MotionEvent.FLAG_CANCELED
, indica que o evento
atual não deve acionar a ação do usuário. Essa flag é definida para ACTION_CANCEL
e ACTION_POINTER_UP
.
Se o ponteiro da palma não for enviado aos apps, o sistema simplesmente vai descartar o ponteiro.
Ativar a rejeição de palmas
- 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 oferecer suporte, 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 tempo de execução, execute:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Reinicie o processo
system_server
.$ adb shell stop && adb shell start
- Confirme se o
adb shell dumpsys input
mostra que há rejeidores de palma dentro da telaUnwantedInteractionBlocker
. 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: {} - 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