Android prend en charge une variété d'écrans et de tablettes tactiles, y compris les tablettes numériques à stylet.
Les écrans tactiles sont des appareils tactiles associés à un affichage de telle sorte que l'utilisateur a l'impression de manipuler directement des éléments à l'écran.
Les tablettes tactiles sont des appareils tactiles qui ne sont pas associés à un écran, comme une tablette numérisée. Les pavés tactiles sont généralement utilisés pour le pointage ou pour le positionnement indirect absolu ou le contrôle gestuel d'une interface utilisateur.
Les appareils tactiles peuvent avoir des boutons dont les fonctions sont similaires à celles des boutons de la souris.
Les appareils tactiles peuvent parfois être manipulés à l'aide de divers outils différents, tels que des doigts ou un stylet, en fonction de la technologie de capteur tactile sous-jacente.
Les appareils tactiles sont parfois utilisés pour implémenter des clés virtuelles. Par exemple, sur certains appareils Android, la zone du capteur de l'écran tactile s'étend au-delà du bord de l'écran et remplit une double fonction en tant que partie intégrante d'un clavier tactile.
En raison de la grande variété d’appareils tactiles, Android s’appuie sur un grand nombre de propriétés de configuration pour décrire les caractéristiques et le comportement souhaité de chaque appareil.
Classification des appareils tactiles
Un périphérique d'entrée est classé comme périphérique multi-touch si les deux conditions suivantes sont remplies :
- Le périphérique d'entrée signale la présence des axes absolus
ABS_MT_POSITION_X
etABS_MT_POSITION_Y
. - Le périphérique d'entrée n'a aucun bouton de manette de jeu. Cette condition résout une ambiguïté avec certaines manettes de jeu qui signalent des axes avec des codes qui chevauchent ceux des axes MT.
Un périphérique d'entrée est classé comme périphérique à simple pression si les deux conditions suivantes sont remplies :
- Le périphérique d'entrée n'est pas classé comme périphérique multi-touch. Un périphérique d'entrée est soit classé comme périphérique à une seule touche, soit comme périphérique multi-touch, jamais les deux.
- Le dispositif d'entrée signale la présence des axes absolus
ABS_X
etABS_Y
, ainsi que la présence du code cléBTN_TOUCH
.
Lorsqu'un périphérique d'entrée est classé comme périphérique tactile, la présence de touches virtuelles est déterminée en tentant de charger le fichier de mappage de touches virtuelles pour le périphérique. Si une carte de touches virtuelle est disponible, le fichier de disposition des touches du périphérique est également chargé. Reportez-vous à [Fichiers de mappage de touches virtuelles](#virtual-key-map-files) pour plus d'informations sur l'emplacement et le format de ces fichiers.
Ensuite, le système charge le fichier de configuration du périphérique d'entrée pour le périphérique tactile.
Tous les appareils tactiles intégrés doivent avoir des fichiers de configuration de périphérique d'entrée. Si aucun fichier de configuration du périphérique d'entrée n'est présent, le système choisit une configuration par défaut appropriée pour les périphériques tactiles à usage général tels que les écrans tactiles ou les tablettes tactiles externes USB ou Bluetooth HID. Ces valeurs par défaut ne sont pas conçues pour les écrans tactiles intégrés et peuvent entraîner un comportement incorrect.
Une fois la configuration du périphérique d'entrée chargée, le système classe le périphérique d'entrée comme un écran tactile , un pavé tactile ou un pointeur .
- Un appareil à écran tactile est utilisé pour la manipulation directe d’objets sur l’écran. L'utilisateur touche directement l'écran, le système n'a donc pas besoin de moyens supplémentaires pour indiquer les objets manipulés.
- Un dispositif à pavé tactile est utilisé pour fournir des informations de positionnement absolues à une application concernant les touches sur une zone de capteur donnée. Cela peut être utile pour les tablettes numériques.
- Un dispositif de pointeur est utilisé pour la manipulation indirecte d'objets sur l'écran à l'aide d'un curseur. Les doigts sont interprétés comme des gestes de pointeur multi-touch. D'autres outils, tels que les stylets, sont interprétés à l'aide de positions absolues. Voir Gestes du pointeur multi-touch indirects pour plus d’informations.
Les règles suivantes sont utilisées pour classer le périphérique d'entrée en tant qu'écran tactile, pavé tactile ou pointeur.
- Si la propriété
touch.deviceType
est définie, le type de périphérique est défini comme indiqué. - Si le périphérique d'entrée signale la présence de la propriété d'entrée
INPUT_PROP_DIRECT
(via l'ioctlEVIOCGPROP
), alors le type de périphérique est défini sur touch screen . Cette condition suppose que les périphériques tactiles à entrée directe sont connectés à un écran également connecté. - Si le périphérique d'entrée signale la présence de la propriété d'entrée
INPUT_PROP_POINTER
(via l'ioctlEVIOCGPROP
), alors le type de périphérique est défini sur pointer . - Si le périphérique d'entrée signale la présence des axes relatifs
REL_X
ouREL_Y
, alors le type de périphérique est défini sur Touch Pad . Cette condition résout une ambiguïté pour les périphériques d’entrée constitués à la fois d’une souris et d’un pavé tactile. Dans ce cas, le pavé tactile n'est pas utilisé pour contrôler le pointeur car la souris le contrôle déjà. - Sinon, le type de périphérique est défini sur pointeur . Cette valeur par défaut garantit que les pavés tactiles qui n'ont pas été désignés à d'autres fins spéciales contrôlent le pointeur.
Boutons
Les boutons sont des commandes facultatives que les applications peuvent utiliser pour exécuter des fonctions supplémentaires. Les boutons des appareils tactiles se comportent de la même manière que les boutons de la souris et sont principalement utilisés avec des appareils tactiles de type pointeur ou avec un stylet.
Les boutons suivants sont pris en charge :
-
BTN_LEFT
: mappé àMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: mappé àMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: mappé àMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
etBTN_SIDE
: mappés àMotionEvent.BUTTON_BACK
. Appuyer sur ce bouton synthétise également une pression sur une touche avec le code cléKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
etBTN_EXTRA
: mappés àMotionEvent.BUTTON_FORWARD
. Appuyer sur ce bouton synthétise également une pression sur une touche avec le code cléKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: mappé àMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: mappé àMotionEvent.BUTTON_TERTIARY
.
Outils et types d'outils
Un outil est un doigt, un stylet ou un autre appareil utilisé pour interagir avec le périphérique tactile. Certains appareils tactiles peuvent distinguer différents types d'outils.
Ailleurs dans Android, comme dans l'API MotionEvent
, un outil est souvent appelé pointeur .
Les types d'outils suivants sont pris en charge :
-
BTN_TOOL_FINGER
etMT_TOOL_FINGER
: mappés àMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
etMT_TOOL_PEN
: mappés àMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: mappé àMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: mappé àMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: mappé àMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: mappé àMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: mappé àMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: mappé àMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
etBTN_TOOL_QUADTAP
: mappés àMotionEvent.TOOL_TYPE_FINGER
.
Outils survolés ou tactiles
Les outils peuvent être soit en contact avec l'appareil tactile, soit à portée et planer au-dessus de celui-ci. Tous les appareils tactiles ne peuvent pas détecter la présence d'un outil survolant l'appareil tactile. Ceux qui le font, comme les numériseurs à stylet RF, peuvent souvent détecter lorsque l'outil se trouve dans une portée limitée du numériseur.
Le composant InputReader
distingue les outils tactiles des outils de survol. De même, les outils tactiles et les outils de survol sont signalés aux applications de différentes manières.
Les outils tactiles sont signalés aux applications en tant qu'événements tactiles à l'aide de MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
et MotionEvent.ACTION_POINTER_UP
.
Les outils de survol sont signalés aux applications en tant qu'événements de mouvement génériques à l'aide MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
et MotionEvent.ACTION_HOVER_EXIT
.
Configuration requise pour le pilote de périphérique tactile
- Les pilotes d'appareils tactiles doivent enregistrer uniquement les axes et les codes clés des axes et des boutons qu'ils prennent en charge. L'enregistrement d'axes ou de codes clés non pris en charge peut perturber l'algorithme de classification des appareils ou amener le système à détecter de manière incorrecte les capacités de l'appareil. Par exemple, si l'appareil signale le code clé
BTN_TOUCH
, le système suppose queBTN_TOUCH
est toujours utilisé pour indiquer si l'outil touche l'écran. Par conséquent,BTN_TOUCH
ne doit pas être utilisé pour indiquer que l'outil est simplement à portée et en vol stationnaire. - Les appareils à simple pression utilisent les événements d'entrée Linux suivants :
-
ABS_X
: (REQUIS) Rapporte la coordonnée X de l'outil. -
ABS_Y
: (REQUIS) Indique la coordonnée Y de l'outil. -
ABS_PRESSURE
: (facultatif) Rapporte la pression physique appliquée à la pointe de l'outil ou la force du signal du contact tactile. -
ABS_TOOL_WIDTH
: (facultatif) Indique la surface transversale ou la largeur du contact tactile ou de l'outil lui-même. -
ABS_DISTANCE
: (facultatif) Rapporte la distance de l'outil à la surface de l'appareil tactile. -
ABS_TILT_X
: (facultatif) Signale l'inclinaison de l'outil par rapport à la surface du périphérique tactile le long de l'axe X. -
ABS_TILT_Y
: (facultatif) Signale l'inclinaison de l'outil par rapport à la surface du périphérique tactile le long de l'axe Y. -
BTN_TOUCH
: (REQUIS) Indique si l'outil touche l'appareil. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (facultatif) Rapports sur les états du bouton . -
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
: (facultatif) Indique le type d'outil .
-
- Les appareils multi-touch utilisent les événements d'entrée Linux suivants :
-
ABS_MT_POSITION_X
: (REQUIS) Rapporte la coordonnée X de l'outil. -
ABS_MT_POSITION_Y
: (REQUIS) Rapporte la coordonnée Y de l'outil. -
ABS_MT_PRESSURE
: (facultatif) Rapporte la pression physique appliquée à la pointe de l'outil ou la force du signal du contact tactile. -
ABS_MT_TOUCH_MAJOR
: (facultatif) Indique la surface transversale du contact tactile ou la longueur de la dimension la plus longue du contact tactile. -
ABS_MT_TOUCH_MINOR
: (facultatif) Rapporte la longueur de la dimension la plus courte du contact tactile. Cet axe ne doit pas être utilisé siABS_MT_TOUCH_MAJOR
signale une mesure de surface. -
ABS_MT_WIDTH_MAJOR
: (facultatif) Indique la surface de la section transversale de l'outil lui-même, ou la longueur de la dimension la plus longue de l'outil lui-même. N'utilisez pas cet axe à moins de connaître les dimensions de l'outil lui-même. -
ABS_MT_WIDTH_MINOR
: (facultatif) Indique la longueur de la dimension la plus courte de l'outil lui-même. Cet axe ne doit pas être utilisé siABS_MT_WIDTH_MAJOR
rapporte une mesure de surface ou si les dimensions de l'outil lui-même sont inconnues. -
ABS_MT_ORIENTATION
: (facultatif) Rapporte l'orientation de l'outil. -
ABS_MT_DISTANCE
: (facultatif) Rapporte la distance de l'outil à la surface de l'appareil tactile. -
ABS_MT_TOOL_TYPE
: (facultatif) Indique le type d'outil commeMT_TOOL_FINGER
ouMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (facultatif) Signale l'ID de suivi de l'outil. L'ID de suivi est un entier arbitraire non négatif utilisé pour identifier et suivre chaque outil indépendamment lorsque plusieurs outils sont actifs. Par exemple, lorsque plusieurs doigts touchent l'appareil, chaque doigt doit se voir attribuer un identifiant de suivi distinct qui est utilisé tant que le doigt reste en contact. Les identifiants de suivi peuvent être réutilisés lorsque leurs outils associés sont hors de portée. -
ABS_MT_SLOT
: (facultatif) Indique l'ID d'emplacement de l'outil, lors de l'utilisation du protocole Linux multi-touch 'B'. Reportez-vous à la documentation du protocole Linux multi-touch pour plus de détails. -
BTN_TOUCH
: (REQUIS) Indique si l'outil touche l'appareil. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (facultatif) Rapports sur les états du bouton . -
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
: (facultatif) Indique le type d'outil .
-
- Si des axes pour les protocoles mono-touch et multi-touch sont définis, alors seuls les axes multi-touch sont utilisés et les axes mono-touch sont ignorés.
Les valeurs minimale et maximale des axes
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
etABS_MT_POSITION_Y
définissent les limites de la zone active de l'appareil en unités de surface spécifiques à l'appareil. Dans le cas d'un écran tactile, la zone active décrit la partie du périphérique tactile qui recouvre réellement l'écran.Pour un écran tactile, le système interpole automatiquement les positions tactiles signalées en unités de surface pour obtenir les positions tactiles en pixels d'affichage selon le calcul suivant :
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Un écran tactile peut signaler des contacts en dehors de la zone active signalée.
Les touches initiées en dehors de la zone active ne sont pas transmises aux applications mais peuvent être utilisées pour les touches virtuelles.
Les touches initiées à l'intérieur de la zone active, ou qui entrent et sortent de la zone d'affichage, sont transmises aux applications. Par conséquent, si un contact commence dans les limites d’une application puis se déplace en dehors de la zone active, l’application peut recevoir des événements tactiles avec des coordonnées d’affichage négatives ou au-delà des limites de l’affichage. Il s’agit d’un comportement attendu.
Un appareil tactile ne doit jamais limiter les coordonnées tactiles aux limites de la zone active. Si un contact sort de la zone active, il doit être signalé comme étant en dehors de la zone active, ou ne doit pas être signalé du tout.
Par exemple, si le doigt de l'utilisateur touche le coin supérieur gauche de l'écran tactile, il peut signaler une coordonnée de (minX, minY). Si le doigt continue de s'éloigner de la zone active, l'écran tactile doit soit commencer à signaler les coordonnées avec des composants inférieurs à minX et minY, tels que (minX - 2, minY - 3), soit cesser complètement de signaler le toucher. En d'autres termes, l'écran tactile ne doit pas signaler (minX, minY) lorsque le doigt de l'utilisateur touche réellement en dehors de la zone active.
Le fait de fixer les coordonnées tactiles au bord de l'écran crée une limite artificielle dure autour du bord de l'écran qui empêche le système de suivre en douceur les mouvements qui entrent ou sortent des limites de la zone d'affichage.
Les valeurs signalées par
ABS_PRESSURE
ouABS_MT_PRESSURE
, si elles sont signalées, doivent être différentes de zéro lorsque l'outil touche l'appareil et de zéro sinon pour indiquer que l'outil est en survol.La communication des informations sur la pression est facultative mais fortement recommandée. Les applications peuvent utiliser les informations de pression pour implémenter un dessin sensible à la pression et d'autres effets.
Les valeurs signalées par
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
ouABS_MT_WIDTH_MINOR
doivent être différentes de zéro lorsque l'outil touche l'appareil et de zéro dans le cas contraire, mais ce n'est pas obligatoire. Par exemple, l'appareil tactile peut être capable de mesurer la taille des contacts tactiles du doigt, mais pas des contacts tactiles du stylet.Les informations sur la taille des rapports sont facultatives mais fortement recommandées. Les applications peuvent utiliser les informations de pression pour implémenter des dessins sensibles à la taille et d'autres effets.
Les valeurs rapportées par
ABS_DISTANCE
ouABS_MT_DISTANCE
doivent se rapprocher de zéro lorsque l'outil touche l'appareil. La distance peut rester non nulle même lorsque l'outil est en contact direct. Les valeurs exactes indiquées dépendent de la manière dont le matériel mesure la distance.La communication des informations sur la distance est facultative mais recommandée pour les appareils à stylet.
Les valeurs rapportées par
ABS_TILT_X
etABS_TILT_Y
doivent être nulles lorsque l'outil est perpendiculaire à l'appareil. Une inclinaison non nulle indique que l'outil est tenu incliné.Les angles d'inclinaison le long des axes X et Y sont supposés être spécifiés en degrés par rapport à la perpendiculaire. Le point central (parfaitement perpendiculaire) est donné par
(max + min) / 2
pour chaque axe. Les valeurs inférieures au point central représentent une inclinaison vers le haut ou vers la gauche, les valeurs supérieures au point central représentent une inclinaison vers le bas ou vers la droite.InputReader
convertit les composants d'inclinaison X et Y en un angle d'inclinaison perpendiculaire allant de 0 àPI / 2
radians et un angle d'orientation planaire allant de-PI
àPI
radians. Cette représentation aboutit à une description de l'orientation compatible avec ce qui est utilisé pour décrire les touchers des doigts.La communication des informations d’inclinaison est facultative mais recommandée pour les appareils à stylet.
Si le type d'outil est signalé par
ABS_MT_TOOL_TYPE
, il remplace toute information sur le type d'outil signalée parBTN_TOOL_*
. Si aucune information sur le type d'outil n'est disponible, le type d'outil est par défautMotionEvent.TOOL_TYPE_FINGER
.Un outil est déterminé comme étant actif en fonction des conditions suivantes :
Lors de l'utilisation du protocole single-touch, l'outil est actif si
BTN_TOUCH
ouBTN_TOOL_*
vaut 1.Cette condition implique
InputReader
doit disposer d'au moins quelques informations sur la nature de l'outil, soit s'il est tactile, soit au moins son type d'outil. Si aucune information n'est disponible, alors l'outil est considéré comme inactif (hors de portée).- Lors de l'utilisation du protocole multi-touch « A », l'outil est actif chaque fois qu'il apparaît dans le rapport de synchronisation le plus récent. Lorsque l'outil cesse d'apparaître dans les rapports de synchronisation, il cesse d'exister.
- Lors de l'utilisation du protocole multi-touch « B », l'outil est actif tant qu'il dispose d'un emplacement actif. Lorsque l'emplacement est vidé, l'outil cesse d'exister.
- Un outil est déterminé comme étant en survol en fonction des conditions suivantes :
- Si l'outil est
BTN_TOOL_MOUSE
ouBTN_TOOL_LENS
, alors l'outil ne survole pas, même si l'une des conditions suivantes est vraie. - Si l'outil est actif et que le conducteur rapporte des informations sur la pression et que la pression signalée est nulle, alors l'outil est en survol.
- Si l'outil est actif et que le pilote prend en charge le code clé
BTN_TOUCH
et queBTN_TOUCH
a une valeur de zéro, alors l'outil est en survol.
- Si l'outil est
-
InputReader
prend en charge les protocoles multi-touch « A » et « B ». Les nouveaux pilotes doivent utiliser le protocole « B », mais l'un ou l'autre fonctionne. À partir d'Android 4.0, les pilotes d'écran tactile devront peut-être être modifiés pour se conformer à la spécification du protocole d'entrée Linux.
Les modifications suivantes peuvent être nécessaires :
Lorsqu'un outil devient inactif (le doigt monte vers le haut), il devrait cesser d'apparaître dans les rapports de synchronisation multi-touch suivants. Lorsque tous les outils deviennent inactifs (tous les doigts montent vers le haut), le pilote doit envoyer un paquet de rapport de synchronisation vide, tel que
SYN_MT_REPORT
suivi deSYN_REPORT
.Les versions précédentes d'Android s'attendaient à ce que les événements « up » soient signalés en envoyant une valeur de pression de 0. L'ancien comportement était incompatible avec la spécification du protocole d'entrée Linux et n'est plus pris en charge.
Les informations sur la pression physique ou la force du signal doivent être signalées à l'aide
ABS_MT_PRESSURE
.Les versions précédentes d'Android récupéraient les informations de pression à partir de
ABS_MT_TOUCH_MAJOR
. L'ancien comportement était incompatible avec la spécification du protocole d'entrée Linux et n'est plus pris en charge.- Les informations sur la taille tactile doivent être signalées à l'aide de
ABS_MT_TOUCH_MAJOR
.Les versions précédentes d'Android récupéraient les informations de taille à partir de
ABS_MT_TOOL_MAJOR
. L'ancien comportement était incompatible avec la spécification du protocole d'entrée Linux et n'est plus pris en charge.
Fonctionnement de l'appareil tactile
Ce qui suit est un bref résumé du fonctionnement de l'appareil tactile sur Android.
-
EventHub
lit les événements bruts du piloteevdev
. -
InputReader
consomme les événements bruts et met à jour l'état interne concernant la position et d'autres caractéristiques de chaque outil. Il suit également l'état des boutons. - Si BACK ou FORWARD a été enfoncé ou relâché,
InputReader
informeInputDispatcher
de l'événement clé. -
InputReader
détermine si une pression sur une touche virtuelle s'est produite. Si tel est le cas, il informeInputDispatcher
de l'événement clé. -
InputReader
détermine si le toucher a été initié dans les limites de l'écran. Si tel est le cas, il informeInputDispatcher
de l'événement tactile. - S'il n'y a pas d'outils tactiles mais qu'il y a au moins un outil de survol,
InputReader
informeInputDispatcher
de l'événement de survol. - Si le type de périphérique tactile est pointer ,
InputReader
effectue la détection des gestes du pointeur, déplace le pointeur et le repère en conséquence et informeInputDispatcher
de l'événement de pointeur. -
InputDispatcher
utiliseWindowManagerPolicy
pour déterminer si les événements doivent être distribués et s'ils doivent réveiller le périphérique. Ensuite,InputDispatcher
transmet les événements aux applications appropriées.
Configuration de l'appareil tactile
Le comportement du périphérique tactile est déterminé par les axes, les boutons, les propriétés d'entrée, la configuration du périphérique d'entrée, la configuration des touches virtuelles et la disposition des touches de l'appareil.
Reportez-vous aux sections suivantes pour plus de détails sur les fichiers qui participent à la configuration du clavier :
Propriétés
Le système s'appuie sur de nombreuses propriétés de configuration du périphérique d'entrée pour configurer et calibrer le comportement du périphérique tactile.
L'une des raisons à cela est que les pilotes de périphériques tactiles signalent souvent les caractéristiques des touches à l'aide d'unités spécifiques au périphérique.
Par exemple, de nombreux appareils tactiles mesurent la zone de contact tactile à l'aide d'une échelle interne spécifique à l'appareil, telle que le nombre total de nœuds de capteurs déclenchés par le toucher. Cette valeur de taille brute n'aurait pas de sens pour les applications, car elles auraient besoin de connaître la taille physique et d'autres caractéristiques des nœuds de capteur du périphérique tactile.
Le système utilise des paramètres d'étalonnage codés dans les fichiers de configuration du périphérique d'entrée pour décoder, transformer et normaliser les valeurs signalées par le périphérique tactile en une représentation standard plus simple que les applications peuvent comprendre.
Conventions documentaires
À des fins de documentation, nous utilisons les conventions suivantes pour décrire les valeurs utilisées par le système pendant le processus d'étalonnage.
Valeurs brutes des axes
Les expressions suivantes désignent les valeurs brutes signalées par le pilote du périphérique tactile en tant qu'événements EV_ABS
.
-
raw.x
- La valeur de l'axe
ABS_X
ouABS_MT_POSITION_X
. -
raw.y
- La valeur de l'axe
ABS_Y
ouABS_MT_POSITION_Y
. -
raw.pressure
- La valeur de l'axe
ABS_PRESSURE
ouABS_MT_PRESSURE
, ou 0 si non disponible. -
raw.touchMajor
- La valeur de l'axe
ABS_MT_TOUCH_MAJOR
, ou 0 si non disponible. -
raw.touchMinor
- La valeur de l'axe
ABS_MT_TOUCH_MINOR
, ouraw.touchMajor
si non disponible. -
raw.toolMajor
- La valeur de l'axe
ABS_TOOL_WIDTH
ouABS_MT_WIDTH_MAJOR
, ou 0 si non disponible. -
raw.toolMinor
- La valeur de l'axe
ABS_MT_WIDTH_MINOR
, ouraw.toolMajor
s'il n'est pas disponible. -
raw.orientation
- La valeur de l'axe
ABS_MT_ORIENTATION
, ou 0 si non disponible. -
raw.distance
- La valeur de l'axe
ABS_DISTANCE
ouABS_MT_DISTANCE
, ou 0 si non disponible. -
raw.tiltX
- La valeur de l'axe
ABS_TILT_X
, ou 0 si non disponible. -
raw.tiltY
- La valeur de l'axe
ABS_TILT_Y
, ou 0 si non disponible.
Plages d'axes brutes
Les expressions suivantes désignent les limites des valeurs brutes. Ils sont obtenus en appelant EVIOCGABS
ioctl pour chaque axe.
-
raw.*.min
- La valeur minimale inclusive de l'axe brut.
-
raw.*.max
- La valeur maximale inclusive de l’axe brut.
-
raw.*.range
- Équivalent à
raw.*.max - raw.*.min
. -
raw.*.fuzz
- La précision de l'axe brut. par exemple. fuzz = 1 implique que les valeurs sont précises à +/- 1 unité.
-
raw.width
- La largeur inclusive de la zone tactile, équivalente à
raw.x.range + 1
. -
raw.height
- La hauteur inclusive de la zone tactile, équivalente à
raw.y.range + 1
.
Plages de sortie
Les expressions suivantes désignent les caractéristiques du système de coordonnées en sortie. Le système utilise l'interpolation linéaire pour traduire les informations de position tactile des unités de surface utilisées par le périphérique tactile en unités de sortie qui sont signalées aux applications telles que les pixels d'affichage.
-
output.width
- La largeur de sortie. Pour les écrans tactiles (associés à un afficheur), il s'agit de la largeur d'affichage en pixels. Pour les tablettes tactiles (non associées à un écran), la largeur de sortie est égale
raw.width
, indiquant qu'aucune interpolation n'est effectuée. -
output.height
- La hauteur de sortie. Pour les écrans tactiles (associés à un afficheur), il s'agit de la hauteur d'affichage en pixels. Pour les tablettes tactiles (non associées à un écran), la hauteur de sortie est égale
raw.height
, indiquant qu'aucune interpolation n'est effectuée. -
output.diag
- La longueur diagonale du système de coordonnées de sortie, équivalente à
sqrt(output.width ^2 + output.height ^2)
.
Configuration de base
Le mappeur d'entrée tactile utilise de nombreuses propriétés de configuration dans le fichier de configuration du périphérique d'entrée pour spécifier les valeurs d'étalonnage. Le tableau suivant décrit certaines propriétés de configuration à usage général. Toutes les autres propriétés sont décrites dans les sections suivantes avec les champs qu'elles sont utilisées pour calibrer.
touch.deviceType
Définition : touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Spécifie le type de périphérique tactile.
Si la valeur est
touchScreen
, le périphérique tactile est un écran tactile associé à un écran.Si la valeur est
touchPad
, le périphérique tactile est un pavé tactile non associé à un écran.Si la valeur est
pointer
, le périphérique tactile est un pavé tactile non associé à un écran et ses mouvements sont utilisés pour les gestes indirects du pointeur multi-touch .Si la valeur est
default
, le système détecte automatiquement le type d'appareil selon l'algorithme de classification.
Reportez-vous à la section Classification pour plus de détails sur la manière dont le type d'appareil influence le comportement de l'appareil tactile.
Sous Android 3 et versions antérieures, tous les appareils tactiles étaient considérés comme des écrans tactiles.
touch.orientationAware
Définition : touch.orientationAware
= 0
| 1
Spécifie si le périphérique tactile doit réagir aux changements d'orientation de l'affichage.
Si la valeur est
1
, les positions tactiles signalées par le périphérique tactile pivotent chaque fois que l'orientation de l'affichage change.Si la valeur est
0
, les positions tactiles signalées par le périphérique tactile sont insensibles aux changements d'orientation de l'affichage.
La valeur par défaut est 1
si l'appareil est un écran tactile, 0
sinon.
Le système fait la distinction entre les écrans et écrans tactiles internes et externes. Un écran tactile interne sensible à l'orientation pivote en fonction de l'orientation de l'affichage interne. Un écran tactile externe sensible à l'orientation pivote en fonction de l'orientation de l'affichage externe.
La connaissance de l'orientation est utilisée pour prendre en charge la rotation des écrans tactiles sur des appareils comme le Nexus One. Par exemple, lorsque l'appareil pivote de 90 degrés dans le sens des aiguilles d'une montre par rapport à son orientation naturelle, les positions absolues des touches sont remappées de telle sorte qu'une touche dans le coin supérieur gauche du système de coordonnées absolues de l'écran tactile est signalée comme une touche dans le coin supérieur gauche. coin du système de coordonnées pivoté de l'écran. Ceci est fait pour que les touches soient signalées avec le même système de coordonnées que celui utilisé par les applications pour dessiner leurs éléments visuels.
Avant Honeycomb, tous les appareils tactiles étaient supposés prendre en compte l'orientation.
touch.gestureMode
Définition : touch.gestureMode
= pointer
| spots
| default
Spécifie le mode de présentation pour les gestes du pointeur. Cette propriété de configuration n'est pertinente que lorsque l'appareil tactile est de type pointeur .
Si la valeur est
pointer
, les gestes du pavé tactile sont présentés au moyen d'un curseur similaire au pointeur d'une souris.Si la valeur est
spots
, les gestes du pavé tactile sont présentés par une ancre qui représente le centre de gravité du geste et un ensemble de points circulaires qui représentent la position des doigts individuels.
La valeur par défaut est pointer
lorsque la propriété d'entrée INPUT_PROP_SEMI_MT
est définie, ou spots
dans le cas contraire.
Champs X et Y
Les champs X et Y fournissent des informations de position pour le centre de la zone de contact.
Calcul
Le calcul est simple : les informations de position provenant du pilote tactile sont interpolées linéairement dans le système de coordonnées de sortie.
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, champs de taille
Les champs touchMajor
et touchMinor
décrivent les dimensions approximatives de la zone de contact en unités de sortie (pixels).
Les champs toolMajor
et toolMinor
décrivent les dimensions approximatives de l' outil lui-même en unités de sortie (pixels).
Le champ size
décrit la taille normalisée du toucher par rapport au contact le plus grand possible que l'appareil tactile peut détecter. La plus petite taille normalisée possible est de 0,0 (pas de contact ou non mesurable) et la plus grande taille normalisée possible est de 1,0 (la zone du capteur est saturée).
Lorsque la longueur et la largeur approximatives peuvent être mesurées, le champ touchMajor
spécifie la dimension la plus longue et le champ touchMinor
spécifie la dimension la plus courte de la zone de contact. Lorsque seul le diamètre approximatif de la zone de contact peut être mesuré, les champs touchMajor
et touchMinor
sont égaux.
De même, le champ toolMajor
spécifie la dimension la plus longue et le champ toolMinor
spécifie la dimension la plus courte de la zone transversale de l'outil.
Si la taille tactile n'est pas disponible mais que la taille de l'outil est disponible, alors la taille de l'outil est définie de manière égale à la taille tactile. À l’inverse, si la taille de l’outil n’est pas disponible mais que la taille du toucher est disponible, alors la taille du toucher est définie de manière égale à la taille de l’outil.
Les appareils tactiles mesurent ou signalent la taille du toucher et la taille de l'outil de différentes manières. L'implémentation actuelle prend en charge trois types différents de mesures : le diamètre, la surface et le cadre de délimitation géométrique en unités de surface.
Définition : touch.size.calibration
= none
| geometric
| diameter
| area
| default
Spécifie le type de mesure utilisé par le pilote tactile pour signaler la taille du toucher et la taille de l'outil.
Si la valeur est
none
, la taille est définie sur zéro.Si la valeur est
geometric
, la taille est supposée être spécifiée dans les mêmes unités de surface que la position, elle est donc mise à l'échelle de la même manière.Si la valeur est
diameter
, la taille est supposée être proportionnelle au diamètre (largeur) du toucher ou de l'outil.Si la valeur est
area
, la taille est supposée être proportionnelle à la zone du toucher ou de l'outil.Si la valeur est
default
, le système utilise le calibragegeometric
si l'axeraw.touchMajor
ouraw.toolMajor
est disponible, sinon il utilise le calibragenone
.
touch.size.scale
Définition : touch.size.scale
= <un nombre à virgule flottante non négatif>
Spécifie un facteur d’échelle constant utilisé dans l’étalonnage.
La valeur par défaut est 1.0
.
touch.size.bias
Définition : touch.size.bias
= <un nombre à virgule flottante non négatif>
Spécifie une valeur de biais constante utilisée dans l'étalonnage.
La valeur par défaut est 0.0
.
touch.size.isSummed
Définition : touch.size.isSummed
= 0
| 1
Spécifie si la taille est signalée comme la somme des tailles de tous les contacts actifs ou si elle est signalée individuellement pour chaque contact.
Si la valeur est
1
, la taille signalée est divisée par le nombre de contacts avant utilisation.Si la valeur est
0
, la taille signalée est utilisée telle quelle.
La valeur par défaut est 0
.
Certains appareils tactiles, en particulier les appareils « Semi-MT », ne peuvent pas distinguer les dimensions individuelles de plusieurs contacts et indiquent donc une mesure de taille qui représente leur surface ou largeur totale. Cette propriété ne doit être définie que sur 1
pour de tels appareils. En cas de doute, définissez cette valeur sur 0
.
Calcul
Le calcul des champs touchMajor
, touchMinor
, toolMajor
, toolMinor
et size
dépend des paramètres d'étalonnage spécifiés.
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
champ de pression
Le champ pressure
décrit la pression physique approximative appliquée au périphérique tactile sous la forme d'une valeur normalisée comprise entre 0,0 (pas de contact) et 1,0 (pression normale).
Une pression nulle indique que l'outil est en vol stationnaire.
étalonnage.de.pression.toucher
Définition : touch.pressure.calibration
= none
| physical
| amplitude
| default
Spécifie le type de mesure utilisé par le pilote tactile pour signaler la pression.
Si la valeur est
none
, la pression est inconnue, elle est donc réglée sur 1,0 au toucher et 0,0 en survol.Si la valeur est
physical
, l'axe de pression est supposé mesurer l'intensité physique réelle de la pression appliquée sur le pavé tactile.Si la valeur est
amplitude
, l'axe de pression est supposé mesurer l'amplitude du signal, qui est liée à la taille du contact et à la pression appliquée.Si la valeur est
default
, le système utilise l'étalonnagephysical
si l'axe de pression est disponible, sinon il n'en utilisenone
.
touch.pression.échelle
Définition : touch.pressure.scale
= <un nombre à virgule flottante non négatif>
Spécifie un facteur d'échelle constant utilisé dans l'étalonnage.
La valeur par défaut est 1.0 / raw.pressure.max
.
Calcul
Le calcul du champ pressure
dépend des paramètres d'étalonnage spécifiés.
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
champs d'orientation et d'inclinaison
Le champ orientation
décrit l'orientation du toucher et de l'outil comme une mesure angulaire. Une orientation de 0
indique que l'axe majeur est orienté verticalement, -PI/2
indique que l'axe majeur est orienté vers la gauche, PI/2
indique que l'axe principal est orienté vers la droite. Lorsqu'un outil de stylet est présent, la plage d'orientation peut être décrite dans une plage de cercle complet de -PI
ou PI
.
Le champ tilt
décrit l'inclinaison de l'outil comme une mesure angulaire. Une inclinaison de 0
indique que l'outil est perpendiculaire à la surface. Une inclinaison de PI/2
indique que l'outil est plat sur la surface.
touch.orientation.calibration
Définition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Spécifie le type de mesure utilisé par le pilote tactile pour signaler l'orientation.
- Si la valeur n'est
none
, l'orientation est inconnue, elle est donc définie sur 0. - Si la valeur est
interpolated
, l'orientation est interpolée linéairement de telle sorte qu'une valeur brute deraw.orientation.min
orientation.min mapes à-PI/2
et une valeur brute deraw.orientation.max
maps àPI/2
. La valeur centrale de(raw.orientation.min + raw.orientation.max) / 2
cartes à0
. - Si la valeur est
vector
, l'orientation est interprétée comme un vecteur emballé constituant deux champs 4 bits signés. Cette représentation est utilisée sur des pièces de protocole basées sur les objets Atmel. Lorsqu'il est décodé, le vecteur crée un angle d'orientation et une magnitude de confiance. L'amplitude de confiance est utilisée pour mettre à l'échelle les informations de taille, sauf si elle est géométrique. - Si la valeur est
default
, le système utilise l'étalonnageinterpolated
si l'axe d'orientation disponible, sinon n'en utilisenone
.
Calcul
Le calcul des champs d' orientation
et tilt
dépend des paramètres d'étalonnage spécifiés et de l'entrée disponible.
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
champ de distance
Le champ distance
décrit la distance entre l'outil et la surface du dispositif tactile. Une valeur de 0,0 indique un contact direct et des valeurs plus grandes indiquent une distance croissante de la surface.
Touch.Distance.Calibration
Définition: touch.distance.calibration
= none
| scaled
| default
Spécifie le type de mesure utilisé par le pilote tactile pour signaler la distance.
Si la valeur n'est
none
, la distance est inconnue, elle est donc définie sur 0.Si la valeur est
scaled
, la distance rapportée est multipliée par un facteur d'échelle constant.Si la valeur est
default
, le système utilise l'étalonnagescaled
si l'axe de distance disponible, sinon n'en utilisenone
.
Touch.Distance.Scale
Définition: touch.distance.scale
= <Numéro de point flottant non négatif>
Spécifie un facteur d'échelle constant utilisé dans l'étalonnage.
La valeur par défaut est 1.0
.
Calcul
Le calcul du champ distance
dépend des paramètres d'étalonnage spécifiés.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Exemple
# 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
Notes de compatibilité
Les propriétés de configuration des périphériques Touch ont considérablement changé dans Android Ice Cream Sandwich 4.0. Tous les fichiers de configuration des périphériques d'entrée pour les périphériques tactiles doivent être mis à jour pour utiliser les nouvelles propriétés de configuration.
Les anciens pilotes de périphérique Touch pourraient également devoir être mis à jour.
Fichiers de cartes clés virtuels
Les appareils tactiles peuvent être utilisés pour implémenter des clés virtuelles.
Il existe plusieurs façons de le faire, selon les capacités du contrôleur tactile. Certains contrôleurs tactiles peuvent être directement configurés pour implémenter les touches souples en définissant les registres du micrologiciel. D'autres fois, il est souhaitable d'effectuer le mappage des coordonnées tactiles aux codes clés du logiciel.
Lorsque les clés virtuelles sont implémentées dans le logiciel, le noyau doit exporter un fichier de carte de clé virtuelle appelée virtualkeys.<devicename>
en tant que propriété de la carte. Par exemple, si les pilotes de périphérique à écran tactile signalent son nom comme "touchyfeely", le fichier de carte de clé virtuelle doit avoir le chemin /sys/board_properties/virtualkeys.touchyfeely
.
Un fichier de carte de clé virtuelle décrit les coordonnées et les codes de clés Linux des touches virtuelles sur l'écran tactile.
En plus du fichier de carte de clé virtuelle, il doit y avoir un fichier de disposition de clé et un fichier de caractéristiques de caractéristiques de clé correspondant pour mapper les codes de clé Linux sur les codes de clé Android et pour spécifier le type de périphérique clavier (généralement SPECIAL_FUNCTION
).
Syntaxe
Un fichier de carte de clé virtuelle est un fichier texte brut composé d'une séquence de descriptions de mise en page virtuelle de la clé soit séparée par Newlines ou par Colons.
Les lignes de commentaires commencent par «#» et continuent jusqu'à la fin de la ligne.
Chaque clé virtuelle est décrite par 6 composants délimités par le côlon:
-
0x01
: un code de version. Doit toujours être0x01
. - <Code de clé Linux>: le code de clé Linux de la touche virtuelle.
- <Neentrex>: La coordonnée X pixel du centre de la clé virtuelle.
- <Centery>: La coordonnée des pixels Y du centre de la clé virtuelle.
- <largeur>: la largeur de la clé virtuelle dans les pixels.
- <hauteur>: la hauteur de la clé virtuelle dans les pixels.
Toutes les coordonnées et tailles sont spécifiées en termes de système de coordonnées d'affichage.
Voici un fichier de carte de clé virtuelle tous écrits sur une seule ligne.
# 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
Le même fichier de carte de clé virtuelle peut également être écrit sur plusieurs lignes.
# 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
Dans l'exemple ci-dessus, l'écran tactile a une résolution de 480x800. En conséquence, toutes les clés virtuelles ont une coordonnée <enter> de 835, ce qui est un peu en dessous de la zone visible de l'écran tactile.
La première touche a un code de numérisation Linux de 158
( KEY_BACK
), CenterX de 55
, centrer de 835
, largeur de 90
et hauteur de 55
.
Exemple
Fichier de carte de clé virtuelle: /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
Fichier de mise en page de clé: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Fichier de carte des caractères clés: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gestes de pointeur multi-touch indirects
En mode pointeur, le système interprète les gestes suivants:
- Appuyez sur un seul doigt: cliquez.
- Mouvement unique: déplacez le pointeur.
- Appuyez sur le bouton MOTION PLUS SOINGE: Faites glisser le pointeur.
- Deux doigts de doigt les deux doigts se déplaçant dans la même direction: faites glisser la zone sous le pointeur dans cette direction. Le pointeur lui-même ne bouge pas.
- Deux doigts de doigt les deux doigts se déplaçant l'un vers l'autre ou l'un de l'autre dans des directions différentes: Pan / échelle / tournez la zone entourant le pointeur. Le pointeur lui-même ne bouge pas.
- Motion des doigts multiples: geste de forme libre.
Rejet de palme
À partir d'Android 13, le système peut rejeter automatiquement les entrées de Palms lorsque le cadre intégré est activé. Les solutions internes et personnalisées sont toujours prises en charge, bien qu'elles puissent devoir être modifiées pour retourner l'indicateur TOOL_TYPE_PALM
lorsqu'un palmier est détecté. Le cadre intégré fonctionne également en conjonction avec des solutions personnalisées.
Le modèle réel examine les 90 premiers ms de données de gestes, sur le pointeur actuel, et aux pointeurs environnants, puis considère à quelle distance du bord d'affichage des touches. Il détermine alors, sur une base par pointeur, laquelle des pointeurs est des palmiers. Il prend également en compte la taille de chaque contact, comme indiqué par touchMajor
et touchMinor
. Le framework Android supprime ensuite les pointeurs qui sont marqués comme des paumes du flux tactile.
Si un pointeur était déjà envoyé aux applications, alors le système soit:
- (S'il y a d'autres pointeurs actifs) annule le pointeur avec
ACTION_POINTER_UP
etFLAG_CANCELED
Set. - (S'il s'agit du seul pointeur) annule le pointeur avec
ACTION_CANCEL
.
Une API publique, MotionEvent.FLAG_CANCELED
, indique que l'événement actuel ne doit pas déclencher l'action utilisateur. Cet drapeau est défini pour ACTION_CANCEL
et ACTION_POINTER_UP
.
Si le pointeur de palmier n'a pas été envoyé aux applications, le système laisse simplement tomber le pointeur.
Activer le rejet de la paume
- Dans votre pilote tactile, utilisez la macro
input_abs_set_res
pour définir les résolutions pour les champs suivants (les unités sont des pixels par mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
La prise en charge de
ABS_MT_TOUCH_MINOR
est facultative. Cependant, si votre appareil le prend en charge, assurez-vous que la résolution est correctement définie. -
- Pour confirmer que les champs sont définis correctement, exécutez:
$ adb shell getevent -li
- Pour activer la fonctionnalité pendant l'exécution, exécutez:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Redémarrez le processus
system_server
.$ adb shell stop && adb shell start
- Confirmez que
adb shell dumpsys input
montre qu'il y a des rejecteurs de palme à l'intérieurUnwantedInteractionBlocker
. Si ce n'est pas le cas, vérifiez les journaux liés à l'entrée pour trouver des indices sur ce qui pourrait être mal configuré.Voir l'exemple suivant pour référence:
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: {} - Pour activer définitivement la fonctionnalité, ajoutez la commande sysprop correspondante dans votre fichier
init**rc
:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
Lectures complémentaires
,Android prend en charge une variété d'écrans tactiles et de pads tactiles, y compris des tablettes de numériseur basées sur le stylet.
Les écrans tactiles sont des périphériques tactiles associés à un affichage de telle sorte que l'utilisateur a l'impression de manipuler directement les éléments à l'écran.
Les pavés tactiles sont des dispositifs tactiles qui ne sont pas associés à un écran, comme une tablette de numériseur. Les pavés tactiles sont généralement utilisés pour le pointage ou pour le positionnement indirect absolu ou le contrôle des gestes d'une interface utilisateur.
Les appareils tactiles peuvent avoir des boutons dont les fonctions sont similaires aux boutons de la souris.
Les appareils tactiles peuvent parfois être manipulés en utilisant une variété d'outils différents tels que les doigts ou un stylet en fonction de la technologie de capteur tactile sous-jacente.
Les appareils tactiles sont parfois utilisés pour implémenter des clés virtuelles. Par exemple, sur certains appareils Android, la zone du capteur de l'écran tactile s'étend au-delà du bord de l'écran et sert à double usage dans le cadre d'un pavé de clé sensible tactile.
En raison de la grande variété de périphériques tactiles, Android s'appuie sur un grand nombre de propriétés de configuration pour décrire les caractéristiques et le comportement souhaité de chaque appareil.
Classification des périphériques tactiles
Un périphérique d'entrée est classé comme un périphérique multi-touch si les deux conditions suivantes sont contenues:
- Le périphérique d'entrée rapporte la présence des axes absolus
ABS_MT_POSITION_X
etABS_MT_POSITION_Y
. - Le périphérique d'entrée n'a pas de boutons GamePad. Cette condition résout une ambiguïté avec certains manetons de jeu qui rapportent des axes avec des codes qui chevauchent ceux des axes MT.
Un périphérique d'entrée est classé comme un dispositif à contact unique si les deux conditions suivantes sont contenues:
- Le périphérique d'entrée n'est pas classé comme un périphérique multi-touch. Un périphérique d'entrée est soit classé comme un appareil unique ou comme un appareil multi-touch, jamais les deux.
- Le périphérique d'entrée rapporte la présence des axes absolus
ABS_X
etABS_Y
et la présence du code de cléBTN_TOUCH
.
Lorsqu'un périphérique d'entrée est classé comme un périphérique tactile, la présence de touches virtuelles est déterminée en essayant de charger le fichier de carte de la touche virtuelle pour le périphérique. Si une carte de clé virtuelle est disponible, le fichier de disposition des touches pour l'appareil est également chargé. Reportez-vous à [Virtual Key Map Fichiers] (# virtual-key-map-files) pour plus d'informations sur l'emplacement et le format de ces fichiers.
Ensuite, le système charge le fichier de configuration du périphérique d'entrée pour le périphérique tactile.
Tous les périphériques tactiles intégrés doivent avoir des fichiers de configuration de périphérique d'entrée. Si aucun fichier de configuration de périphérique d'entrée n'est présent, le système choisit une configuration par défaut qui est appropriée pour les périphériques tactiles à usage général tels que les écrans tactiles HID ou Bluetooth ou les pads tactiles Bluetooth. Ces valeurs par défaut ne sont pas conçues pour les écrans tactiles intégrés et peuvent entraîner un comportement incorrect.
Une fois la configuration du périphérique d'entrée chargé, le système classe le périphérique d'entrée sous forme d' écran tactile , de pad tactile ou de périphérique de pointeur .
- Un périphérique à écran tactile est utilisé pour la manipulation directe des objets à l'écran. L'utilisateur touche directement l'écran, de sorte que le système ne nécessite aucune offre supplémentaire pour indiquer les objets manipulés.
- Un dispositif tactile est utilisé pour fournir des informations de positionnement absolues à une application sur les touches sur une zone de capteur donnée. Il peut être utile pour les comprimés de numérisation.
- Un dispositif de pointeur est utilisé pour la manipulation indirecte des objets à l'écran à l'aide d'un curseur. Les doigts sont interprétés comme des gestes de pointeur multi-touch. D'autres outils, tels que les styles, sont interprétés à l'aide de positions absolues. Voir les gestes indirects de pointeur multi-touch pour plus d'informations.
Les règles suivantes sont utilisées pour classer le périphérique d'entrée comme un écran tactile, un pad tactile ou un périphérique de pointeur.
- Si la propriété
touch.deviceType
est définie, le type de périphérique est défini comme indiqué. - Si le périphérique d'entrée signale la présence de la propriété d'entrée
INPUT_PROP_DIRECT
(viaEVIOCGPROP
IOCTL), le type de périphérique est défini sur l'écran tactile . Cette condition suppose que les périphériques tactiles d'entrée directe sont fixés à un écran qui est également connecté. - Si le périphérique d'entrée signale la présence de la propriété d'entrée
INPUT_PROP_POINTER
(viaEVIOCGPROP
IOCTL), alors le type de périphérique est défini sur Pointer . - Si le périphérique d'entrée signale la présence des axes relatifs
REL_X
ouREL_Y
, le type de périphérique est défini sur le pad . Cette condition résout une ambiguïté pour les dispositifs d'entrée qui se composent à la fois d'une souris et d'un pavé tactile. Dans ce cas, le pavé tactile n'est pas utilisé pour contrôler le pointeur car la souris la contrôle déjà. - Sinon, le type de périphérique est défini sur pointeur . Cette valeur par défaut garantit que les pads tactiles qui n'ont été désignés aucun autre objectif spécial contrôlent le pointeur.
Boutons
Les boutons sont des contrôles facultatifs que les applications peuvent utiliser pour effectuer des fonctions supplémentaires. Les boutons sur les appareils tactiles se comportent de la même manière que les boutons de la souris et sont principalement utilisés avec des appareils tactiles de type pointeur ou avec un stylet.
Les boutons suivants sont pris en charge:
-
BTN_LEFT
: mappé àMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: Mapted toMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: mappé surMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
etBTN_SIDE
: mappé versMotionEvent.BUTTON_BACK
. Appuyez sur ce bouton Synthétise également une touche Appuyez avec le code de cléKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
etBTN_EXTRA
: mappé versMotionEvent.BUTTON_FORWARD
. Appuyez sur ce bouton Synthétise également une touche Appuyez sur le code de cléKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: Mappé àMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: mappé àMotionEvent.BUTTON_TERTIARY
.
Outils et types d'outils
Un outil est un doigt, un stylet ou un autre appareil qui est utilisé pour interagir avec le dispositif tactile. Certains appareils tactiles peuvent faire la distinction entre différents types d'outils.
Ailleurs dans Android, comme dans l'API MotionEvent
, un outil est souvent appelé pointeur .
Les types d'outils suivants sont pris en charge:
-
BTN_TOOL_FINGER
etMT_TOOL_FINGER
: MAPPED TOMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
etMT_TOOL_PEN
: mappé àMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_RUBBER
: MAPPED TOMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: mappé àMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_PENCIL
: mappé surMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_AIRBRUSH
: mappé àMotionEvent.TOOL_TYPE_STYLUS
. -
BTN_TOOL_MOUSE
: mappé surMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_LENS
: mappé surMotionEvent.TOOL_TYPE_MOUSE
. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
etBTN_TOOL_QUADTAP
: mappé àMotionEvent.TOOL_TYPE_FINGER
.
Outils en planant versus versus touchants
Les outils peuvent être en contact avec le dispositif tactile ou dans la plage et planant au-dessus. Tous les appareils tactiles ne peuvent pas détecter la présence d'un outil qui plane au-dessus du dispositif tactile. Ceux qui font, comme les numériseurs de stylet basés sur RF, peuvent souvent détecter quand l'outil se situe dans une plage limitée du numériseur.
Le composant InputReader
distingue les outils de touche des outils de survol. De même, les outils de touche et les outils sur volage sont signalés sur les applications de différentes manières.
Les outils de touche sont signalés aux applications en tant qu'événements tactiles en utilisant MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
et MotionEvent.ACTION_POINTER_UP
.
Les outils de survol sont signalés aux applications comme événements de mouvement génériques à l'aide MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
et MotionEvent.ACTION_HOVER_EXIT
.
Exigences du pilote de dispositif.
- Les pilotes de périphérique touchés doivent enregistrer uniquement les axes et les codes clés pour les axes et les boutons qu'ils prennent en charge. L'enregistrement des axes ou des codes de clés non pris en charge peut confondre l'algorithme de classification des périphériques ou entraîner une détection incorrecte du système des capacités de l'appareil. Par exemple, si le périphérique rapporte le code de clé
BTN_TOUCH
, le système suppose queBTN_TOUCH
est toujours utilisé pour indiquer si l'outil touche l'écran. Par conséquent,BTN_TOUCH
ne doit pas être utilisé pour indiquer que l'outil est simplement dans la plage et planant. - Les périphériques à contact unique utilisent les événements d'entrée Linux suivants:
-
ABS_X
: (requis) rapporte la coordonnée x de l'outil. -
ABS_Y
: (requis) rapporte la coordonnée y de l'outil. -
ABS_PRESSURE
: (Facultatif) rapporte la pression physique appliquée à la pointe de l'outil ou la résistance du signal du contact tactile. -
ABS_TOOL_WIDTH
: (Facultatif) rapporte la zone de coupe transversale ou la largeur du contact tactile ou de l'outil lui-même. -
ABS_DISTANCE
: (Facultatif) rapporte la distance de l'outil de la surface du dispositif tactile. -
ABS_TILT_X
: (Facultatif) rapporte l'inclinaison de l'outil à partir de la surface du périphérique tactile le long de l'axe x. -
ABS_TILT_Y
: (Facultatif) rapporte l'inclinaison de l'outil à partir de la surface du dispositif tactile le long de l'axe Y. -
BTN_TOUCH
: (requis) indique si l'outil touche l'appareil. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (Facultatif) Rapports States du bouton . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
BTN_TOOL_MOUSE
BTN_TOOL_RUBBER
,BTN_TOOL_PENCIL
BTN_TOOL_QUADTAP
BTN_TOOL_AIRBRUSH
,BTN_TOOL_BRUSH
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
) Type d'BTN_TOOL_LENS
.
-
- Les périphériques multi-touch utilisent les événements d'entrée Linux suivants:
-
ABS_MT_POSITION_X
: (requis) rapporte la coordonnée x de l'outil. -
ABS_MT_POSITION_Y
: (requis) rapporte la coordonnée y de l'outil. -
ABS_MT_PRESSURE
: (Facultatif) rapporte la pression physique appliquée à la pointe de l'outil ou la résistance du signal du contact tactile. -
ABS_MT_TOUCH_MAJOR
: (Facultatif) Signale la zone transversale du contact tactile, ou la longueur de la dimension plus longue du contact tactile. -
ABS_MT_TOUCH_MINOR
: (Facultatif) rapporte la longueur de la dimension plus courte du contact tactile. Cet axe ne doit pas être utilisé siABS_MT_TOUCH_MAJOR
signale une mesure de zone. -
ABS_MT_WIDTH_MAJOR
: (Facultatif) rapporte la zone transversale de l'outil lui-même, ou la longueur de la dimension plus longue de l'outil lui-même. N'utilisez pas cet axe à moins que vous ne connaissiez les dimensions de l'outil lui-même. -
ABS_MT_WIDTH_MINOR
: (Facultatif) rapporte la longueur de la dimension plus courte de l'outil lui-même. Cet axe ne doit pas être utilisé siABS_MT_WIDTH_MAJOR
rapporte une mesure de zone ou si les dimensions de l'outil lui-même sont inconnues. -
ABS_MT_ORIENTATION
: (Facultatif) rapporte l'orientation de l'outil. -
ABS_MT_DISTANCE
: (Facultatif) rapporte la distance de l'outil de la surface du périphérique tactile. -
ABS_MT_TOOL_TYPE
: (Facultatif) Signale le type d'outil commeMT_TOOL_FINGER
ouMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (Facultatif) rapporte l'ID de suivi de l'outil. L'ID de suivi est un entier arbitraire non négatif qui est utilisé pour identifier et suivre chaque outil indépendamment lorsque plusieurs outils sont actifs. Par exemple, lorsque plusieurs doigts touchent l'appareil, chaque doigt doit se voir attribuer un ID de suivi distinct qui est utilisé tant que le doigt reste en contact. Les identifiants de suivi peuvent être réutilisés lorsque leurs outils associés s'éloignent de la plage. -
ABS_MT_SLOT
: (Facultatif) rapporte l'ID de l'emplacement de l'outil, lors de l'utilisation du protocole Linux Multi-Touch 'B'. Reportez-vous à la documentation du protocole multi-touch Linux pour plus de détails. -
BTN_TOUCH
: (requis) indique si l'outil touche l'appareil. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (Facultatif) Rapports States du bouton . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
BTN_TOOL_MOUSE
BTN_TOOL_RUBBER
,BTN_TOOL_PENCIL
BTN_TOOL_QUADTAP
BTN_TOOL_AIRBRUSH
,BTN_TOOL_BRUSH
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
) Type d'BTN_TOOL_LENS
.
-
- Si des axes pour le protocole à touche unique et multi-touch sont définis, seuls les axes multi-touch sont utilisés et les axes à touche unique sont ignorés.
Les valeurs minimales et maximales des axes
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
etABS_MT_POSITION_Y
définissent les limites de la zone active du dispositif dans les unités de surface spécifiques au dispositif. Dans le cas d'un écran tactile, la zone active décrit la partie du périphérique tactile qui couvre réellement l'affichage.Pour un écran tactile, le système interpole automatiquement les positions tactiles rapportées dans les unités de surface pour obtenir des positions tactiles dans les pixels d'affichage selon le calcul suivant:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Un écran tactile peut signaler des touches en dehors de la zone active signalée.
Les touches initiées en dehors de la zone active ne sont pas livrées aux applications mais peuvent être utilisées pour les clés virtuelles.
Les touches initiées à l'intérieur de la zone active, ou qui entrent et sortent de la zone d'affichage sont livrées aux applications. Par conséquent, si un toucher commence dans les limites d'une application, puis se déplace à l'extérieur de la zone active, l'application peut recevoir des événements tactiles avec des coordonnées d'affichage négatives ou au-delà des limites de l'écran. Il s’agit d’un comportement attendu.
Un dispositif tactile ne doit jamais serrer les coordonnées tactiles aux limites de la zone active. Si une touche quitte la zone active, elle doit être signalée comme étant en dehors de la zone active, ou elle ne doit pas du tout être signalée.
Par exemple, si le doigt de l'utilisateur touche près du coin supérieur gauche de l'écran tactile, il pourrait signaler une coordonnée de (Minx, Miny). Si le doigt continue de se déplacer plus loin en dehors de la zone active, l'écran tactile doit soit commencer à signaler les coordonnées avec des composants inférieurs à Minx et Miny, comme (Minx - 2, Miny - 3), ou il doit cesser de signaler complètement le toucher. En d'autres termes, l'écran tactile ne doit pas être signalé (Minx, Miny) lorsque le doigt de l'utilisateur se touche vraiment à l'extérieur de la zone active.
Les coordonnées tactiles de serrage au bord de l'affichage créent une limite dure artificielle autour du bord de l'écran qui empêche le système de suivre en douceur les mouvements qui entrent ou quittent les limites de la zone d'affichage.
Les valeurs rapportées par
ABS_PRESSURE
ouABS_MT_PRESSURE
, si elles sont signalées, doivent être non nulles lorsque l'outil touche le périphérique et zéro autrement pour indiquer que l'outil plane.Les informations sur la pression de rapport sont facultatives mais fortement recommandées. Les applications peuvent utiliser des informations sur la pression pour mettre en œuvre le dessin sensible à la pression et d'autres effets.
Les valeurs rapportées par
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
ouABS_MT_WIDTH_MINOR
doivent être non nul lorsque l'outil touche le périphérique et zéro autrement, mais cela n'est pas nécessaire. Par exemple, le dispositif tactile peut être en mesure de mesurer la taille des contacts tactiles du doigt mais pas des contacts tactiles du stylet.Les informations sur la taille du rapport sont facultatives mais fortement recommandées. Les applications peuvent utiliser des informations sur la pression pour implémenter le dessin sensible à la taille et d'autres effets.
Les valeurs rapportées par
ABS_DISTANCE
ouABS_MT_DISTANCE
doivent s'approcher de zéro lorsque l'outil touche le périphérique. La distance peut rester non nulle même lorsque l'outil est en contact direct. Les valeurs exactes rapportées dépendent de la manière dont le matériel mesure la distance.Les informations sur la distance de rapport sont facultatives mais recommandées pour les appareils Stylus.
Les valeurs rapportées par
ABS_TILT_X
etABS_TILT_Y
doivent être nulles lorsque l'outil est perpendiculaire à l'appareil. Une inclinaison non nulle indique que l'outil est maintenu à une pente.Les angles d'inclinaison le long des axes x et y sont supposés être spécifiés en degrés de perpendiculaire. Le point central (parfaitement perpendiculaire) est donné par
(max + min) / 2
pour chaque axe. Les valeurs plus petites que le point central représentent une inclinaison vers le haut ou vers la gauche, les valeurs plus grandes que le point central représentent une inclinaison vers le bas ou vers la droite.InputReader
convertit les composants x et y incliné en un angle d'inclinaison perpendiculaire allant de 0 à des radiansPI / 2
et un angle d'orientation planaire allant de-PI
aux radiansPI
. Cette représentation se traduit par une description de l'orientation compatible avec ce qui est utilisé pour décrire les touches des doigts.La déclaration des informations d'inclinaison est facultative mais recommandée pour les appareils Stylus.
Si le type d'outil est signalé par
ABS_MT_TOOL_TYPE
, il remplace les informations de type d'outil rapportées parBTN_TOOL_*
. Si aucune information de type d'outil n'est disponible, le type d'outil par défaut est par défaut deMotionEvent.TOOL_TYPE_FINGER
.Un outil est déterminé comme actif en fonction des conditions suivantes:
Lorsque vous utilisez le protocole unique, l'outil est actif si
BTN_TOUCH
, ouBTN_TOOL_*
est 1.Cette condition implique que
InputReader
doit avoir au moins quelques informations sur la nature de l'outil, que ce soit pour toucher, soit au moins son type d'outil. Si aucune information n'est disponible, l'outil est supposé inactif (hors de portée).- Lorsque vous utilisez le protocole multi-touch «A», l'outil est actif chaque fois qu'il apparaît dans le rapport de synchronisation le plus récent. Lorsque l'outil s'arrête d'apparaître dans les rapports de synchronisation, il cesse d'exister.
- Lorsque vous utilisez le protocole multi-touch 'B', l'outil est actif tant qu'il a une fente active. Lorsque la fente qu'il s'est effondrée, l'outil cesse d'exister.
- Un outil est déterminé à planer en fonction des conditions suivantes:
- Si l'outil est
BTN_TOOL_MOUSE
ouBTN_TOOL_LENS
, l'outil ne plane pas, même si l'une des conditions suivantes est vraie. - Si l'outil est actif et que le conducteur rapporte des informations sur la pression et que la pression signalée est nulle, l'outil oscille.
- Si l'outil est actif et que le pilote prend en charge le code de clé
BTN_TOUCH
et queBTN_TOUCH
a une valeur de zéro, alors l'outil oscille.
- Si l'outil est
-
InputReader
prend en charge les deux protocoles multi-touch 'A' et 'B'. Les nouveaux pilotes doivent utiliser le protocole «B» mais fonctionne l'un ou l'autre. À partir d'Android 4.0, les pilotes à écran tactile peuvent devoir être modifiés pour se conformer à la spécification du protocole d'entrée Linux.
Les modifications suivantes peuvent être nécessaires:
Lorsqu'un outil devient inactif (le doigt va "up"), il doit arrêter d'apparaître dans les rapports de synchronisation multi-touch ultérieurs. Lorsque tous les outils deviennent inactifs (tous les doigts vont "up"), le pilote doit envoyer un paquet de rapport de synchronisation vide, tel que
SYN_MT_REPORT
suivi deSYN_REPORT
.Les versions précédentes d'Android s'attendaient à ce que les événements "UP" soient signalés en envoyant une valeur de pression de 0. L'ancien comportement était incompatible avec la spécification du protocole d'entrée Linux et n'est plus pris en charge.
Des informations sur la pression physique ou la résistance du signal doivent être signalées à l'aide
ABS_MT_PRESSURE
.Les versions précédentes d'Android ont récupéré les informations de pression d'
ABS_MT_TOUCH_MAJOR
. L'ancien comportement était incompatible avec la spécification du protocole d'entrée Linux et n'est plus pris en charge.- Les informations sur la taille du toucher doivent être rapportées à l'aide d'
ABS_MT_TOUCH_MAJOR
.Les versions précédentes d'Android ont récupéré les informations de taille d'
ABS_MT_TOOL_MAJOR
. L'ancien comportement était incompatible avec la spécification du protocole d'entrée Linux et n'est plus pris en charge.
Fonctionnement du périphérique tactile
Ce qui suit est un bref résumé de l'opération de périphérique tactile sur Android.
-
EventHub
lit les événements bruts du piloteevdev
. -
InputReader
consomme les événements bruts et met à jour l'état interne sur la position et les autres caractéristiques de chaque outil. Il suit également les états des bouton. - Si le dos ou l'avant a été enfoncé ou libéré,
InputReader
avertitInputDispatcher
sur l'événement de clé. -
InputReader
détermine si une appuye sur une touche virtuelle s'est produite. Si c'est le cas, il informeInputDispatcher
sur l'événement clé. -
InputReader
détermine si le toucher a été initié dans les limites de l'affichage. Si c'est le cas, il informeInputDispatcher
sur l'événement tactile. - S'il n'y a pas d'outils de contact mais qu'il y a au moins un outil de survol,
InputReader
informeInputDispatcher
sur l'événement de survol. - Si le type de périphérique tactile est le pointeur ,
InputReader
effectue une détection du geste du pointeur, déplace le pointeur et les tache en conséquence et aviseInputDispatcher
sur l'événement du pointeur. -
InputDispatcher
utiliseWindowManagerPolicy
pour déterminer si les événements doivent être envoyés et s'ils doivent réveiller l'appareil. Ensuite,InputDispatcher
livre les événements aux applications appropriées.
Configuration de l'appareil tactile
Le comportement de l'appareil tactile est déterminé par les axes, les boutons, les propriétés d'entrée de l'appareil, la configuration de l'appareil d'entrée, la carte de clé virtuelle et la disposition des touches.
Reportez-vous aux sections suivantes pour plus de détails sur les fichiers qui participent à la configuration du clavier:
Propriétés
Le système s'appuie sur de nombreuses propriétés de configuration du périphérique d'entrée pour configurer et calibrer le comportement du périphérique tactile.
L'une des raisons est que les pilotes de périphériques pour les périphériques Touch rapportent souvent les caractéristiques des touches à l'aide d'unités spécifiques à l'appareil.
Par exemple, de nombreux dispositifs tactiles mesurent la zone de contact tactile à l'aide d'une échelle interne spécifique au périphérique, comme le nombre total de nœuds de capteur qui ont été déclenchés par le toucher. Cette valeur de taille brute ne serait pas significative pour les applications car elles auraient besoin de connaître la taille physique et les autres caractéristiques des nœuds du capteur de dispositif tactile.
Le système utilise des paramètres d'étalonnage codés dans les fichiers de configuration du périphérique d'entrée pour décoder, transformer et normaliser les valeurs rapportées par le périphérique tactile en une représentation standard plus simple que les applications peuvent comprendre.
Conventions documentaires
À des fins de documentation, nous utilisons les conventions suivantes pour décrire les valeurs utilisées par le système pendant le processus d'étalonnage.
Valeurs de l'axe brut
Les expressions suivantes indiquent les valeurs brutes rapportées par le pilote de périphérique tactile sous forme d'événements EV_ABS
.
-
raw.x
- La valeur de l'axe
ABS_X
ouABS_MT_POSITION_X
. -
raw.y
- La valeur de l'axe
ABS_Y
ouABS_MT_POSITION_Y
. -
raw.pressure
- La valeur de l'axe
ABS_PRESSURE
ouABS_MT_PRESSURE
, ou 0 si elle n'est pas disponible. -
raw.touchMajor
- La valeur de l'axe
ABS_MT_TOUCH_MAJOR
, ou 0 si elle n'est pas disponible. -
raw.touchMinor
- La valeur de l'axe
ABS_MT_TOUCH_MINOR
, ouraw.touchMajor
si elle n'est pas disponible. -
raw.toolMajor
- La valeur de l'axe
ABS_TOOL_WIDTH
ouABS_MT_WIDTH_MAJOR
, ou 0 si elle n'est pas disponible. -
raw.toolMinor
- La valeur de l'axe
ABS_MT_WIDTH_MINOR
, ouraw.toolMajor
si elle n'est pas disponible. -
raw.orientation
- La valeur de l'axe
ABS_MT_ORIENTATION
, ou 0 si elle n'est pas disponible. -
raw.distance
- La valeur de l'axe
ABS_DISTANCE
ouABS_MT_DISTANCE
, ou 0 si elle n'est pas disponible. -
raw.tiltX
- La valeur de l'axe
ABS_TILT_X
, ou 0 si elle n'est pas disponible. -
raw.tiltY
- La valeur de l'axe
ABS_TILT_Y
, ou 0 si elle n'est pas disponible.
Plages de l'axe brut
Les expressions suivantes indiquent les limites des valeurs brutes. Ils sont obtenus en appelant EVIOCGABS
ioctl pour chaque axe.
-
raw.*.min
- La valeur minimale inclusive de l'axe brut.
-
raw.*.max
- La valeur maximale inclusive de l'axe brut.
-
raw.*.range
- Équivalent à
raw.*.max - raw.*.min
. -
raw.*.fuzz
- La précision de l'axe brut. par exemple. Fuzz = 1 implique que les valeurs sont précises à +/- 1 unité.
-
raw.width
- La largeur inclusive de la zone de contact, équivalente à
raw.x.range + 1
. -
raw.height
- La hauteur inclusive de la zone de touche, équivalente à
raw.y.range + 1
.
Gammes de sortie
Les expressions suivantes indiquent les caractéristiques du système de coordonnées de sortie. Le système utilise une interpolation linéaire pour traduire les informations de position tactile des unités de surface utilisées par le périphérique tactile dans les unités de sortie qui sont signalées aux applications telles que les pixels d'affichage.
-
output.width
- La largeur de sortie. For touch screens (associated with a display), this is the display width in pixels. For touch pads (not associated with a display), the output width equals
raw.width
, indicating that no interpolation is performed. -
output.height
- The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals
raw.height
, indicating that no interpolation is performed. -
output.diag
- The diagonal length of the output coordinate system, equivalent to
sqrt(output.width ^2 + output.height ^2)
.
Configuration de base
The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.
touch.deviceType
Definition: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Specifies the touch device type.
If the value is
touchScreen
, the touch device is a touch screen associated with a display.If the value is
touchPad
, the touch device is a touch pad not associated with a display.If the value is
pointer
, the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .If the value is
default
, the system automatically detects the device type according to the classification algorithm.
Refer to the Classification section for more details about how the device type influences the behavior of the touch device.
In Android 3 and lower, all touch devices were assumed to be touch screens.
touch.orientationAware
Definition: touch.orientationAware
= 0
| 1
Specifies whether the touch device should react to display orientation changes.
If the value is
1
, touch positions reported by the touch device are rotated whenever the display orientation changes.If the value is
0
, touch positions reported by the touch device are immune to display orientation changes.
The default value is 1
if the device is a touch screen, 0
otherwise.
The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.
Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.
Prior to Honeycomb, all touch devices were assumed to be orientation aware.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
| default
Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .
If the value is
pointer
, the touch pad gestures are presented by way of a cursor similar to a mouse pointer.If the value is
spots
, the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.
The default value is pointer
when the INPUT_PROP_SEMI_MT
input property is set, or spots
otherwise.
X and Y fields
The X and Y fields provide positional information for the center of the contact area.
Calcul
The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.
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 fields
The touchMajor
and touchMinor
fields describe the approximate dimensions of the contact area in output units (pixels).
The toolMajor
and toolMinor
fields describe the approximate dimensions of the tool itself in output units (pixels).
The size
field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).
When both the approximate length and breadth can be measured, then the touchMajor
field specifies the longer dimension and the touchMinor
field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor
and touchMinor
fields are equal.
Likewise, the toolMajor
field specifies the longer dimension and the toolMinor
field specifies the shorter dimension of the tool's cross-sectional area.
If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.
Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.
Definition: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Specifies the kind of measurement used by the touch driver to report the touch size and tool size.
If the value is
none
, the size is set to zero.If the value is
geometric
, the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.If the value is
diameter
, the size is assumed to be proportional to the diameter (width) of the touch or tool.If the value is
area
, the size is assumed to be proportional to the area of the touch or tool.If the value is
default
, the system uses thegeometric
calibration if theraw.touchMajor
orraw.toolMajor
axis is available, otherwise it uses thenone
calibration.
touch.size.scale
Definition: touch.size.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
touch.size.bias
Definition: touch.size.bias
= <a non-negative floating point number>
Specifies a constant bias value used in the calibration.
The default value is 0.0
.
touch.size.isSummed
Definition: touch.size.isSummed
= 0
| 1
Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.
If the value is
1
, the reported size is divided by the number of contacts prior to use.If the value is
0
, the reported size is used as is.
The default value is 0
.
Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1
for such devices. If in doubt, set this value to 0
.
Calcul
The calculation of the touchMajor
, touchMinor
, toolMajor
, toolMinor
, and size
fields depends on the specified calibration parameters.
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 field
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 (normal pressure).
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 thephysical
calibration if the pressure axis available, otherwise usesnone
.
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
.
Calcul
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 can 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 ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
. - 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 theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calcul
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 thescaled
calibration if the distance axis available, otherwise usesnone
.
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
.
Calcul
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
Exemple
# 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
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 might also need to be updated.
Virtual key map files
Touch devices can be 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
).
Syntaxe
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 be0x01
. - <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
.
Exemple
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:
- Single finger tap: click.
- Single finger motion: move the pointer.
- Single finger motion plus button presses: drag the pointer.
- 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.
- 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.
- Multiple finger motion: freeform gesture.
Rejet de palme
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor
and touchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
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: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1