Google está empenhada em fazer avançar a equidade racial para as comunidades negras. Veja como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

dispositivos de toque

suportes Android uma variedade de telas sensíveis ao toque e almofadas de toque, incluindo tablets digitalizador baseada em caneta.

As telas de toque são dispositivos de toque que são associados com uma exposição de tal forma que o usuário tem a impressão de manipular os itens diretamente na tela.

almofadas de toque são dispositivos de toque que não estão associados com um visor tal como um comprimido digitalizador. almofadas de toque são tipicamente usados ​​para apontar ou para o posicionamento absoluto indirecta ou controlo baseado no gesto de uma interface de utilizador.

dispositivos sensíveis ao toque podem ter botões cujas funções são semelhantes aos botões do mouse.

dispositivos de toque às vezes pode ser manipulado usando uma variedade de ferramentas diferentes, tais como os dedos ou uma caneta, dependendo da tecnologia de sensor de toque subjacente.

dispositivos de toque são por vezes usados ​​para implementar teclas virtuais. Por exemplo, em alguns dispositivos Android, área do sensor de ecrã táctil se estende para além da borda da tela e serve finalidade dupla como parte de uma almofada sensível ao toque chave.

Devido à grande variedade de dispositivos de toque, Android depende de um grande número de propriedades de configuração para descrever as características e o comportamento desejado de cada dispositivo.

Toque Classificação do dispositivo

Um dispositivo de entrada é classificado como um dispositivo multi-touch, se ambas as seguintes condições são:

  • O dispositivo de entrada reporta a presença dos ABS_MT_POSITION_X e ABS_MT_POSITION_Y eixos absolutos.

  • O dispositivo de entrada não possui botões gamepad. Esta condição resolve uma ambigüidade com certos gamepads que os machados de relatório com códigos que se sobrepõe às dos eixos MT.

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

  • O dispositivo de entrada não é classificado como um dispositivo multi-toque. Um dispositivo de entrada ou é classificado como um dispositivo de um único toque ou como um dispositivo multi-toque, nunca ambos.

  • O dispositivo de entrada reporta a presença do ABS_X e ABS_Y eixos absolutos, e a presença do BTN_TOUCH código de chave.

Uma vez que um dispositivo de entrada foi classificada como um dispositivo sensível ao toque, a presença de teclas virtuais é determinada por tentar carregar o arquivo de mapa de chave virtual para o dispositivo. Se um mapa de chave virtual está disponível, então o arquivo de layout chave para o dispositivo também é carregado.

Consulte a seção abaixo sobre a localização eo formato dos arquivos de mapa de teclas virtuais.

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

Todos os built-in dispositivos de toque deve ter arquivos de configuração do dispositivo de entrada. Se nenhum arquivo de configuração do dispositivo de entrada está presente, o sistema vai escolher uma configuração padrão que é apropriado para periféricos toque de uso geral típicos, tais como USB externo ou telas sensíveis ao toque Bluetooth HID ou almofadas de toque. Esses padrões não são projetados para o resultado built-in telas sensíveis ao toque e será mais provável no comportamento incorreto.

Após a configuração do dispositivo de entrada de carregado, o sistema irá classificar o dispositivo de entrada como um ecrã de toque, a almofada de toque ou um dispositivo apontador.

  • Um dispositivo de tela de toque é usada para a manipulação direta de objetos na tela. Uma vez que o usuário está tocando diretamente a tela, o sistema não necessita de quaisquer affordances adicionais para indicar os objetos sendo manipulados.

  • Um dispositivo de almofada de toque é utilizado para proporcionar informação de posicionamento absoluto para uma aplicação sobre toques de um sensor de área dada. Pode ser útil para comprimidos digitalizadoras.

  • Um dispositivo apontador é utilizado para manipulação indirecta de objectos no ecrã usando um cursor. Dedos são interpretados como gestos ponteiro multi-touch. Outras ferramentas, como canetas, são interpretados usando posições absolutas.

    Veja indireta Multi-touch Pointer Gestos para mais informações.

As regras a seguir são usados para classificar o dispositivo de entrada, como um ecrã táctil, touch pad ou dispositivo apontador.

  • Se o touch.deviceType propriedade é definida, em seguida, o tipo de dispositivo irá ser definido como indicado.

  • Se o dispositivo de entrada reporta a presença do INPUT_PROP_DIRECT propriedade de entrada (através do EVIOCGPROP ioctl), em seguida, o tipo de dispositivo será definido como tela sensível ao toque. Esta condição assume que os dispositivos de entrada táctil directo estão ligados a um monitor que também é ligado.

  • Se o dispositivo de entrada reporta a presença do INPUT_PROP_POINTER propriedade de entrada (através do EVIOCGPROP ioctl), então o tipo de dispositivo será configurado para ponteiro.

  • Se o dispositivo de entrada reporta a presença dos REL_X ou REL_Y eixos relativos, em seguida, o tipo de dispositivo será definido como touch pad. Esta condição resolve uma ambiguidade para dispositivos de entrada, que consistem de ambos um rato e um teclado de toque. Neste caso, o touch pad não será usado para controlar o ponteiro porque o mouse já controla.

  • Caso contrário, o tipo de dispositivo será configurado para ponteiro. Este padrão garante que almofadas de toque que não tenham sido designados qualquer outra finalidade especial vai servir para controlar o ponteiro.

botões

Os botões são controles opcionais que podem ser utilizados pelos aplicativos para realizar funções adicionais. Botões em dispositivos sensíveis ao toque comportam de forma semelhante aos botões do mouse e são principalmente de uso com dispositivos de toque tipo ponteiro ou com um estilete.

Os botões a seguir são suportados:

  • BTN_LEFT : mapeado para MotionEvent.BUTTON_PRIMARY .

  • BTN_RIGHT : mapeado para MotionEvent.BUTTON_SECONDARY .

  • BTN_MIDDLE : mapeado para MotionEvent.BUTTON_MIDDLE .

  • BTN_BACK e BTN_SIDE : mapeado para MotionEvent.BUTTON_BACK . Ao pressionar este botão também sintetiza uma tecla com o código da chave KeyEvent.KEYCODE_BACK .

  • BTN_FORWARD e BTN_EXTRA : mapeado para MotionEvent.BUTTON_FORWARD . Ao pressionar este botão também sintetiza uma tecla com o código da chave KeyEvent.KEYCODE_FORWARD .

  • BTN_STYLUS : mapeado para MotionEvent.BUTTON_SECONDARY .

  • BTN_STYLUS2 : mapeado para MotionEvent.BUTTON_TERTIARY .

Ferramentas e tipos de ferramentas

Uma ferramenta é um dedo, o estilete ou outro aparelho que é utilizado para interagir com o dispositivo de toque. Alguns dispositivos de toque pode distinguir entre diferentes tipos de ferramentas.

Em outra parte em Android, como no MotionEvent API, uma ferramenta é muitas vezes referida como um ponteiro.

Os seguintes tipos de ferramentas são suportados:

  • BTN_TOOL_FINGER e MT_TOOL_FINGER : mapeado para MotionEvent.TOOL_TYPE_FINGER .

  • BTN_TOOL_PEN e MT_TOOL_PEN : mapeado para MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_RUBBER : mapeado para MotionEvent.TOOL_TYPE_ERASER .

  • BTN_TOOL_BRUSH : mapeado para MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_PENCIL : mapeado para MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_AIRBRUSH : mapeado para MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_MOUSE : mapeado para MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_LENS : mapeado para MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP e BTN_TOOL_QUADTAP : mapeado para MotionEvent.TOOL_TYPE_FINGER .

Pairando vs. Ferramentas Tocar

Ferramentas podem estar em contacto com o dispositivo de toque ou na faixa e pairando acima dela. Nem todos os dispositivos de toque são capazes de sentir a presença de um pairando ferramenta acima do dispositivo de toque. Aqueles que o fazem, como digitalizadores caneta baseados em RF, muitas vezes pode detectar quando a ferramenta está dentro de uma gama limitada do digitalizador.

O InputReader componente se encarrega de distinguir ferramentas tocantes de ferramentas pairando. Da mesma forma, tocando instrumentos e ferramentas pairando são relatados para aplicações de diferentes maneiras.

Ferramentas tocantes são relatados para aplicações como eventos de toque usando MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN e MotionEvent.ACTION_POINTER_UP .

Ferramentas que pairam são relatados para aplicações como eventos de movimento genéricos usando MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE e MotionEvent.ACTION_HOVER_EXIT .

Toque Requisitos de driver de dispositivo

  1. drivers de dispositivo de toque só deve registar eixos e códigos-chave para os eixos e botões que eles realmente suportar. Registrar eixos excesso ou códigos-chave pode confundir o algoritmo de classificação dispositivo ou fazer com que o sistema para detectar incorretamente as capacidades do dispositivo.

    Por exemplo, se o dispositivo informa o BTN_TOUCH código-chave, o sistema irá assumir que BTN_TOUCH sempre será usado para indicar se a ferramenta é realmente tocar na tela. Portanto, BTN_TOUCH não deve ser usado para indicar que a ferramenta é apenas na faixa e pairando.

  2. dispositivos de um único toque utilizar os seguintes eventos de entrada do Linux:

    • ABS_X : (obrigatório) Relatórios a coordenada X da ferramenta.

    • ABS_Y : (NECESSÁRIO) Informa o coordenada Y da ferramenta.

    • ABS_PRESSURE : (opcional) Informa o pressão física aplicada à ponta da ferramenta ou a intensidade do sinal do contacto táctil.

    • ABS_TOOL_WIDTH : (opcional) Relata a área transversal ou largura do contato físico ou da própria ferramenta.

    • ABS_DISTANCE : (opcional) Relatórios a distância da ferramenta a partir da superfície do dispositivo sensível ao toque.

    • ABS_TILT_X : (opcional) Informa o inclinação da ferramenta a partir da superfície do dispositivo de contacto ao longo do eixo X.

    • ABS_TILT_Y : (opcional) Informa o inclinação da ferramenta a partir da superfície do dispositivo de contacto 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) Relatórios botão estados.

    • 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) Relata o tipo de ferramenta .

  3. dispositivos multi-touch utilizar os seguintes eventos de entrada do Linux:

    • ABS_MT_POSITION_X : (obrigatório) Relatórios a coordenada X da ferramenta.

    • ABS_MT_POSITION_Y : (NECESSÁRIO) Informa o coordenada Y da ferramenta.

    • ABS_MT_PRESSURE : (opcional) Informa o pressão física aplicada à ponta da ferramenta ou a intensidade do sinal do contacto táctil.

    • ABS_MT_TOUCH_MAJOR : (opcional) Reports a área da secção transversal do contacto toque, ou o comprimento da maior dimensão do contacto táctil.

    • ABS_MT_TOUCH_MINOR : (opcional) Relatórios do comprimento da menor dimensão do contato físico. Este eixo não deve ser usado se ABS_MT_TOUCH_MAJOR está relatando uma medição da área.

    • ABS_MT_WIDTH_MAJOR : (opcional) Informa o área de secção transversal da própria ferramenta, ou o comprimento da maior dimensão da própria ferramenta. Este eixo não deve ser usado se as dimensões da ferramenta em si são desconhecidos.

    • ABS_MT_WIDTH_MINOR : (opcional) Relatórios do comprimento da menor dimensão da própria ferramenta. Este eixo não deve ser usado se ABS_MT_WIDTH_MAJOR está relatando uma medição de área ou se as dimensões da ferramenta em si são desconhecidos.

    • ABS_MT_ORIENTATION : (opcional) Relatórios a orientação da ferramenta.

    • ABS_MT_DISTANCE : (opcional) Relatórios a distância da ferramenta a partir da superfície do dispositivo sensível ao toque.

    • ABS_MT_TOOL_TYPE : (opcional) Relata o tipo de ferramenta como MT_TOOL_FINGER ou MT_TOOL_PEN .

    • ABS_MT_TRACKING_ID : (opcional) Relata o ID de rastreamento da ferramenta. O ID de acompanhamento é um número inteiro não negativo arbitrário que é utilizado para identificar e controlar cada ferramenta, independentemente, quando várias ferramentas estão activos. Por exemplo, quando vários dedos estão tocando o dispositivo, cada dedo deve ser atribuído um ID de rastreamento distinta que é usado enquanto os restos de dedo em contato. ids de rastreamento podem ser reutilizados quando suas ferramentas associadas mover fora do intervalo.

    • ABS_MT_SLOT : (opcional) Relata o número do estacionamento da ferramenta, quando se utiliza o Linux protocolo multi-touch 'B'. Consulte o multi-touch documentação do protocolo 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) Relatórios botão estados.

    • 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) Relata o tipo de ferramenta .

  4. Se os eixos, tanto para o único toque e protocolo multi-toque são definidos, em seguida, apenas os eixos multi-toque vai ser utilizado e os eixos de toque único será ignorado.

  5. Os valores mínimos e máximos dos ABS_X , ABS_Y , ABS_MT_POSITION_X e ABS_MT_POSITION_Y eixos definem os limites da área activa do dispositivo em unidades de superfície específicas do dispositivo. No caso de uma tela sensível ao toque, a área ativa descreve a parte do dispositivo de toque que realmente cobre o visor.

    Para um ecrã de toque, do sistema interpola automaticamente as posições de toque relatados em unidades de superfície para obter as posições de toque de visualização em pixels de acordo com o seguinte cálculo a:

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

    A tela sensível ao toque pode relatar toques fora da área ativa relatou.

    Toques que são iniciadas fora da área activa não são entregues para aplicações, mas pode ser usado para teclas virtuais.

    Toques que são iniciadas dentro da área activa, ou que entram e saem da área de exibição são entregues aos pedidos. Consequentemente, se um toque começa dentro dos limites de uma aplicação e, em seguida, se move fora da área ativo, o aplicativo pode receber eventos de toque com coordenadas de exibição que são negativas ou além dos limites da tela. Este é o comportamento esperado.

    Um dispositivo de toque nunca deve braçadeira tocar coordenadas para os limites da área ativa. Se um toque sai da área ativa, ele deve ser relatado como estando fora da área activa, ou não deve ser relatado em tudo.

    Por exemplo, se o dedo do usuário está tocando perto do canto superior esquerdo da tela sensível ao toque, ele pode relatar uma coordenada de (minX, Miny). Se o dedo continua a mover-se mais para fora da área activa, o ecrã táctil também deve iniciar relatando coordenadas com os componentes menos do que minX e MiNY, tais como (minX - 2, MiNY - 3), ou deve parar de enviar o toque completamente. Em outras palavras, o ecrã táctil não deve ser relatando (minX, Miny) quando o dedo do usuário é realmente tocante fora da área ativa.

    Aperto coordenadas de toque para a borda de exibição cria um limite rígido artificial em torno da borda da tela, que impede o sistema de rastreamento sem problemas movimentos que entrar ou sair dos limites da área de exibição.

  6. Os valores relatados por ABS_PRESSURE ou ABS_MT_PRESSURE , se eles são relatados em tudo, deve ser diferente de zero quando a ferramenta está tocando o dispositivo e zero caso contrário para indicar que a ferramenta está pairando.

    Divulgação de informações a pressão é opcional, mas altamente recomendável. Os aplicativos podem usar informações de pressão para implementar desenho sensível à pressão e outros efeitos.

  7. Os valores relatados por ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR , ou ABS_MT_WIDTH_MINOR deve ser diferente de zero, quando a ferramenta está a tocar no dispositivo e zero, caso contrário, mas isso não é necessário. Por exemplo, o dispositivo de toque pode ser capaz de medir o tamanho de contatos de toque do dedo, mas não contatos de toque da caneta.

    Relatórios informações de tamanho é opcional, mas altamente recomendável. Os aplicativos podem usar informações de pressão para implementar desenho sensível ao tamanho e outros efeitos.

  8. Os valores relatados por ABS_DISTANCE ou ABS_MT_DISTANCE deve se aproximar de zero quando a ferramenta está tocando o dispositivo. A distância pode permanecer não-zero mesmo quando a ferramenta está em contato direto. Os valores exatos relatados depende da maneira pela qual a medidas de hardware distância.

    Reporte de informação à distância é opcional, mas recomendado para dispositivos de caneta.

  9. Os valores relatados por ABS_TILT_X e ABS_TILT_Y deve ser zero quando a ferramenta é perpendicular ao dispositivo. Uma inclinação diferente de zero é tomado como uma indicação de que o instrumento é mantida com uma inclinação.

    Os ângulos de inclinação ao longo dos eixos X e Y são assumidos como especificado em graus a partir perpendicular. O ponto central (perfeitamente perpendicular) é dada por (max + min) / 2 para cada eixo. Valores menores que o ponto central representam uma inclinação para cima ou para a esquerda, valores maiores que o ponto central representam uma inclinação para baixo ou para a direita.

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

    Divulgação de informações de inclinação é opcional, mas recomendado para dispositivos de caneta.

  10. Se o tipo de ferramenta é relatado por ABS_MT_TOOL_TYPE , ele substituirá qualquer informação tipo de ferramenta relatado por BTN_TOOL_* . Se nenhuma informação tipo de ferramenta é acessível a todos, o tipo de ferramenta padrão para MotionEvent.TOOL_TYPE_FINGER .

  11. Uma ferramenta é determinada para ser activa com base nas seguintes condições:

    • Quando se utiliza o protocolo de um único toque, a ferramenta é activo se BTN_TOUCH , ou BTN_TOOL_* é 1.

      Esta condição implica que o InputReader precisa ter pelo menos alguma informação sobre a natureza da ferramenta, ou se se trata de tocar, ou pelo menos seu tipo de ferramenta. Se não há informação disponível, em seguida, a ferramenta é assumido como sendo inactivo (fora do intervalo).

    • Ao usar o protocolo multi-touch 'A', a ferramenta está ativa sempre que aparece no relatório sincronização mais recente. Quando a ferramenta pára de aparecer em relatórios de sincronização, ela deixa de existir.

    • Quando se utiliza o protocolo multi-toque 'B', a ferramenta é activa, desde que ele tem uma ranhura activo. Quando o slot clareou, a ferramenta deixa de existir.

  12. Uma ferramenta é determinada para ser pairar com base nas seguintes condições:

    • Se a ferramenta é BTN_TOOL_MOUSE ou BTN_TOOL_LENS , em seguida, a ferramenta não está pairando, mesmo se uma das seguintes condições forem verdadeiras.

    • Se a ferramenta estiver ativa eo motorista relata informações de pressão, ea pressão relatado é zero, então a ferramenta está pairando.

    • Se a ferramenta estiver ativa eo motorista suporta a BTN_TOUCH código chave e BTN_TOUCH tem um valor de zero, em seguida, a ferramenta está pairando.

  13. O InputReader suporta tanto o protocolo multi-toque 'A' e 'B'. Novos drivers devem usar o protocolo 'B' mas nem vai funcionar.

  14. A partir do Android Ice Cream Sandwich 4.0, os condutores de tela de toque pode precisar de ser alterada para cumprir com a especificação do protocolo de entrada Linux.

    Os seguintes alterações podem ser necessárias:

    • Quando uma ferramenta torna-se inativo (dedo vai "up"), ele deve parar de aparecer em relatórios subsequentes de sincronização multi-touch. Quando todas as ferramentas se tornam inativos (todos os dedos ir "para cima"), o condutor deve enviar um pacote relatório sincronização vazio, como SYN_MT_REPORT seguido por SYN_REPORT .

      As versões anteriores do Android esperado "up" eventos que devem ser comunicadas através do envio de um valor de pressão de 0. O comportamento antigo era incompatível com a especificação do protocolo de entrada Linux e não é mais suportado.

    • Pressão física ou informação de intensidade do sinal devem ser reportadas usando ABS_MT_PRESSURE .

      As versões anteriores do Android recuperado informações de pressão de ABS_MT_TOUCH_MAJOR . O comportamento anterior era incompatível com a especificação do protocolo de entrada Linux e já não é suportada.

    • Informações de toque de tamanho devem ser relatados usando ABS_MT_TOUCH_MAJOR .

      As versões anteriores do Android recuperado informações de tamanho a partir ABS_MT_TOOL_MAJOR . O comportamento anterior era incompatível com a especificação do protocolo de entrada Linux e já não é suportada.

    drivers de dispositivo de toque não precisa mais personalizações específicas do Android. Ao contar com o protocolo de entrada padrão Linux, Android pode suportar uma ampla variedade de periféricos de toque, como HID externa telas multi-touch de toque, usando drivers não modificados.

Dispositivo toque Operação

O seguinte é um resumo breve do funcionamento do dispositivo de toque em Android.

  1. O EventHub lê eventos brutos do evdev motorista.

  2. O InputReader consome os eventos brutos e atualiza o estado interno sobre a posição e outras características de cada ferramenta. Ele também rastreia estados de botão.

  3. Se os botões Voltar ou Avançar foram pressionado ou liberado, os InputReader notifica o InputDispatcher sobre o evento chave.

  4. O InputReader determina se uma tecla virtual ocorreu. Se assim for, ele notifica o InputDispatcher sobre o evento chave.

  5. O InputReader determina se o toque foi iniciado dentro dos limites da tela. Se assim for, ele notifica o InputDispatcher sobre o evento de toque.

  6. Se não há ferramentas tocantes, mas há pelo menos uma ferramenta pairando, os InputReader notifica o InputDispatcher sobre o evento hover.

  7. Se o tipo de dispositivo de toque é ponteiro, o InputReader detecção gesto ponteiro executa, move o ponteiro e manchas em conformidade e notifica o InputDispatcher sobre o evento ponteiro.

  8. O InputDispatcher usa o WindowManagerPolicy para determinar se os eventos devem ser despachados e se devem acordar o dispositivo. Em seguida, o InputDispatcher entrega os eventos para os aplicativos apropriados.

Configuração do dispositivo de toque

o comportamento do dispositivo de toque é determinado por eixos do dispositivo, botões, propriedades de entrada, configuração do dispositivo de entrada, mapa de chave virtual e layout chave.

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

propriedades

O sistema baseia-se em muitas propriedades de configuração do dispositivo de entrada para configurar e comportamento do dispositivo toque Calibrar.

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

Por exemplo, muitos dispositivos de toque medir a área de contacto do contacto, utilizando uma escala específica do dispositivo interno, tal como o número total de nodos de sensores que foram provocados pelo toque. Este valor tamanho bruta não seria significativo para aplicações porque eles precisam de saber sobre o tamanho físico e outras características dos nós sensores do dispositivo sensível ao toque.

Os parâmetros de usos do sistema de calibração codificados em arquivos de configuração do dispositivo de entrada para decodificar, transformar e normalizar os valores relatado pelo dispositivo de toque em uma representação padrão simples que os aplicativos podem entender.

Convenções da documentação

Para fins de documentação, vamos usar as seguintes convenções para descrever os valores utilizados pelo sistema durante o processo de calibração.

Valores do Eixo Raw

As seguintes expressões denotam os valores brutos relatados pelo driver de dispositivo touch como EV_ABS eventos.

raw.x
O valor do ABS_X ou ABS_MT_POSITION_X eixo.
raw.y
O valor do ABS_Y ou ABS_MT_POSITION_Y eixo.
raw.pressure
O valor da ABS_PRESSURE ou ABS_MT_PRESSURE eixo, ou 0 se não estiver disponível.
raw.touchMajor
O valor da ABS_MT_TOUCH_MAJOR eixo, ou 0 se não estiver disponível.
raw.touchMinor
O valor da ABS_MT_TOUCH_MINOR eixo ou raw.touchMajor se não estiver disponível.
raw.toolMajor
O valor da ABS_TOOL_WIDTH ou ABS_MT_WIDTH_MAJOR eixo, ou 0 se não estiver disponível.
raw.toolMinor
O valor da ABS_MT_WIDTH_MINOR eixo ou raw.toolMajor se não estiver disponível.
raw.orientation
O valor da ABS_MT_ORIENTATION eixo, ou 0 se não estiver disponível.
raw.distance
O valor da ABS_DISTANCE ou ABS_MT_DISTANCE eixo, ou 0 se não estiver disponível.
raw.tiltX
O valor da ABS_TILT_X eixo, ou 0 se não estiver disponível.
raw.tiltY
O valor da ABS_TILT_Y eixo, ou 0 se não estiver disponível.

Ranges Eixo Raw

As seguintes expressões indicam os limites de valores brutos. Eles são obtidos chamando EVIOCGABS ioctl para cada eixo.

raw.*.min
O valor mínimo inclusive do eixo cru.
raw.*.max
O valor máximo inclusive do eixo cru.
raw.*.range
Equivalente a raw.*.max - raw.*.min .
raw.*.fuzz
A precisão do eixo cru. por exemplo. fuzz = 1 implica valores são precisos para +/- 1 unidade.
raw.width
A largura inclusive da área de toque, o equivalente a raw.x.range + 1 .
raw.height
A altura inclusiva de área sensível ao toque, o que equivale a raw.y.range + 1 .

Os intervalos de saída

As seguintes expressões denotar as características da saída do sistema de coordenadas. Os usos sistema linear de interpolação para traduzir a informação de posição de toque a partir das unidades de superfície utilizados pelo dispositivo de toque para as unidades de saída que vai ser reportados para aplicações tais como visualização pixels.

output.width
A largura da saída. Para telas de toque (associadas com um visor), isto é a largura de exibição em pixels. Para almofadas de toque (não associados com um visor), a saída é igual a largura raw.width , indicando que nenhum interpolação será executada.
output.height
A altura de saída. Para telas de toque (associadas com um visor), esta é a altura de exibição em pixels. Para almofadas de toque (não associados com um visor), a altura de saída é igual raw.height , indicando que nenhum interpolação será executada.
output.diag
O comprimento da diagonal do sistema de coordenadas de saída, equivalente a sqrt(output.width ^2 + output.height ^2) .

Configuração básica

A entrada de toque mapeador usa muitas propriedades de configuração no arquivo de configuração do dispositivo de entrada para especificar os valores de calibração. A tabela seguinte descreve algumas propriedades gerais de configuração finalidade. Todas as outras propriedades são descritos nas secções que se seguem, juntamente com os campos que são utilizados para calibrar.

touch.deviceType

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

Especifica o tipo de dispositivo de toque.

  • Se o valor for touchScreen , o dispositivo de toque é uma tela de toque associado a um display.

  • Se o valor for touchPad , o dispositivo de toque é um touch pad não associado a um display.

  • Se o valor for pointer , o dispositivo de toque é um touch pad não associadas com uma exibição, e seus movimentos são usados para gestos ponteiro multi-touch indiretos .

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

Consulte a classificação seção para mais detalhes sobre como o tipo de dispositivo influencia o comportamento do dispositivo sensível ao toque.

Antes de favo de mel, foram assumidos todos os dispositivos de toque para ser telas sensíveis ao toque.

touch.orientationAware

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

Especifica se o dispositivo de toque deve reagir para exibir mudanças de orientação.

  • Se o valor é 1 , posições sensíveis ao toque relatados pelo dispositivo de toque são rodados sempre que as alterações de orientação do ecrã.

  • Se o valor é 0 , as posições de toque relatados pelo dispositivo de toque são imunes a variações de orientação do ecrã.

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

O sistema distingue entre telas e displays internos e externos sensíveis ao toque. Uma tela de toque interna orientação consciente é rodado com base na orientação do display interno. Uma tela de toque externo orientação consciente é rodado com base na orientação do monitor externo.

consciência orientação é utilizado para apoiar a rotação de telas de toque em dispositivos como o Nexus One. Por exemplo, quando o dispositivo é no sentido horário girada em 90 graus a partir da sua orientação natural, as posições absolutas de toques são redefinidas de tal modo que um toque no canto superior esquerdo do sistema de coordenadas absoluto do ecrã sensível ao toque é relatado como um toque no canto superior esquerdo canto do visor de girado sistema de coordenadas. Isto é feito para que os toques são relatados com o mesmo sistema de coordenadas que os aplicativos usam para desenhar os seus elementos visuais.

Antes de favo de mel, foram assumidos todos os dispositivos de toque para ser a orientação consciente.

touch.gestureMode

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

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

  • Se o valor for pointer , os gestos touch pad são apresentados por meio de um cursor semelhante a um ponteiro do mouse.

  • Se o valor for spots , os gestos touch pad são apresentados por uma âncora que representa o centróide do gesto e um conjunto de manchas circulares que representam a posição dos dedos individuais.

O valor padrão é pointer quando o INPUT_PROP_SEMI_MT propriedade de entrada é definida, ou spots de outra forma.

X e Y Campos

Os campos X e Y fornecer informação de posição para o centro da área de contacto.

Cálculo

O cálculo é simples: informação posicional do driver de toque é linearmente interpolados para a saída do sistema de coordenadas.

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 , Size Campos

Os TouchMajor e TouchMinor campos descrever as dimensões aproximadas da área de contacto em unidades de saída (pixels).

Os ToolMajor e ToolMinor campos descrever as dimensões aproximadas da ferramenta em si nas unidades de saída (pixels).

O Size campo descreve o tamanho normalizado do toque relação ao maior contato possível que o dispositivo de toque pode sentir. O tamanho normalizado menor possível é 0.0 (sem contacto, ou é incomensurável), e o maior tamanho possível normalizado é de 1,0 (área do sensor está saturado).

Quando tanto o comprimento e largura aproximada pode ser medido, em seguida, o TouchMajor campo especifica a dimensão mais longa e os TouchMinor especifica de campo a dimensão mais curta da área de contacto. Quando apenas o diâmetro aproximado da área de contacto pode ser medida, em seguida as TouchMajor e TouchMinor campos serão iguais.

Da mesma forma, o ToolMajor campo especifica a dimensão mais longa e o ToolMinor campo especifica a dimensão mais curta da área de secção transversal da ferramenta.

Se o tamanho do toque é indisponível, mas o tamanho da ferramenta está disponível, então o tamanho da ferramenta será definido igual ao tamanho toque. Por outro lado, se o tamanho da ferramenta não está disponível, mas o tamanho de toque está disponível, então o tamanho toque será definido igual ao tamanho da ferramenta.

dispositivos de toque medir ou relatar o tamanho de toque e tamanho da ferramenta de várias maneiras. A implementação actual suporta três tipos diferentes de medição: de diâmetro, de área, e a caixa delimitadora geométrico em unidades de superfície.

touch.size.calibration

Definição: touch.size.calibration = none | geometric | diameter | area | default

Especifica o tipo de medida usada pelo driver de toque para relatar o tamanho de toque e tamanho da ferramenta.

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

  • Se o valor é geometric , o tamanho é assumida para ser especificado nas mesmas unidades de superfície como a posição, pelo que é dimensionado da mesma maneira.

  • Se o valor é diameter , o tamanho é assumido ser proporcional ao diâmetro (largura) do toque ou ferramenta.

  • Se o valor for area , o tamanho é assumido ser proporcional à área do toque ou ferramenta.

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

touch.size.scale

Definição: touch.size.scale = <a non-negative flutuante number> ponto

Especifica um factor de escala constante utilizados na calibração.

O valor padrão é 1.0 .

touch.size.bias

Definição: touch.size.bias = <a non-negative flutuante number> ponto

Especifica um valor de polarização constante utilizados na calibração.

O valor padrão é 0.0 .

touch.size.isSummed

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

Especifica se o tamanho é relatada como a soma dos tamanhos de todos os contactos activos, ou é relatado individualmente para cada contacto.

  • Se o valor é 1 , o tamanho relatado será dividido pelo número de contactos antes da utilização.

  • Se o valor for 0 , o tamanho relatado será usado como é.

O valor padrão é 0 .

Alguns dispositivos de toque, particularmente dispositivos "Semi-MT" não pode distinguir as dimensões individuais de vários contatos para que eles relatam uma medição do tamanho que representa a sua área total ou largura. Esta propriedade só deve ser definido como 1 para esses dispositivos. Em caso de dúvida, definir este valor para 0 .

Cálculo

O cálculo do TouchMajor , TouchMinor , ToolMajor , ToolMinor e Size campos 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

Pressure campo

The Pressure field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (full force).

A zero pressure indicates that the tool is hovering.

touch.pressure.calibration

Definition: touch.pressure.calibration = none | physical | amplitude | default

Specifies the kind of measurement used by the touch driver to report the pressure.

  • If the value is none , the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.

  • If the value is physical , the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.

  • If the value is amplitude , the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.

  • If the value is default , the system uses the physical calibration if the pressure axis available, otherwise uses none .

touch.pressure.scale

Definition: touch.pressure.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 / raw.pressure.max .

Calculation

The calculation of the Pressure field depends on the specified calibration parameters.

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

Orientation and Tilt Fields

The Orientation field describes the orientation of the touch and tool as an angular measurement. An orientation of 0 indicates that the major axis is oriented vertically, -PI/2 indicates that the major axis is oriented to the left, PI/2 indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI or PI .

The Tilt field describes the inclination of the tool as an angular measurement. A tilt of 0 indicates that the tool is perpendicular to the surface. A tilt of PI/2 indicates that the tool is flat on the surface.

touch.orientation.calibration

Definition: touch.orientation.calibration = none | interpolated | vector | default

Specifies the kind of measurement used by the touch driver to report the orientation.

  • If the value is none , the orientation is unknown so it is set to 0.

  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .

  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.

  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Calculation

The calculation of the Orientation and Tilt fields depends on the specified calibration parameters and available input.

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

Distance Field

The Distance field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.

touch.distance.calibration

Definition: touch.distance.calibration = none | scaled | default

Specifies the kind of measurement used by the touch driver to report the distance.

  • If the value is none , the distance is unknown so it is set to 0.

  • If the value is scaled , the reported distance is multiplied by a constant scale factor.

  • If the value is default , the system uses the scaled calibration if the distance axis available, otherwise uses none .

touch.distance.scale

Definition: touch.distance.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Calculation

The calculation of the Distance field depends on the specified calibration parameters.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

Example

# 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 will 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

Compatibility Notes

The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.

Older touch device drivers may also need to be updated.

Virtual Key Map Files

Touch devices are often used to implement virtual keys.

There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.

When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename> as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely .

A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.

In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION ).

Syntax

A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.

Comment lines begin with '#' and continue to the end of the line.

Each virtual key is described by 6 colon-delimited components:

  • 0x01 : A version code. Must always be 0x01 .
  • <Linux key code>: The Linux key code of the virtual key.
  • <centerX>: The X pixel coordinate of the center of the virtual key.
  • <centerY>: The Y pixel coordinate of the center of the virtual key.
  • <width>: The width of the virtual key in pixels.
  • <height>: The height of the virtual key in pixels.

All coordinates and sizes are specified in terms of the display coordinate system.

Here is a virtual key map file all written on one line.

# 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

The same virtual key map file can also be written on multiple lines.

# 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

In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.

The first key has a Linux scan code of 158 ( KEY_BACK ), centerX of 55 , centerY of 835 , width of 90 and height of 55 .

Example

Virtual key map file: /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

Key layout file: /system/usr/keylayout/touchyfeely.kl .

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

Key character map file: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirect Multi-touch Pointer Gestures

In pointer mode, the system interprets the following gestures:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

  3. Single finger motion plus button presses: drag the pointer.

  4. Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.

  5. Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.

  6. Multiple finger motion: freeform gesture.

Further Reading

  1. Linux multi-touch protocol
  2. ENAC list of available multitouch devices on Linux