Appareil tactile

Android est compatible avec divers écrans et pavés tactiles, y compris tablettes numériques avec stylet.

Les écrans tactiles sont des appareils tactiles associés à un écran de sorte que : l'utilisateur a l'impression de manipuler directement les éléments à l'écran.

Les pavés tactiles sont des appareils tactiles qui ne sont associés à aucun écran, comme un tablette numérique. Les pavés tactiles sont généralement utilisés pour pointer ou pour le positionnement indirect absolu ou le contrôle par gestes d'une interface utilisateur.

Les appareils tactiles peuvent avoir des boutons dont les fonctions sont semblables à celles des boutons de la souris.

Les appareils tactiles peuvent parfois être manipulés à l'aide de divers outils comme 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 touches virtuelles. Par exemple, sur Sur certains appareils Android, la zone du capteur de l'écran tactile s'étend au-delà du bord l'écran et sert à double usage dans le cadre d'un clavier tactile sensible.

En raison de la grande variété d'appareils tactiles, Android s'appuie sur un grand nombre des 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 considéré comme un périphérique multipoint si les deux les conditions suivantes sont remplies:

  • Le périphérique d'entrée signale la présence de ABS_MT_POSITION_X et ABS_MT_POSITION_Y axe absolu.
  • Le périphérique d'entrée ne comporte 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 chevauche ceux des axes MT.

Un périphérique d'entrée est considéré comme un périphérique à touche unique si les deux les conditions suivantes sont réunies:

  • Le périphérique d'entrée n'est pas classé comme périphérique à plusieurs doigts. Un périphérique d'entrée est classé en tant qu’appareil à toucher unique ou en tant qu’appareil multipoint, jamais les deux.
  • Le périphérique d'entrée signale la présence des valeurs absolues ABS_X et ABS_Y les axes et la présence du code de touche BTN_TOUCH.

Lorsqu'un périphérique d'entrée est classé comme un appareil tactile, la présence des clés virtuelles est déterminée en essayant de charger le fichier de mappage de clés virtuelles pour l'appareil. Si un mappage de clés virtuelles est disponible, la disposition des touches pour l'appareil est également chargé. Reportez-vous à la section [Fichiers de mappage de clés virtuelles](#virtual-key-map-files) pour connaître 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 l'appareil tactile.

Tous les appareils tactiles intégrés doivent disposer de 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 adaptée à un usage général Périphériques tactiles tels que des écrans tactiles USB externes ou Bluetooth HID ou des pavés tactiles. Ces paramètres par défaut ne sont pas conçus pour les écrans tactiles intégrés et peut entraîner un comportement incorrect.

Une fois la configuration du périphérique d'entrée chargée, le système classe la périphérique d'entrée tel qu'un écran tactile, un pavé tactile ou un pointeur

  • Un appareil à écran tactile permet de manipuler directement des objets sur le l'écran. L'utilisateur touche directement l'écran, donc le système ne ont besoin de toutes les affordances supplémentaires pour indiquer les objets manipulées.
  • Un pavé tactile est utilisé pour fournir des informations de position absolue. à une application concernant les gestes 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 des objets sur le à l'écran à l'aide d'un curseur. Les doigts sont interprétés comme un pointeur multipoint. gestes. D'autres outils, tels que les stylets, sont interprétés à l'aide de en position absolue. Voir Pointeur multipoint indirect gestes pour en savoir plus.

Les règles suivantes sont utilisées pour classer le périphérique d'entrée en tant qu'écran tactile, un pavé tactile ou un pointeur.

  • Si la propriété touch.deviceType est définie, le type d'appareil est comme indiqué.
  • Si le périphérique d'entrée signale la présence de INPUT_PROP_DIRECT d'entrée (via l'ioctl EVIOCGPROP), le type d'appareil est défini sur écran tactile. Cette condition suppose que la saisie directe périphériques sont connectés à un écran qui est également connecté.
  • Si le périphérique d'entrée signale la présence de INPUT_PROP_POINTER propriété d'entrée (via l'ioctl EVIOCGPROP), puis le type d'appareil défini sur pointer.
  • Si le périphérique d'entrée signale la présence de REL_X ou REL_Y axes relatifs, le type d'appareil est défini sur pavé tactile. Cette condition résout une ambiguïté pour les périphériques d'entrée constitués à la fois d'une souris et 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 d'appareil est défini sur pointeur. Cette valeur par défaut garantit des pavés tactiles qui n'ont pas d'autres fonctions contrôler le pointeur.

Boutons

Les boutons sont des commandes facultatives que les applications peuvent utiliser pour effectuer des fonctions supplémentaires. Les boutons des appareils tactiles se comportent de la même manière que ceux de la souris et sont principalement utilisés avec les appareils tactiles de type pointeur avec le stylet.

Les boutons suivants sont acceptés:

  • BTN_LEFT: mappé sur MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: mappé sur MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: mappé sur MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK et BTN_SIDE: mappés avec MotionEvent.BUTTON_BACK. Appuyer sur ce bouton synthétise également l'appui sur une touche avec le code de la touche KeyEvent.KEYCODE_BACK
  • BTN_FORWARD et BTN_EXTRA: mappés sur MotionEvent.BUTTON_FORWARD Appuyer sur ce bouton synthétise aussi une pression sur une touche avec le code de touche KeyEvent.KEYCODE_FORWARD.
  • BTN_STYLUS: mappé sur MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: mappé sur MotionEvent.BUTTON_TERTIARY.

Outils et types d'outils

Un outil est un doigt, un stylet ou un autre appareil permettant d'interagir avec l'appareil tactile. Certains appareils tactiles peuvent faire la distinction types d'outils.

Ailleurs sur Android, comme dans l'API MotionEvent, un outil est souvent désigné comme pointeur.

Les types d'outils suivants sont compatibles:

  • BTN_TOOL_FINGER et MT_TOOL_FINGER: mappés sur MotionEvent.TOOL_TYPE_FINGER
  • BTN_TOOL_PEN et MT_TOOL_PEN: mappés sur MotionEvent.TOOL_TYPE_STYLUS
  • BTN_TOOL_RUBBER: mappé sur MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: mappé sur MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: mappé sur MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: mappé sur MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: mappé sur MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: mappé sur MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP et BTN_TOOL_QUADTAP: mappé sur MotionEvent.TOOL_TYPE_FINGER.

Passer la souris sur les outils ou appuyer sur ceux-ci

Les outils peuvent être soit en contact avec l'appareil tactile, soit à portée et en pointant l'appareil au-dessus d'elle. Tous les appareils tactiles ne détectent pas la présence d'un outil au-dessus de l'appareil tactile. Ceux qui le font, comme les numériques de stylet à radiofréquences, permet souvent de détecter si l'outil se trouve dans une plage limitée du numériseur.

Le composant InputReader distingue les outils tactiles du pointage. outils. 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 avec 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 de MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE et MotionEvent.ACTION_HOVER_EXIT.

Configuration requise pour le pilote de l'appareil tactile

  • Les pilotes d'appareils tactiles ne doivent enregistrer que les axes et les codes de touches des axes et les boutons qu'ils prennent en charge. Enregistrer des axes ou des codes de touche non compatibles peut perturber l'algorithme de classification des appareils ou faire en sorte que le système détecter les fonctionnalités de l'appareil. Par exemple, si l'appareil signale le Code de touche BTN_TOUCH, le système suppose que BTN_TOUCH est toujours utilisé pour indiquer si l'outil est touchant l'écran. Par conséquent, BTN_TOUCH ne doit pas être utilisé pour indiquer que l'outil est simplement dans la plage et qu'il est survolé.
  • Les appareils à contact unique utilisent les événements d'entrée Linux suivants:
    <ph type="x-smartling-placeholder">
      </ph>
    • ABS_X: (OBLIGATOIRE) indique la coordonnée X de l'outil.
    • ABS_Y (OBLIGATOIRE) indique la coordonnée Y de l'outil.
    • ABS_PRESSURE (facultatif) indique la pression physique appliquée au pourboire ; de l'outil ou l'intensité du signal du contact tactile.
    • ABS_TOOL_WIDTH (facultatif): indique la superficie transversale ou la largeur des le contact tactile ou de l'outil lui-même.
    • ABS_DISTANCE (facultatif) indique la distance entre l'outil et la surface. de l'appareil tactile.
    • ABS_TILT_X (facultatif): indique l'inclinaison de l'outil à partir de la surface de l'appareil tactile le long de l'axe X.
    • ABS_TILT_Y (facultatif): indique l'inclinaison de l'outil à partir de la surface de l'appareil tactile le long de l'axe Y.
    • BTN_TOUCH: (OBLIGATOIRE) indique si l'outil est en contact avec le appareil.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK BTN_SIDE, BTN_FORWARD BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (facultatif) État du bouton Rapports.
    • 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 à l'écran tactile multipoint utilisent les événements d'entrée Linux suivants:
    <ph type="x-smartling-placeholder">
      </ph>
    • ABS_MT_POSITION_X: (OBLIGATOIRE) indique la coordonnée X de l'outil.
    • ABS_MT_POSITION_Y (OBLIGATOIRE) indique la coordonnée Y de l'outil.
    • ABS_MT_PRESSURE (facultatif): indique la pression physique appliquée à la la pointe de l'outil ou l'intensité du signal du contact tactile.
    • ABS_MT_TOUCH_MAJOR: (facultatif) indique l'aire transversale du contact tactile ou la longueur de la dimension la plus longue du contact tactile.
    • ABS_MT_TOUCH_MINOR (facultatif) indique la longueur de la dimension la plus courte. du contact tactile. Cet axe ne doit pas être utilisé si ABS_MT_TOUCH_MAJOR est pour générer des rapports sur une mesure de superficie.
    • ABS_MT_WIDTH_MAJOR: (facultatif) indique l'aire transversale du l'outil lui-même ou la longueur de la dimension la plus longue de l'outil lui-même. Ne pas utiliser cet axe sauf si vous connaissez les dimensions de l'outil.
    • 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é si ABS_MT_WIDTH_MAJOR génère des rapports une mesure d'aire ou si les dimensions de l'outil lui-même sont inconnues.
    • ABS_MT_ORIENTATION (facultatif) indique l'orientation de l'outil.
    • ABS_MT_DISTANCE (facultatif): indique la distance entre l'outil et le de l'appareil tactile.
    • ABS_MT_TOOL_TYPE: (facultatif) indique le type d'outil MT_TOOL_FINGER ou MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID (facultatif): indique l'ID de suivi de l'outil. L'ID de suivi est un nombre entier arbitraire non négatif permettant d'identifier et suivre chaque outil indépendamment lorsque plusieurs outils sont actifs. Par exemple : lorsque plusieurs doigts touchent l'appareil, attribuez à chaque doigt un numéro qui est utilisé tant que le doigt reste en contact. ID de suivi peuvent être réutilisés lorsque les outils associés se trouvent hors de portée.
    • ABS_MT_SLOT (facultatif): indique l'ID d'emplacement de l'outil si vous utilisez la propriété Protocole multipoint Linux B Consulter la documentation sur le protocole multipoint Linux pour en savoir plus.
    • BTN_TOUCH: (OBLIGATOIRE) indique si l'outil est en contact avec le appareil.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK BTN_SIDE, BTN_FORWARD BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (facultatif) État du bouton Rapports.
    • 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 les axes du protocole à contact unique et à plusieurs doigts sont définis, alors seuls les axes à plusieurs doigts sont utilisés et ceux à un seul point sont ignorés.
  • Les valeurs minimale et maximale de ABS_X, ABS_Y, ABS_MT_POSITION_X, et les ABS_MT_POSITION_Y axes définissant les limites de la zone active de l'appareil en unités de surface spécifiques à chaque appareil. Dans le cas d'un écran tactile, la zone active décrit la partie de l'appareil tactile qui recouvre réellement l'écran.

    Pour un écran tactile, le système interpole automatiquement la valeur tactile indiquée. en unités de surface pour obtenir les positions tactiles en pixels d'affichage selon au calcul suivant:

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

    Un écran tactile peut signaler des gestes en dehors de la zone active signalée.

    Les pressions effectuées en dehors de la zone active ne sont pas transmises aux applications. mais il peut être utilisé pour les clés virtuelles.

    Appuis à l'intérieur de la zone active, ou qui entrent et sortent de l'écran sont transmis aux applications. Par conséquent, si une pression commence à l'intérieur de la aux limites d'une application, puis sort de la zone active, l'application peuvent recevoir des événements tactiles dont les coordonnées d'affichage sont négatives ou supérieures à les limites de l'écran. Ce comportement est normal.

    Un appareil tactile ne doit jamais fixer les coordonnées tactiles aux limites de l'écran dans une zone géographique spécifique. Si une pression quitte la zone active, elle doit être signalée comme située en dehors de la zone active, sans quoi elle ne doit pas être signalée du tout.

    Par exemple, si l'utilisateur touche l'angle supérieur gauche l'écran tactile, il peut indiquer une coordonnée de (minX, minY). Si le doigt continue pour sortir de la zone active, l'écran tactile doit commencer de création de rapports avec des composants dont la valeur est inférieure à minX et minY, comme (minX - 2, minY - 3), ou il doit arrêter complètement d'enregistrer le geste tactile. En d'autres termes, l'écran tactile ne doit pas envoyer de rapports (minX, minY). lorsque le doigt de l'utilisateur touche vraiment en dehors de la zone active.

    Le fait de fixer les coordonnées tactiles au bord de l'écran crée un une limite stricte autour du bord de l'écran pour empêcher le système suivre de façon fluide les mouvements qui entrent ou sortent des limites de la zone d'affichage.

  • Les valeurs signalées par ABS_PRESSURE ou ABS_MT_PRESSURE, si elles sont signalés, doivent être différents de zéro lorsque l'outil est en contact avec l'appareil. et zéro dans le cas contraire pour indiquer que l'outil est survolé.

    Les informations sur la pression de signalement sont facultatives, mais vivement recommandées. Les applications peuvent utiliser les informations sur la pression pour implémenter un dessin sensible à la pression. et d'autres effets.

  • Les valeurs indiquées par ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR ou ABS_MT_WIDTH_MINOR doit être différent de zéro lorsque l'outil entre en contact avec l'appareil et zéro dans le cas contraire, mais ce n'est pas obligatoire. Par exemple, l'appareil tactile peut mesurer la taille des doigts. contacts, mais pas les contacts tactiles du stylet.

    Les informations sur la taille des rapports sont facultatives, mais vivement recommandées. Les applications peuvent utiliser les informations de pression pour implémenter un dessin sensible à la taille. et d'autres effets.

  • Les valeurs indiquées par ABS_DISTANCE ou ABS_MT_DISTANCE doivent approche de zéro lorsque l'outil est en contact avec l'appareil. La distance peut rester non nulle même lorsque l'outil est en contact direct. Les valeurs exactes indiquées dépendent sur la manière dont le matériel mesure la distance.

    Le signalement des informations de distance est facultatif, mais recommandé pour stylets.

  • Les valeurs indiquées par ABS_TILT_X et ABS_TILT_Y doivent être égales à zéro. lorsque l'outil est perpendiculaire à l'appareil. Une inclinaison non nulle indique l'outil doit être incliné.

    Les angles d'inclinaison le long des axes X et Y sont censés être spécifiés en degrés à partir du perpendiculaire. On donne au point central (parfaitement perpendiculaire) par (max + min) / 2 pour chaque axe. Valeurs inférieures au point central représente une inclinaison vers le haut ou vers la gauche, 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 angle d'inclinaison compris entre 0 et PI / 2 radians, et un angle d'orientation planaire compris entre -PI et PI radians. Cette représentation se traduit par description de l'orientation compatible avec ce qui est utilisé pour décrire vos doigts.

    Il est facultatif de signaler les informations sur l'inclinaison, mais cela est recommandé pour les stylets.

  • Si le type d'outil est indiqué par ABS_MT_TOOL_TYPE, il remplace tous les outils informations de type fournies par BTN_TOOL_*. Si aucune information n'est disponible, le type d'outil est défini par défaut sur MotionEvent.TOOL_TYPE_FINGER

  • Un outil est déterminé comme étant actif en fonction des conditions suivantes:

    • Lorsque vous utilisez le protocole à contact unique, l'outil est actif si BTN_TOUCH, ou BTN_TOOL_* est égal à 1.

      Cette condition implique que InputReader doit avoir au moins une partie des informations sur la nature de l'outil, qu'il soit touché, ou au moins son type d'outil. Si aucune information n'est disponible, alors l'outil est considéré comme inactif (en dehors de la plage).

    • Avec le protocole multipoint "A", l'outil est actif dès qu'il apparaît dans le rapport de synchronisation le plus récent. Lorsque l'outil cesse d'apparaître dans synchronisation des rapports, elle n'existe plus.
    • Avec le protocole multipoint B, l'outil reste actif tant que elle dispose d'un emplacement actif. Une fois l'emplacement effacé, l'outil cesse d'exister.
  • Les conditions suivantes déterminent qu'un outil pointe sur l'écran:
    <ph type="x-smartling-placeholder">
      </ph>
    • Si l'outil est BTN_TOOL_MOUSE ou BTN_TOOL_LENS, alors il n'est pas survolé, même si l'une des conditions suivantes est remplie.
    • Si l'outil est actif et que le conducteur signale des informations sur la pression, et que la pression indiquée est nulle, l'outil pointe du doigt.
    • Si l'outil est actif et que le pilote est compatible avec le code de clé BTN_TOUCH et BTN_TOUCH a une valeur de zéro, cela signifie que l'outil pointe sur le graphique.
  • InputReader est compatible à la fois avec le protocole multipoint "A" et "B". Nouveaux pilotes doit utiliser la lettre "B" standard, mais l’une ou l’autre fonctionne.
  • À partir d'Android 4.0, vous devrez peut-être changer les pilotes d'écran tactile pour être conforme à la spécification du protocole d'entrée Linux.

    Les modifications suivantes peuvent être requises:

    • Lorsqu'un outil devient inactif (le doigt « monte »), il devrait cesser d'apparaître dans les rapports de synchronisation multipoint suivants. Lorsque tous les outils deviennent inactifs (tous les doigts sont « montés »), le pilote doit envoyer un paquet de rapport de synchronisation vide, comme SYN_MT_REPORT, suivi de SYN_REPORT.

      Les versions précédentes d'Android devraient être "répertoriées" les événements à signaler en envoyant une valeur de pression de 0. L'ancien comportement n'était pas compatible avec Spécification du protocole d'entrée Linux et n'est plus compatible.

    • Les informations sur la pression physique ou l'intensité du signal doivent être indiquées via ABS_MT_PRESSURE

      Les versions précédentes d'Android ont récupéré des informations sur la pression de ABS_MT_TOUCH_MAJOR. L'ancien comportement n'était pas compatible avec Spécification du protocole d'entrée Linux et n'est plus compatible.

    • Les informations sur la taille des écrans tactiles doivent être enregistrées à l'aide de ABS_MT_TOUCH_MAJOR.

      Les versions précédentes d'Android ont récupéré les informations de taille à partir de ABS_MT_TOOL_MAJOR L'ancien comportement n'était pas compatible avec Spécification du protocole d'entrée Linux et n'est plus compatible.

    Les pilotes d'appareils tactiles n'ont plus besoin de personnalisations spécifiques à Android. En s'appuyant sur le protocole d'entrée standard de Linux, Android est compatible avec une plus grande variété de périphériques tactiles, tels que le multipoint HID externe à l'aide de pilotes non modifiés.

Utilisation de l'appareil tactile

Voici un bref résumé du fonctionnement de l'appareil tactile sur Android.

  1. EventHub lit les événements bruts du pilote evdev.
  2. InputReader utilise les événements bruts et met à jour l'état interne concernant la position et d'autres caractéristiques de chaque outil. Il suit également des boutons.
  3. Si vous avez appuyé ou relâché sur RETOUR ou AVANT, InputReader informe InputDispatcher de l'événement clé.
  4. InputReader détermine si un appui sur une touche virtuelle a eu lieu. Si oui, il informe InputDispatcher de l'événement clé.
  5. InputReader détermine si la pression a été initiée dans le les limites de l'écran. Si c'est le cas, elle informe InputDispatcher de l'événement tactile.
  6. S'il n'y a pas d'outils tactiles, mais qu'il y a au moins un outil de survol, InputReader informe InputDispatcher de l'événement de pointage.
  7. Si l'appareil tactile est de type pointeur, InputReader effectue le pointeur détection des gestes, déplace le pointeur et le repère en conséquence, et notifie InputDispatcher sur l'événement de pointeur.
  8. InputDispatcher utilise WindowManagerPolicy pour déterminer si les événements doivent être déclenchés et s’ils doivent activer l’appareil. InputDispatcher envoie ensuite les événements aux applications appropriées.

Configuration de l'appareil tactile

Le comportement de l'appareil tactile est déterminé par ses axes, ses boutons, ses propriétés de saisie, configuration du périphérique d'entrée, mappage des touches virtuelles et disposition des touches.

Reportez-vous aux sections suivantes pour en savoir plus sur les fichiers participer à la configuration du clavier:

Propriétés

Le système s'appuie sur de nombreuses propriétés de configuration des périphériques d'entrée pour configurer et calibrez le comportement de l'appareil tactile.

L'une des raisons à cela est que les pilotes des appareils tactiles signalent souvent les caractéristiques des points tactiles à l'aide d'unités spécifiques à l'appareil.

Par exemple, de nombreux appareils tactiles mesurent la zone de contact tactile. à l'aide d'une échelle interne spécifique à chaque appareil, comme le nombre total les nœuds de capteurs déclenchés par un toucher. Cette valeur de taille brute ne sont pas significatives pour les applications, car elles auraient besoin de connaître la taille physique et d'autres caractéristiques des nœuds du capteur de l'appareil tactile.

Le système utilise des paramètres de calibrage encodés dans la configuration du périphérique d'entrée pour décoder, transformer et normaliser les valeurs transmises par l'appui appareil dans une représentation standard plus simple et compréhensible par les applications.

Conventions de documentation

À 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 de l'axe

Les expressions suivantes désignent les valeurs brutes rapportées par l'appui pilote d'appareil en tant qu'événements EV_ABS.

raw.x
Valeur de l'axe ABS_X ou ABS_MT_POSITION_X.
raw.y
Valeur de l'axe ABS_Y ou ABS_MT_POSITION_Y.
raw.pressure
La valeur de l'axe ABS_PRESSURE ou ABS_MT_PRESSURE, ou 0 si non disponibles.
raw.touchMajor
Valeur de l'axe ABS_MT_TOUCH_MAJOR, ou 0 si non disponible.
raw.touchMinor
La valeur de l'axe ABS_MT_TOUCH_MINOR, ou raw.touchMajor si non disponibles.
raw.toolMajor
La valeur de l'axe ABS_TOOL_WIDTH ou ABS_MT_WIDTH_MAJOR, ou 0 si non disponibles.
raw.toolMinor
Valeur de l'axe ABS_MT_WIDTH_MINOR, ou raw.toolMajor dans le cas contraire disponibles.
raw.orientation
Valeur de l'axe ABS_MT_ORIENTATION, ou 0 si non disponible.
raw.distance
La valeur de l'axe ABS_DISTANCE ou ABS_MT_DISTANCE, ou 0 si non disponibles.
raw.tiltX
Valeur de l'axe ABS_TILT_X, ou 0 si non disponible.
raw.tiltY
Valeur de l'axe ABS_TILT_Y, ou 0 si non disponible.

Plages brutes de l'axe

Les expressions suivantes indiquent les limites des valeurs brutes. Ils sont obtenus en appelant EVIOCGABS ioctl pour chaque axe.

raw.*.min
Valeur minimale inclusive de l'axe brut.
raw.*.max
Valeur maximale inclusive de l'axe brut.
raw.*.range
Équivaut à raw.*.max - raw.*.min.
raw.*.fuzz
Précision de l'axe brut. Ex. : La valeur fuzz = 1 implique que les valeurs sont précises à +/- 1 unité.
raw.width
Largeur inclusive de la zone tactile, qui équivaut à raw.x.range + 1.
raw.height
Hauteur inclusive de la zone tactile, qui équivaut à raw.y.range + 1.

Plages de sortie

Les expressions suivantes indiquent les caractéristiques du système de coordonnées de sortie. Le système utilise l'interpolation linéaire pour traduire les informations de position tactile les unités de surface utilisées par l'appareil tactile dans les unités de sortie signalées à des applications, comme les pixels d'affichage.

output.width
Largeur de la sortie. Pour les écrans tactiles (associés à un écran), cette est la largeur d'affichage en pixels. Pour les pavés tactiles (non associés à un écran), la largeur de sortie est égale à raw.width, ce qui indique qu'aucune interpolation est effectuée.
output.height
Hauteur de la sortie. Pour les écrans tactiles (associés à un écran), cette est la hauteur d'affichage en pixels. Pour les pavés tactiles (non associés à un écran), la hauteur de la sortie est égale à raw.height, ce qui indique qu'aucune interpolation n'est d'exécution.
output.diag
Longueur en diagonale du système de coordonnées de sortie, qui équivaut à sqrt(output.width ^2 + output.height ^2)

Configuration de base

Le mappeur de saisie tactile utilise de nombreuses propriétés de configuration dans le périphérique d'entrée. pour spécifier les valeurs de calibration. 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, ainsi que les champs utilisés pour le calibrage.

touch.deviceType

Définition:touch.deviceType = touchScreen | touchPad | pointer | default

Spécifie le type d'appareil tactile.

  • Si la valeur est touchScreen, l'appareil tactile est un écran tactile associé avec un écran.

  • Si la valeur est touchPad, cela signifie que l'appareil tactile est un pavé tactile non associé. avec un écran.

  • Si la valeur est pointer, cela signifie que l'appareil tactile est un pavé tactile non associé. avec un écran, et ses mouvements sont utilisés pour gestes indirects du pointeur multipoint.

  • Si la valeur est default, le système détecte automatiquement le type d'appareil. selon l'algorithme de classification.

Pour en savoir plus, consultez la section Classification. sur l'influence du type d'appareil sur 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

Indique si l'appareil tactile doit réagir aux changements d'orientation de l'écran.

  • Si la valeur est 1, les positions tactiles signalées par l'appareil tactile sont pivotées. chaque fois que l'orientation de l'écran change.

  • Si la valeur est 0, les positions tactiles signalées par l'appareil tactile sont immunisées pour afficher les changements d'orientation.

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 orienté orientation est pivoté en fonction de l'orientation. de l'écran interne. Un écran tactile externe prenant en compte l'orientation est pivoté en fonction de l'orientation de l'écran externe.

La détection de l'orientation est utilisée pour prendre en charge la rotation des écrans tactiles sur les appareils comme le Nexus One. Par exemple, lorsque vous faites pivoter l'appareil de 90 degrés dans le sens des aiguilles d'une montre par rapport à son orientation naturelle, les positions absolues des points de contact sont remappées qu'un appui dans l'angle supérieur gauche du système de coordonnées absolues de l'écran tactile est signalée comme une pression dans l'angle supérieur gauche du système de coordonnées de rotation de l'écran. Ainsi, les interactions tactiles sont signalées par le même système de coordonnées que celui utilisé pour la transmission. les applications utilisent pour dessiner leurs éléments visuels.

Avant Honeycomb, tous les appareils tactiles étaient considérés comme sensibles à l'orientation.

touch.gestureMode

Définition:touch.gestureMode = pointer | spots | default

Spécifie le mode de présentation pour les gestes de pointeur. Cette propriété de configuration n'est pertinent que lorsque l'appareil tactile est de type pointeur.

  • Si la valeur est pointer, les gestes du pavé tactile sont présentés à l'aide d'un curseur comme le pointeur de la souris.

  • Si la valeur est spots, les gestes du pavé tactile sont présentés par une ancre qui représente le centroïde du geste et un ensemble de taches circulaires. qui représentent la position de chaque doigt.

La valeur par défaut est pointer lorsque la propriété d'entrée INPUT_PROP_SEMI_MT est définie. est défini, ou spots dans le cas contraire.

Champs X et Y

Les champs X et Y fournissent des informations sur la position du centre de la zone de contact.

Calcul

Le calcul est simple: les informations de position issues du pilote tactile sont interpolée de manière linéaire au 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 de l'écran tactile par rapport à le plus grand appui possible que l'appareil tactile peut détecter. Le plus petit la taille normalisée possible est de 0, 0 (aucun contact ou non mesurable), et la valeur la plus élevée la taille normalisée possible est de 1,0 (la zone du capteur est saturée).

Lorsque la longueur et l'étendue approximatives peuvent être mesurées, alors Champ touchMajor spécifie la dimension la plus longue et le champ touchMinor indique la dimension la plus courte de la zone de contact. Lorsque seul le diamètre approximatif de la zone de contact peut être mesuré, alors les champs touchMajor et touchMinor sont égaux.

De même, le champ toolMajor indique la dimension la plus longue et le champ toolMinor spécifie la dimension la plus courte de la coupe transversale de l'outil.

Si la taille de l'écran tactile n'est pas disponible, mais que la taille de l'outil l'est, alors la taille de l'outil est égale à la taille de l'écran tactile. Inversement, si la taille d'outil n'est pas disponible mais que la taille de l'écran tactile est disponible, elle est définie sur la même taille que l'outil.

Les appareils tactiles mesurent ou indiquent la taille des écrans tactiles et la taille de l'outil de différentes manières. La mise en œuvre actuelle accepte trois types de mesures différents: diamètre, superficie et cadre de délimitation géométrique en unités de surface.

Définition:touch.size.calibration = none | geometric | diameter | area | default

Indique le type de mesure utilisé par le pilote tactile pour indiquer la la taille de l'écran tactile 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 le même les unités de la surface au lieu de 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 à le diamètre (largeur) de l'appui ou de l'outil.

  • Si la valeur est area, la taille est supposée être proportionnelle à la zone tactile ou de l'outil.

  • Si la valeur est default, le système utilise l'étalonnage geometric si le raw.touchMajor ou raw.toolMajor est disponible. Sinon, utilise l'étalonnage de none.

Touch.size.scale

Définition:touch.size.scale = <nombre à virgule flottante non négatif>

Spécifie un facteur de scaling constant utilisé lors de l'étalonnage.

La valeur par défaut est 1.0.

touche.taille.biais

Définition:touch.size.bias = <nombre à virgule flottante non négatif>

Spécifie une valeur de biais constante utilisée lors de l'étalonnage.

La valeur par défaut est 0.0.

touche.taille.isSummed

Définition:touch.size.isSummed = 0 | 1

Indique si la taille est indiquée comme la somme des tailles de toutes contacts actifs ou est signalé individuellement pour chaque contact.

  • Si la valeur est 1, la taille indiquée est divisée par le nombre de contacts avant utilisation.

  • Si la valeur est 0, la taille indiquée est utilisée telle quelle.

La valeur par défaut est 0.

Certains appareils tactiles, en particulier les modèles "Semi-MT" les appareils ne peuvent pas distinguer des dimensions individuelles de plusieurs contacts afin qu'ils signalent une mesure de taille qui représente leur aire ou largeur totale. Cette propriété ne doit être définie 1 pour ces appareils. En cas de doute, définissez cette valeur sur 0.

Calcul

Le calcul des éléments suivants : touchMajor, touchMinor, toolMajor, toolMinor, et size dépendent des paramètres de calibrage 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 à la appareil tactile sous la forme d'une valeur normalisée comprise entre 0 (sans contact) et 1 (pression normale).

Une pression nulle indique que l'outil est survolé.

calibration.pressure.toucher

Définition:touch.pressure.calibration = none | physical | amplitude | default

Spécifie le type de mesure utilisé par le pilote tactile pour indiquer la pression.

  • Si la valeur est none, la pression est inconnue.Elle est donc définie sur 1,0 lorsque et 0.0 lorsque vous passez la souris dessus.

  • Si la valeur est physical, l'axe de pression est supposé mesurer la valeur réelle intensité physique de la pression appliquée au pavé tactile.

  • Si la valeur est amplitude, l'axe de pression est supposé mesurer le signal. qui est liée à la taille du contact et à la pression appliquée.

  • Si la valeur est default, le système utilise l'étalonnage physical si le axe de pression disponible. Sinon, utilise none.

touch.pressure.scale

Définition:touch.pressure.scale = <nombre à virgule flottante non négatif>

Spécifie un facteur de scaling constant utilisé lors de l'étalonnage.

La valeur par défaut est 1.0 / raw.pressure.max.

Calcul

Le calcul du champ pressure dépend des paramètres de calibration 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 de l'appui et de l'outil sous la forme d'un la mesure angulaire. Une orientation 0 indique que l'axe principal est orienté verticalement, -PI/2 indique que l'axe principal est orienté vers la gauche, PI/2 indique que l'axe principal est orienté vers la droite. Lorsqu'un stylet est présent, la plage d'orientation peut être décrite sous la forme d'un cercle complet à partir de -PI ou PI.

Le champ tilt décrit l'inclinaison de l'outil sous la forme d'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 lecteur tactile pour indiquer l'orientation.

  • Si la valeur est none, l'orientation est inconnue et est donc définie sur 0.
  • Si la valeur est interpolated, l'orientation est interpolée de façon linéaire de sorte qu'une la valeur brute de raw.orientation.min correspond à -PI/2 et la valeur brute de raw.orientation.max correspond à PI/2. La valeur centrale de (raw.orientation.min + raw.orientation.max) / 2 correspond à 0.
  • Si la valeur est vector, l'orientation est interprétée comme un vecteur empaqueté composé de deux champs de 4 bits signés. Cette représentation est utilisée sur le protocole basé sur les objets Atmel de l'infrastructure. Lorsqu'il est décodé, le vecteur génère un angle d'orientation et un niveau de confiance grandeur. La magnitude de confiance est utilisée pour mettre à l'échelle les informations de taille, à moins qu'il ne soit géométrique.
  • Si la valeur est default, le système utilise l'étalonnage interpolated si l'axe d'orientation est disponible. Sinon, utilise none.

Calcul

Le calcul des champs orientation et tilt dépend du les paramètres d'étalonnage spécifiés et 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 l'appareil tactile. sur la surface de l'écran. Une valeur de 0,0 indique un contact direct, tandis qu'une valeur supérieure indique un contact direct. qui augmente la distance par rapport à la surface.

contact.distance.calibration

Définition:touch.distance.calibration = none | scaled | default

Spécifie le type de mesure utilisé par le pilote tactile pour indiquer la distance.

  • Si la valeur est none, la distance est inconnue. Elle est donc définie sur 0.

  • Si la valeur est scaled, la distance indiquée est multipliée par le un facteur de scaling constant.

  • Si la valeur est default, le système utilise l'étalonnage scaled si le axe des distances disponible. Sinon, utilise none.

touch.distance.scale

Définition:touch.distance.scale = <nombre à virgule flottante non négatif>

Spécifie un facteur de scaling constant utilisé lors de l'étalonnage.

La valeur par défaut est 1.0.

Calcul

Le calcul du champ distance dépend de l'étalonnage spécifié paramètres.

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

Remarques sur la compatibilité

Les propriétés de configuration des appareils tactiles ont changé de manière significative dans Android Ice Cream Sandwich 4.0. Tous les fichiers de configuration de périphérique d'entrée pour l'écran tactile les appareils doivent être mis à jour pour utiliser les nouvelles propriétés de configuration.

Pour les anciens pilotes d'appareils tactiles, vous devrez peut-être aussi mis à jour.

Fichiers de mappage de clés virtuelles

Les appareils tactiles peuvent être utilisés pour implémenter des touches virtuelles.

Il existe plusieurs façons de procéder, selon les capacités de la l'écran de contrôle tactile. Certains contrôleurs tactiles peuvent être configurés directement en définissant des registres du micrologiciel. Dans d'autres cas, il est préférable d'effectuer la mise en correspondance des coordonnées tactiles avec les codes de touche dans le logiciel.

Lorsque des clés virtuelles sont implémentées dans un logiciel, le noyau doit exporter un mappage de clés virtuelles nommé virtualkeys.<devicename> comme propriété de tableau. Par exemple : si les pilotes de périphériques à écran tactile indiquent que son nom est « touchyfeely » puis le fichier de mappage de clés virtuelles doit comporter le chemin d'accès /sys/board_properties/virtualkeys.touchyfeely

Un fichier de mappage de clés virtuelles décrit les coordonnées et les codes de clé Linux des clés virtuelles. sur l'écran tactile.

En plus du fichier de mappage de clés virtuelles, il doit y avoir une disposition de clé correspondante et un fichier de mappage de caractères de clé pour mapper les codes clés Linux aux codes de touche Android et pour spécifier le type de périphérique de clavier (généralement SPECIAL_FUNCTION).

Syntaxe

Un fichier de mappage de clés virtuelles est un fichier en texte brut composé d'une séquence de clés virtuelles descriptions de mise en page séparées par des sauts de ligne ou des deux-points.

Les lignes de commentaire commencent par le signe "#" et continuer jusqu'à la fin de la ligne.

Chaque clé virtuelle est décrite par six composants séparés par des deux-points:

  • 0x01: code de version Doit toujours être 0x01.
  • <Code de clé Linux> : code de clé Linux de la clé virtuelle.
  • <centerX> : coordonnée X en pixels du centre de la clé virtuelle.
  • <centerY> : coordonnée Y en pixels du centre de la clé virtuelle.
  • <width> : largeur de la clé virtuelle en pixels.
  • <height> : hauteur de la clé virtuelle en pixels.

Toutes les coordonnées et tailles sont spécifiées en fonction du système de coordonnées de l'écran.

Voici un fichier de mappage de clés virtuelle écrit 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 mappage de clés virtuelles 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 480 x 800. En conséquence, tous les clés virtuelles ont un <centerY> la coordonnée 835, qui est légèrement inférieure la zone visible de l'écran tactile.

La première clé a un code de scan Linux de 158 (KEY_BACK), centerX de 55, centreY de 835, largeur de 90 et hauteur de 55

Exemple

Fichier de mappage de clés virtuelles: /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 disposition des touches: /system/usr/keylayout/touchyfeely.kl.

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

Fichier de mappage de caractères clés: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Gestes indirects du pointeur multipoint

En mode pointeur, le système interprète les gestes suivants:

  • Appuyer avec un seul doigt: cliquer.
  • Mouvement avec un seul doigt: déplacez le pointeur.
  • Mouvements avec un seul doigt et appuis sur un bouton: faites glisser le pointeur.
  • Déplacez deux doigts dans la même direction que les deux doigts: faites glisser la zone située sous le pointeur dans cette direction. Le pointeur lui-même ne bouge pas.
  • Mouvements de deux doigts avec deux doigts se déplaçant l'un vers l'autre ou écartés directions différentes: faire un panoramique/mettre à l'échelle/faire pivoter la zone entourant le pointeur. Le pointeur lui-même ne bouge pas.
  • Mouvement à plusieurs doigts: geste à forme libre.

Refus de la paume de la main

À partir d'Android 13, le système peut rejeter automatiquement les entrées de la paume de la main. lorsque le framework intégré est activé. Les solutions internes et personnalisées sont toujours prises en charge, bien qu'il soit nécessaire de les modifier pour renvoyer l'indicateur TOOL_TYPE_PALM lorsqu'un utilisateur est détecté. Le framework intégré fonctionne également avec des solutions personnalisées.

Le modèle réel examine les 90 premières millisecondes de données de gestes, sur le pointeur actuel et les pointeurs environnants, puis prend en compte la distance à laquelle se trouvent les points de contact par rapport au bord de l'écran. Il détermine ensuite, pour chaque pointeur, lesquels sont des paumes de main. Elle prend également en comptabilisent la taille de chaque contact, telle qu'indiquée par touchMajor. touchMinor Le framework Android supprime ensuite les pointeurs marqués comme paumes du flux tactile.

Si un pointeur a déjà été envoyé aux applications, le système:

  • (S'il existe d'autres pointeurs actifs) Annule le pointeur avec ACTION_POINTER_UP et FLAG_CANCELED définis.
  • (S'il s'agit du seul pointeur) Annule le pointeur avec ACTION_CANCEL.

Une API publique, MotionEvent.FLAG_CANCELED, indique que la version actuelle ne doit pas déclencher d'action de l'utilisateur. Cet indicateur est défini pour ACTION_CANCEL et ACTION_POINTER_UP.

Si le pointeur de la paume de la main n'a pas été envoyé aux applications, le système l'abandonne.

Activer le refus de la paume de la main

  1. Dans votre pilote tactile, utilisez la commande Macro input_abs_set_res pour définir les résolutions des champs suivants (les unités sont pixels par mm):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    La compatibilité avec ABS_MT_TOUCH_MINOR est facultative. Toutefois, si votre appareil assurez-vous que la résolution est correctement définie.

  2. Pour vérifier que les champs sont correctement définis, exécutez la commande suivante:
        $ adb shell getevent -li
    
  3. Pour activer la fonctionnalité pendant l'exécution, exécutez la commande suivante:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Redémarrez le processus system_server.
         $ adb shell stop && adb shell start
        
  5. Vérifiez que adb shell dumpsys input indique la présence de rejets de paume de la main à l'intérieur UnwantedInteractionBlocker Si ce n'est pas le cas, vérifiez les journaux d'entrée pour trouver des indices sur ce qui pourrait être mal configuré.

    Consultez 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: {}
    
  6. Pour activer définitivement la fonctionnalité, ajoutez la commande sysprop correspondante dans votre init**rc :

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Complément d'informations