Google setzt sich dafür ein, die Rassengerechtigkeit für schwarze Gemeinschaften zu fördern. Siehe wie.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Berühren Sie Geräte

Android unterstützt eine Vielzahl von Touchscreens und Touchpads, einschließlich digitaler Tablets auf Stiftbasis.

Touchscreens sind Touchscreens, die einem Display so zugeordnet sind, dass der Benutzer den Eindruck hat, Elemente auf dem Bildschirm direkt zu manipulieren.

Touchpads sind Touch-Geräte, die keinem Display zugeordnet sind, z. B. ein Digitalisierertablett. Touchpads werden normalerweise zum Zeigen oder zur absoluten indirekten Positionierung oder zur gestenbasierten Steuerung einer Benutzeroberfläche verwendet.

Touch-Geräte verfügen möglicherweise über Tasten, deren Funktionen den Maustasten ähneln.

Touch-Geräte können manchmal mit einer Vielzahl verschiedener Werkzeuge wie Fingern oder einem Stift manipuliert werden, abhängig von der zugrunde liegenden Touch-Sensor-Technologie.

Touch-Geräte werden manchmal verwendet, um virtuelle Schlüssel zu implementieren. Bei einigen Android-Geräten erstreckt sich der Touchscreen-Sensorbereich beispielsweise über den Bildschirmrand hinaus und dient als zweifacher Zweck als Teil einer berührungsempfindlichen Tastatur.

Aufgrund der großen Vielfalt an Touch-Geräten stützt sich Android auf eine Vielzahl von Konfigurationseigenschaften, um die Eigenschaften und das gewünschte Verhalten jedes Geräts zu beschreiben.

Berühren Sie Geräteklassifizierung

Ein Eingabegerät wird als Multitouch- Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:

  • Das Eingabegerät meldet das Vorhandensein der absoluten Achsen ABS_MT_POSITION_X und ABS_MT_POSITION_Y .

  • Das Eingabegerät verfügt über keine Gamepad-Tasten. Diese Bedingung löst eine Mehrdeutigkeit bei bestimmten Gamepads, die Achsen mit Codes melden, die die der MT-Achsen überlappen.

Ein Eingabegerät wird als Single-Touch- Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:

  • Das Eingabegerät ist nicht als Multitouch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Single-Touch-Gerät oder als Multi-Touch-Gerät klassifiziert, niemals als beides.

  • Das Eingabegerät meldet das Vorhandensein der absoluten Achsen ABS_X und ABS_Y sowie das Vorhandensein des Schlüsselcodes BTN_TOUCH .

Sobald ein Eingabegerät als Touch-Gerät klassifiziert wurde, wird das Vorhandensein virtueller Schlüssel ermittelt, indem versucht wird, die Zuordnungsdatei für virtuelle Schlüssel für das Gerät zu laden. Wenn eine virtuelle Schlüsselzuordnung verfügbar ist, wird auch die Schlüssellayoutdatei für das Gerät geladen.

Informationen zum Speicherort und Format von Zuordnungsdateien für virtuelle Schlüssel finden Sie im folgenden Abschnitt.

Als Nächstes lädt das System die Konfigurationsdatei für das Eingabegerät für das Touch-Gerät.

Alle integrierten Touch-Geräte sollten über Konfigurationsdateien für Eingabegeräte verfügen. Wenn keine Konfigurationsdatei für das Eingabegerät vorhanden ist, wählt das System eine Standardkonfiguration aus, die für typische Allzweck-Touch-Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder Touchpads geeignet ist. Diese Standardeinstellungen sind nicht für integrierte Touchscreens vorgesehen und führen höchstwahrscheinlich zu falschem Verhalten.

Nachdem die Konfiguration des Eingabegeräts geladen wurde, klassifiziert das System das Eingabegerät als Touchscreen , Touchpad oder Zeigergerät .

  • Ein Touchscreen- Gerät dient zur direkten Bearbeitung von Objekten auf dem Bildschirm. Da der Benutzer den Bildschirm direkt berührt, benötigt das System keine zusätzlichen Vergünstigungen, um die zu manipulierenden Objekte anzuzeigen.

  • Ein Touchpad- Gerät wird verwendet, um einer Anwendung absolute Positionsinformationen über Berührungen eines bestimmten Sensorbereichs bereitzustellen. Dies kann für Digitizer-Tablets nützlich sein.

  • Ein Zeigergerät dient zur indirekten Bearbeitung von Objekten auf dem Bildschirm mit einem Cursor. Finger werden als Multi-Touch-Zeigergesten interpretiert. Andere Werkzeuge wie Stifte werden mit absoluten Positionen interpretiert.

    Weitere Informationen finden Sie unter Indirekte Multi-Touch-Zeigergesten .

Die folgenden Regeln werden verwendet, um das Eingabegerät als Touchscreen , Touchpad oder Zeigergerät zu klassifizieren.

  • Wenn die Eigenschaft touch.deviceType ist, wird der Gerätetyp wie angegeben festgelegt.

  • Wenn das Eingabegerät das Vorhandensein der INPUT_PROP_DIRECT (über EVIOCGPROP ioctl) meldet, wird der Gerätetyp auf Touchscreen eingestellt . Diese Bedingung setzt voraus, dass Touch-Geräte mit direkter Eingabe an ein Display angeschlossen sind, das ebenfalls angeschlossen ist.

  • Wenn das Eingabegerät das Vorhandensein der INPUT_PROP_POINTER EVIOCGPROP meldet (über das EVIOCGPROP ioctl), wird der Gerätetyp auf Zeiger gesetzt .

  • Wenn das Eingabegerät , das Vorhandensein der Berichte REL_X oder REL_Y relativen Achsen, dann wird der Gerätetyp eingestellt werden Pad berühren. Diese Bedingung löst eine Mehrdeutigkeit für Eingabegeräte, die sowohl aus einer Maus als auch einem Touchpad bestehen. In diesem Fall wird das Touchpad nicht zur Steuerung des Zeigers verwendet, da die Maus ihn bereits steuert.

  • Andernfalls wird der Gerätetyp auf Zeiger gesetzt . Diese Standardeinstellung stellt sicher, dass Touchpads, die keinem anderen speziellen Zweck zugewiesen wurden, zur Steuerung des Zeigers dienen.

Tasten

Schaltflächen sind optionale Steuerelemente, die von Anwendungen verwendet werden können, um zusätzliche Funktionen auszuführen. Tasten auf Touch - Geräte verhalten sich ähnlich wie Maustasten und sind hauptsächlich die Verwendung mit Zeigertyp Touch - Geräten oder mit einem Stift.

Die folgenden Schaltflächen werden unterstützt:

  • BTN_LEFT : MotionEvent.BUTTON_PRIMARY .

  • BTN_RIGHT : MotionEvent.BUTTON_SECONDARY .

  • BTN_MIDDLE : MotionEvent.BUTTON_MIDDLE .

  • BTN_BACK und BTN_SIDE : MotionEvent.BUTTON_BACK . Durch Drücken dieser Taste wird auch ein Tastendruck mit dem KeyEvent.KEYCODE_BACK .

  • BTN_FORWARD und BTN_EXTRA : MotionEvent.BUTTON_FORWARD . Durch Drücken dieser Taste wird auch ein Tastendruck mit dem KeyEvent.KEYCODE_FORWARD .

  • BTN_STYLUS : MotionEvent.BUTTON_SECONDARY .

  • BTN_STYLUS2 : MotionEvent.BUTTON_TERTIARY .

Werkzeuge und Werkzeugtypen

Ein Werkzeug ist ein Finger, ein Stift oder ein anderes Gerät, das zur Interaktion mit dem Berührungsgerät verwendet wird. Einige Touch-Geräte können zwischen verschiedenen Arten von Werkzeugen unterscheiden.

An anderer Stelle in Android, wie in der MotionEvent API, wird ein Tool häufig als Zeiger bezeichnet .

Folgende Werkzeugtypen werden unterstützt:

  • BTN_TOOL_FINGER und MT_TOOL_FINGER : MotionEvent.TOOL_TYPE_FINGER .

  • BTN_TOOL_PEN und MT_TOOL_PEN : MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_RUBBER : MotionEvent.TOOL_TYPE_ERASER .

  • BTN_TOOL_BRUSH : MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_PENCIL : MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_AIRBRUSH : MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_MOUSE : MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_LENS : MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP und BTN_TOOL_QUADTAP : MotionEvent.TOOL_TYPE_FINGER .

Schwebende oder berührende Werkzeuge

Werkzeuge können entweder mit dem Touch-Gerät in Kontakt sein oder sich in Reichweite befinden und darüber schweben. Nicht alle Touch-Geräte können das Vorhandensein eines Werkzeugs erkennen, das über dem Touch-Gerät schwebt. Diejenigen, die dies tun, wie z. B. RF-basierte Stiftdigitalisierer, können häufig erkennen, wenn sich das Werkzeug in einem begrenzten Bereich des Digitalisierers befindet.

Die InputReader Komponente InputReader darauf, berührende Werkzeuge von schwebenden Werkzeugen zu unterscheiden. Ebenso werden berührende Werkzeuge und schwebende Werkzeuge auf unterschiedliche Weise an Anwendungen gemeldet.

Berührungswerkzeuge werden mithilfe von MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN und MotionEvent.ACTION_POINTER_UP als Berührungsereignisse an Anwendungen MotionEvent.ACTION_POINTER_UP .

Schwebende Werkzeuge werden mithilfe von MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE und MotionEvent.ACTION_HOVER_EXIT als generische Bewegungsereignisse an Anwendungen MotionEvent.ACTION_HOVER_EXIT .

Berühren Sie Gerätetreiberanforderungen

  1. Touch-Gerätetreiber sollten nur Achsen und Tastencodes für die Achsen und Tasten registrieren, die sie tatsächlich unterstützen. Das Registrieren überschüssiger Achsen oder Schlüsselcodes kann den Geräteklassifizierungsalgorithmus verwirren oder dazu führen, dass das System die Funktionen des Geräts falsch erkennt.

    Wenn das Gerät beispielsweise den Schlüsselcode BTN_TOUCH meldet, geht das System davon aus, dass BTN_TOUCH immer verwendet wird, um anzuzeigen, ob das Werkzeug tatsächlich den Bildschirm berührt. Daher sollte BTN_TOUCH nicht verwendet werden, um anzuzeigen, dass sich das Werkzeug lediglich im Bereich befindet und schwebt.

  2. Single-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:

    • ABS_X : (ERFORDERLICH) ABS_X die X-Koordinate des Werkzeugs an.

    • ABS_Y : (ERFORDERLICH) ABS_Y die Y-Koordinate des Werkzeugs an.

    • ABS_PRESSURE : (optional) ABS_PRESSURE den auf die Werkzeugspitze ABS_PRESSURE physischen Druck oder die Signalstärke des Berührungskontakts an.

    • ABS_TOOL_WIDTH : (optional) ABS_TOOL_WIDTH die Querschnittsfläche oder Breite des Berührungskontakts oder des Werkzeugs selbst an.

    • ABS_DISTANCE : (optional) ABS_DISTANCE den Abstand des Werkzeugs von der Oberfläche des Touch-Geräts an.

    • ABS_TILT_X : (optional) ABS_TILT_X die Neigung des Werkzeugs von der Oberfläche des Touch-Geräts entlang der X-Achse an.

    • ABS_TILT_Y : (optional) ABS_TILT_Y die Neigung des Werkzeugs von der Oberfläche des Berührungsgeräts entlang der Y-Achse an.

    • BTN_TOUCH : (ERFORDERLICH) Zeigt an, ob das Werkzeug das Gerät berührt.

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (optional) Berichte Taste Zustände.

    • 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 : (optional) Meldet den Werkzeugtyp .

  3. Multi-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:

    • ABS_MT_POSITION_X : (ERFORDERLICH) ABS_MT_POSITION_X die X-Koordinate des Werkzeugs an.

    • ABS_MT_POSITION_Y : (ERFORDERLICH) ABS_MT_POSITION_Y die Y-Koordinate des Werkzeugs an.

    • ABS_MT_PRESSURE : (optional) ABS_MT_PRESSURE den auf die Werkzeugspitze ABS_MT_PRESSURE physischen Druck oder die Signalstärke des Berührungskontakts an.

    • ABS_MT_TOUCH_MAJOR : (optional) ABS_MT_TOUCH_MAJOR die Querschnittsfläche des Berührungskontakts oder die Länge der längeren Abmessung des Berührungskontakts an.

    • ABS_MT_TOUCH_MINOR : (optional) ABS_MT_TOUCH_MINOR die Länge der kürzeren Abmessung des Berührungskontakts an. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_TOUCH_MAJOR eine Flächenmessung meldet.

    • ABS_MT_WIDTH_MAJOR : (optional) ABS_MT_WIDTH_MAJOR die Querschnittsfläche des Werkzeugs selbst oder die Länge der längeren Abmessung des Werkzeugs selbst an. Diese Achse sollte nicht verwendet werden, wenn die Abmessungen des Werkzeugs selbst unbekannt sind.

    • ABS_MT_WIDTH_MINOR : (optional) ABS_MT_WIDTH_MINOR die Länge der kürzeren Abmessung des Werkzeugs selbst an. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_WIDTH_MAJOR eine Flächenmessung meldet oder wenn die Abmessungen des Werkzeugs selbst unbekannt sind.

    • ABS_MT_ORIENTATION : (optional) ABS_MT_ORIENTATION die Ausrichtung des Werkzeugs an.

    • ABS_MT_DISTANCE : (optional) ABS_MT_DISTANCE den Abstand des Werkzeugs von der Oberfläche des Touch-Geräts an.

    • ABS_MT_TOOL_TYPE : (optional) ABS_MT_TOOL_TYPE den Werkzeugtyp als MT_TOOL_FINGER oder MT_TOOL_PEN .

    • ABS_MT_TRACKING_ID : (optional) ABS_MT_TRACKING_ID die Tracking-ID des Tools an. Die Verfolgungs-ID ist eine beliebige nicht negative Ganzzahl, mit der jedes Werkzeug unabhängig identifiziert und verfolgt wird, wenn mehrere Werkzeuge aktiv sind. Wenn beispielsweise mehrere Finger das Gerät berühren, sollte jedem Finger eine eigene Tracking-ID zugewiesen werden, die verwendet wird, solange der Finger in Kontakt bleibt. Tracking-IDs können wiederverwendet werden, wenn sich die zugehörigen Tools außerhalb der Reichweite befinden.

    • ABS_MT_SLOT : (optional) ABS_MT_SLOT die Steckplatz-ID des Tools an, wenn das Linux-Multitouch-Protokoll 'B' verwendet wird. Weitere Informationen finden Sie in der Dokumentation zum Linux-Multitouch-Protokoll.

    • BTN_TOUCH : (ERFORDERLICH) Zeigt an, ob das Werkzeug das Gerät berührt.

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (optional) Berichte Taste Zustände.

    • 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 : (optional) Meldet den Werkzeugtyp .

  4. Wenn Achsen sowohl für das Single-Touch- als auch für das Multi-Touch-Protokoll definiert sind, werden nur die Multi-Touch-Achsen verwendet und die Single-Touch-Achsen werden ignoriert.

  5. Die Minimal- und Maximalwerte der Achsen ABS_X , ABS_Y , ABS_MT_POSITION_X und ABS_MT_POSITION_Y definieren die Grenzen des aktiven Bereichs des Geräts in gerätespezifischen Oberflächeneinheiten. Bei einem Touchscreen beschreibt der aktive Bereich den Teil des Touchscreens, der das Display tatsächlich abdeckt.

    Für einen Touchscreen interpoliert das System automatisch die gemeldeten Berührungspositionen in Oberflächeneinheiten, um Berührungspositionen in Anzeigepixeln gemäß der folgenden Berechnung zu erhalten:

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

    Ein Touchscreen kann Berührungen außerhalb des gemeldeten aktiven Bereichs melden.

    Berührungen, die außerhalb des aktiven Bereichs ausgelöst werden, werden nicht an Anwendungen gesendet, sondern können für virtuelle Schlüssel verwendet werden.

    Berührungen, die innerhalb des aktiven Bereichs ausgelöst werden oder die den Anzeigebereich betreten und verlassen, werden an Anwendungen übermittelt. Wenn eine Berührung innerhalb der Grenzen einer Anwendung beginnt und sich dann außerhalb des aktiven Bereichs bewegt, kann die Anwendung daher Berührungsereignisse mit Anzeigekoordinaten empfangen, die negativ sind oder die Grenzen der Anzeige überschreiten. Dies ist erwartetes Verhalten.

    Ein Touch-Gerät sollte niemals Touch-Koordinaten an die Grenzen des aktiven Bereichs klemmen. Wenn eine Berührung den aktiven Bereich verlässt, sollte gemeldet werden, dass sie sich außerhalb des aktiven Bereichs befindet, oder sie sollte überhaupt nicht gemeldet werden.

    Wenn sich der Finger des Benutzers beispielsweise in der Nähe der oberen linken Ecke des Touchscreens berührt, wird möglicherweise eine Koordinate von (minX, minY) gemeldet. Wenn sich der Finger weiter außerhalb des aktiven Bereichs bewegt, sollte der Touchscreen entweder Koordinaten mit Komponenten melden, die kleiner als minX und minY sind, z. B. (minX - 2, minY - 3), oder die Berührung überhaupt nicht mehr melden. Mit anderen Worten, der Touchscreen sollte nicht melden (minX, minY), wenn sich der Finger des Benutzers wirklich außerhalb des aktiven Bereichs berührt.

    Durch das Festklemmen von Berührungskoordinaten an der Anzeigekante wird eine künstliche harte Grenze um die Bildschirmkante erzeugt, die verhindert, dass das System Bewegungen, die in die Grenzen des Anzeigebereichs eintreten oder aus diesen austreten, reibungslos verfolgt.

  6. Die von ABS_PRESSURE oder ABS_MT_PRESSURE gemeldeten Werte ABS_MT_PRESSURE , wenn sie überhaupt gemeldet werden, ungleich Null sein, wenn das Werkzeug das Gerät berührt, und andernfalls Null, um anzuzeigen, dass das Werkzeug schwebt.

    Die Meldung von Druckinformationen ist optional, wird jedoch dringend empfohlen. Anwendungen können Druckinformationen verwenden, um druckempfindliches Zeichnen und andere Effekte zu implementieren.

  7. Die von ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR oder ABS_MT_WIDTH_MINOR gemeldeten Werte sollten ungleich Null sein, wenn das Werkzeug das Gerät berührt, und ansonsten Null, dies ist jedoch nicht erforderlich. Beispielsweise kann das Berührungsgerät möglicherweise die Größe von Fingerberührungskontakten messen, jedoch nicht von Stiftberührungskontakten.

    Informationen zur Berichtsgröße sind optional, werden jedoch dringend empfohlen. Anwendungen können Druckinformationen verwenden, um größenempfindliche Zeichnungen und andere Effekte zu implementieren.

  8. Die von ABS_DISTANCE oder ABS_MT_DISTANCE gemeldeten Werte sollten sich Null nähern, wenn das Werkzeug das Gerät berührt. Der Abstand kann auch dann ungleich Null bleiben, wenn das Werkzeug in direktem Kontakt steht. Die genauen angegebenen Werte hängen von der Art und Weise ab, in der die Hardware die Entfernung misst.

    Das Melden von Entfernungsinformationen ist optional, wird jedoch für Stiftgeräte empfohlen.

  9. Die von ABS_TILT_X und ABS_TILT_Y gemeldeten Werte sollten Null sein, wenn das Werkzeug senkrecht zum Gerät steht. Eine Neigung ungleich Null wird als Hinweis darauf gewertet, dass das Werkzeug in einer Neigung gehalten wird.

    Es wird angenommen, dass die Neigungswinkel entlang der X- und Y-Achse in Grad von der Senkrechten angegeben werden. Der Mittelpunkt (perfekt senkrecht) ist für jede Achse durch (max + min) / 2 . Werte, die kleiner als der Mittelpunkt sind, stehen für eine Neigung nach oben oder links, Werte, die größer als der Mittelpunkt sind, für eine Neigung nach unten oder rechts.

    Der InputReader konvertiert die X- und Y-Neigungskomponenten in einen senkrechten Neigungswinkel von 0 bis PI / 2 Bogenmaß und einen planaren Orientierungswinkel von -PI bis PI Bogenmaß. Diese Darstellung führt zu einer Beschreibung der Ausrichtung, die mit der Beschreibung der Fingerberührungen kompatibel ist.

    Das Melden von Neigungsinformationen ist optional, wird jedoch für Stiftgeräte empfohlen.

  10. Wenn der Werkzeugtyp von ABS_MT_TOOL_TYPE gemeldet wird, ersetzt er alle von BTN_TOOL_* gemeldeten BTN_TOOL_* . Wenn überhaupt keine Informationen zum Werkzeugtyp verfügbar sind, lautet der Werkzeugtyp standardmäßig MotionEvent.TOOL_TYPE_FINGER .

  11. Ein Werkzeug wird basierend auf den folgenden Bedingungen als aktiv bestimmt:

    • Bei Verwendung des Single-Touch-Protokolls ist das Tool aktiv, wenn BTN_TOUCH oder BTN_TOOL_* 1 ist.

      Diese Bedingung impliziert, dass der InputReader mindestens einige Informationen über die Art des Werkzeugs haben muss, entweder ob es sich berührt oder zumindest über seinen Werkzeugtyp. Wenn keine Informationen verfügbar sind, wird angenommen, dass das Tool inaktiv ist (außerhalb des Bereichs).

    • Bei Verwendung des Multitouch-Protokolls 'A' ist das Tool immer dann aktiv, wenn es im neuesten Synchronisierungsbericht angezeigt wird. Wenn das Tool nicht mehr in Synchronisierungsberichten angezeigt wird, ist es nicht mehr vorhanden.

    • Bei Verwendung des Multitouch-Protokolls 'B' ist das Tool aktiv, solange es einen aktiven Steckplatz hat. Wenn der Steckplatz frei ist, existiert das Werkzeug nicht mehr.

  12. Ein Werkzeug wird basierend auf den folgenden Bedingungen als schwebend bestimmt:

    • Wenn das Werkzeug BTN_TOOL_MOUSE oder BTN_TOOL_LENS ist, schwebt das Werkzeug nicht, selbst wenn eine der folgenden Bedingungen erfüllt ist.

    • Wenn das Werkzeug aktiv ist und der Fahrer Druckinformationen meldet und der gemeldete Druck Null ist, schwebt das Werkzeug.

    • Wenn das Werkzeug aktiv ist und der Fahrer unterstützt den BTN_TOUCH Schlüsselcode und BTN_TOUCH hat einen Wert von Null, so wird das Werkzeug schwebt.

  13. Der InputReader unterstützt sowohl das Multitouch-Protokoll 'A' als auch 'B'. Neue Treiber sollten das 'B'-Protokoll verwenden, aber beide funktionieren.

  14. Ab Android Ice Cream Sandwich 4.0 müssen die Touchscreen-Treiber möglicherweise geändert werden, um den Linux-Eingabeprotokollspezifikationen zu entsprechen.

    Die folgenden Änderungen können erforderlich sein:

    • Wenn ein Tool inaktiv wird (der Finger geht nach oben), sollte es nicht mehr in nachfolgenden Multi-Touch-Synchronisierungsberichten angezeigt werden. Wenn alle Tools inaktiv werden (alle Finger gehen nach oben), sollte der Treiber ein leeres Synchronisierungsberichtspaket senden, z. B. SYN_MT_REPORT gefolgt von SYN_REPORT .

      In früheren Versionen von Android wurde erwartet, dass "up" -Ereignisse durch Senden eines Druckwerts von 0 gemeldet werden. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.

    • Informationen zum physikalischen Druck oder zur Signalstärke sollten mit ABS_MT_PRESSURE gemeldet werden.

      Frühere Versionen von Android haben ABS_MT_TOUCH_MAJOR von ABS_MT_TOUCH_MAJOR abgerufen. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.

    • Informationen zur Berührungsgröße sollten mit ABS_MT_TOUCH_MAJOR gemeldet werden.

      Frühere Versionen von Android haben ABS_MT_TOOL_MAJOR von ABS_MT_TOOL_MAJOR abgerufen. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.

    Touch-Gerätetreiber benötigen keine Android-spezifischen Anpassungen mehr. Durch die Verwendung des Standard-Linux-Eingabeprotokolls kann Android eine größere Auswahl an Touch-Peripheriegeräten unterstützen, z. B. externe HID-Multitouch-Touchscreens mit unveränderten Treibern.

Berühren Sie Gerätebetrieb

Das Folgende ist eine kurze Zusammenfassung des Touch-Geräte-Betriebs unter Android.

  1. Der EventHub liest EventHub aus dem evdev Treiber.

  2. Der InputReader die InputReader und aktualisiert den internen Status über die Position und andere Eigenschaften jedes Werkzeugs. Es werden auch Schaltflächenzustände verfolgt.

  3. Wenn die vorwärts oder rückwärts Tasten wurden gedrückt bzw. losgelassen, werden die InputReader meldet die InputDispatcher über das Schlüsselereignis.

  4. Der InputReader bestimmt, ob ein virtueller Tastendruck aufgetreten ist. In diesem Fall wird der InputDispatcher über das Schlüsselereignis benachrichtigt.

  5. Der InputReader bestimmt, ob die Berührung innerhalb der Grenzen der Anzeige ausgelöst wurde. In diesem Fall wird der InputDispatcher über das Berührungsereignis benachrichtigt.

  6. Wenn es keine rührenden Werkzeuge , aber es ist zumindest ein schwebendes Werkzeug, die InputReader melden die InputDispatcher über das Hover - Ereignis.

  7. Wenn der Touch-Gerätetyp Zeiger ist , führt der InputReader eine InputReader durch, bewegt den Zeiger und die Punkte entsprechend und benachrichtigt den InputDispatcher über das InputDispatcher .

  8. Der InputDispatcher verwendet die WindowManagerPolicy , um zu bestimmen, ob die Ereignisse InputDispatcher werden sollen und ob sie das Gerät InputDispatcher sollen. Anschließend liefert der InputDispatcher die Ereignisse an die entsprechenden Anwendungen.

Berühren Sie Gerätekonfiguration

Das Verhalten von Touch-Geräten wird durch die Achsen, Schaltflächen, Eingabeeigenschaften, Konfiguration des Eingabegeräts, die Zuordnung der virtuellen Schlüssel und das Tastenlayout des Geräts bestimmt.

In den folgenden Abschnitten finden Sie weitere Informationen zu den Dateien, die an der Tastaturkonfiguration beteiligt sind:

Eigenschaften

Das System stützt sich auf viele Konfigurationseigenschaften des Eingabegeräts, um das Verhalten von Touch-Geräten zu konfigurieren und zu kalibrieren.

Ein Grund dafür ist, dass die Gerätetreiber für Touch-Geräte häufig die Eigenschaften von Touch mit gerätespezifischen Einheiten melden.

Beispielsweise messen viele Berührungsgeräte den Berührungskontaktbereich mithilfe einer internen gerätespezifischen Skala, z. B. der Gesamtzahl der Sensorknoten, die durch die Berührung ausgelöst wurden. Dieser Rohgrößenwert wäre für Anwendungen nicht von Bedeutung, da sie die physikalische Größe und andere Eigenschaften der Sensorknoten des Berührungsgeräts kennen müssten.

Das System verwendet Kalibrierungsparameter, die in Konfigurationsdateien für Eingabegeräte codiert sind, um die vom Touch-Gerät gemeldeten Werte zu dekodieren, zu transformieren und zu normalisieren, um eine einfachere Standarddarstellung zu erhalten, die Anwendungen verstehen können.

Dokumentationskonventionen

Zu Dokumentationszwecken verwenden wir die folgenden Konventionen, um die vom System während des Kalibrierungsprozesses verwendeten Werte zu beschreiben.

Rohachsenwerte

Die folgenden Ausdrücke bezeichnen die vom Touch-Gerätetreiber als EV_ABS Ereignisse gemeldeten EV_ABS .

raw.x
Der Wert der Achse ABS_X oder ABS_MT_POSITION_X .
raw.y
Der Wert der Achse ABS_Y oder ABS_MT_POSITION_Y .
raw.pressure
Der Wert der Achse ABS_PRESSURE oder ABS_MT_PRESSURE oder 0, falls nicht verfügbar.
raw.touchMajor
Der Wert der Achse ABS_MT_TOUCH_MAJOR oder 0, falls nicht verfügbar.
raw.touchMinor
Der Wert der ABS_MT_TOUCH_MINOR Achse oder raw.touchMajor falls nicht vorhanden.
raw.toolMajor
Der Wert der Achse ABS_TOOL_WIDTH oder ABS_MT_WIDTH_MAJOR oder 0, falls nicht verfügbar.
raw.toolMinor
Der Wert der ABS_MT_WIDTH_MINOR Achse oder raw.toolMajor falls nicht vorhanden.
raw.orientation
Der Wert der Achse ABS_MT_ORIENTATION oder 0, falls nicht verfügbar.
raw.distance
Der Wert der Achse ABS_DISTANCE oder ABS_MT_DISTANCE oder 0, falls nicht verfügbar.
raw.tiltX
Der Wert der ABS_TILT_X Achse oder 0, falls nicht verfügbar.
raw.tiltY
Der Wert der Achse ABS_TILT_Y oder 0, falls nicht verfügbar.

Rohachsenbereiche

Die folgenden Ausdrücke bezeichnen die Grenzen der Rohwerte. Sie werden durch Aufrufen von EVIOCGABS ioctl für jede Achse erhalten.

raw.*.min
Der inklusive Mindestwert der Rohachse.
raw.*.max
Der inklusive Maximalwert der Rohachse.
raw.*.range
Entspricht raw.*.max - raw.*.min .
raw.*.fuzz
Die Genauigkeit der Rohachse. z.B. fuzz = 1 impliziert, dass die Werte auf +/- 1 Einheit genau sind.
raw.width
Die inklusive Breite des Berührungsbereichs, entspricht raw.x.range + 1 .
raw.height
Die inklusive Höhe des Berührungsbereichs, entspricht raw.y.range + 1 .

Ausgabebereiche

Die folgenden Ausdrücke bezeichnen die Eigenschaften des Ausgabekoordinatensystems. Das System verwendet eine lineare Interpolation, um Berührungspositionsinformationen von den vom Berührungsgerät verwendeten Oberflächeneinheiten in die Ausgabeeinheiten zu übersetzen, die an Anwendungen wie Anzeigepixel gemeldet werden.

output.width
Die Ausgabebreite. Bei Touchscreens (die einem Display zugeordnet sind) ist dies die Anzeigebreite in Pixel. Bei raw.width (die keinem Display zugeordnet sind) entspricht die Ausgabebreite der raw.width , was darauf hinweist, dass keine Interpolation durchgeführt wird.
output.height
Die Ausgabehöhe. Bei Touchscreens (die einem Display zugeordnet sind) ist dies die Anzeigehöhe in Pixel. Bei raw.height (die keinem Display zugeordnet sind) entspricht die raw.height , was darauf hinweist, dass keine Interpolation durchgeführt wird.
output.diag
Die diagonale Länge des Ausgabekoordinatensystems, die sqrt(output.width ^2 + output.height ^2) .

Grundlegende Einstellung

Der Touch Input Mapper verwendet viele Konfigurationseigenschaften in der Konfigurationsdatei des Eingabegeräts, um Kalibrierungswerte anzugeben. In der folgenden Tabelle werden einige allgemeine Konfigurationseigenschaften beschrieben. Alle anderen Eigenschaften werden in den folgenden Abschnitten zusammen mit den Feldern beschrieben, mit denen sie kalibriert werden.

touch.deviceType

Definition: touch.deviceType = touchScreen | touchPad | pointer | default

Gibt den Touch-Gerätetyp an.

  • Wenn der Wert touchScreen , ist das Touchscreen ein Touchscreen, der einem Display zugeordnet ist.

  • Wenn der Wert touchPad , ist das Touch-Gerät ein touchPad , das keinem Display zugeordnet ist.

  • Wenn der Wert pointer , ist das Touch-Gerät ein Touchpad, das keinem Display zugeordnet ist, und seine Bewegungen werden für indirekte Multi-Touch-Zeigergesten verwendet .

  • Wenn der Wert default , erkennt das System den Gerätetyp automatisch gemäß dem Klassifizierungsalgorithmus.

Weitere Informationen dazu, wie der Gerätetyp das Verhalten des Touch-Geräts beeinflusst, finden Sie im Abschnitt Klassifizierung .

Vor Honeycomb wurde angenommen, dass alle Touch-Geräte Touchscreens sind.

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

Gibt an, ob das Touch-Gerät auf Änderungen der Anzeigeausrichtung reagieren soll.

  • Wenn der Wert 1 , werden die vom Berührungsgerät gemeldeten Berührungspositionen gedreht, wenn sich die Ausrichtung der Anzeige ändert.

  • Wenn der Wert 0 , sind die vom Berührungsgerät gemeldeten Berührungspositionen immun gegen Änderungen der Anzeigeorientierung.

Der Standardwert ist 1 wenn das Gerät ein Touchscreen ist, andernfalls 0 .

Das System unterscheidet zwischen internen und externen Touchscreens und Displays. Ein orientierungsbewusster interner Touchscreen wird basierend auf der Ausrichtung des internen Displays gedreht. Ein orientierungsbewusster externer Touchscreen wird basierend auf der Ausrichtung des externen Displays gedreht.

Das Orientierungsbewusstsein wird verwendet, um die Drehung von Touchscreens auf Geräten wie dem Nexus One zu unterstützen. Wenn das Gerät beispielsweise um 90 Grad aus seiner natürlichen Ausrichtung im Uhrzeigersinn gedreht wird, werden die absoluten Positionen der Berührungen neu zugeordnet, sodass eine Berührung in der oberen linken Ecke des absoluten Koordinatensystems des Touchscreens als Berührung oben links gemeldet wird Ecke des gedrehten Koordinatensystems der Anzeige. Dies geschieht so, dass Berührungen mit demselben Koordinatensystem gemeldet werden, mit dem Anwendungen ihre visuellen Elemente zeichnen.

Vor Honeycomb wurde angenommen, dass alle Touch-Geräte orientierungsbewusst sind.

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

Gibt den Präsentationsmodus für Zeigergesten an. Diese Konfigurationseigenschaft ist nur relevant, wenn das Touch-Gerät vom Typ Zeiger ist .

  • Wenn der Wert pointer , werden die Touchpad-Gesten über einen Cursor ähnlich einem Mauszeiger dargestellt.

  • Wenn der Wert spots , werden die Touchpad-Gesten durch einen Anker dargestellt, der den Schwerpunkt der Geste darstellt, und durch eine Reihe kreisförmiger Punkte, die die Position einzelner Finger darstellen.

Der Standardwert ist pointer wenn die INPUT_PROP_SEMI_MT festgelegt ist, oder spots andere Weise.

X und Y Felder

Die Felder X und Y enthalten Positionsinformationen für die Mitte des Kontaktbereichs.

Berechnung

Die Berechnung ist unkompliziert: Positionsinformationen vom Touch-Treiber werden linear in das Ausgabekoordinatensystem interpoliert.

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 Felder

Die Felder TouchMajor und TouchMinor beschreiben die ungefähren Abmessungen der Kontaktfläche in Ausgabeeinheiten (Pixel).

Die Felder ToolMajor und ToolMinor beschreiben die ungefähren Abmessungen des Werkzeugs selbst in Ausgabeeinheiten (Pixel).

Das Feld Size beschreibt die normalisierte Größe der Berührung relativ zur größtmöglichen Berührung, die das Berührungsgerät erfassen kann. Die kleinstmögliche normalisierte Größe ist 0,0 (kein Kontakt oder nicht messbar) und die größtmögliche normalisierte Größe ist 1,0 (Sensorfläche ist gesättigt).

Wenn sowohl die ungefähre Länge als auch die ungefähre Breite gemessen werden können, gibt das TouchMajor Feld die längere Abmessung und das TouchMinor Feld die kürzere Abmessung der Kontaktfläche an. Wenn nur der ungefähre Durchmesser der Kontaktfläche gemessen werden kann, sind die Felder TouchMajor und TouchMinor gleich.

Ebenso gibt das ToolMajor Feld die längere Abmessung und das ToolMinor Feld die kürzere Abmessung der Querschnittsfläche des Werkzeugs an.

Wenn die Berührungsgröße nicht verfügbar ist, die Werkzeuggröße jedoch verfügbar ist, wird die Werkzeuggröße gleich der Berührungsgröße eingestellt. Wenn umgekehrt die Werkzeuggröße nicht verfügbar ist, die Berührungsgröße jedoch verfügbar ist, wird die Berührungsgröße gleich der Werkzeuggröße eingestellt.

Touch-Geräte messen oder melden die Touch- und Werkzeuggröße auf verschiedene Arten. Die aktuelle Implementierung unterstützt drei verschiedene Arten von Messungen: Durchmesser, Fläche und geometrischer Begrenzungsrahmen in Oberflächeneinheiten.

touch.size.calibration

Definition: touch.size.calibration = none | geometric | diameter | area | default

Gibt die Art der Messung an, mit der der Touch-Treiber die Touch-Größe und die Werkzeuggröße angibt.

  • Wenn der Wert none , wird die Größe auf Null gesetzt.

  • Wenn der Wert geometric , wird angenommen, dass die Größe in denselben Oberflächeneinheiten wie die Position angegeben wird, sodass sie auf dieselbe Weise skaliert wird.

  • Wenn der Wert diameter , wird angenommen, dass die Größe proportional zum Durchmesser (Breite) der Berührung oder des Werkzeugs ist.

  • Wenn der Wert area , wird angenommen, dass die Größe proportional zur Fläche der Berührung oder des Werkzeugs ist.

  • Wenn der Wert default , verwendet das System die geometric Kalibrierung, wenn die Achse raw.touchMajor oder raw.toolMajor verfügbar ist, andernfalls verwendet es die Kalibrierung none .

touch.size.scale

Definition: touch.size.scale = <a nichtnegative Gleitkommazahl>

Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.

Der Standardwert ist 1.0 .

touch.size.bias

Definition: touch.size.bias = <a nichtnegative Gleitkommazahl>

Gibt einen konstanten Vorspannungswert an, der bei der Kalibrierung verwendet wird.

Der Standardwert ist 0.0 .

touch.size.isSummed

Definition: touch.size.isSummed = 0 | 1

Gibt an, ob die Größe als Summe der Größen aller aktiven Kontakte oder für jeden Kontakt einzeln angegeben wird.

  • Wenn der Wert 1 , wird die gemeldete Größe vor der Verwendung durch die Anzahl der Kontakte geteilt.

  • Wenn der Wert 0 , wird die gemeldete Größe unverändert verwendet.

Der Standardwert ist 0 .

Einige Touch-Geräte, insbesondere "Semi-MT" -Geräte, können die einzelnen Abmessungen mehrerer Kontakte nicht unterscheiden, sodass sie eine Größenmessung melden, die ihre Gesamtfläche oder -breite darstellt. Diese Eigenschaft sollte nur für solche Geräte auf 1 werden. Setzen Sie diesen Wert im Zweifelsfall auf 0 .

Berechnung

Die Berechnung der TouchMajor , TouchMinor , ToolMajor , ToolMinor und Size hängt von den angegebenen Kalibrierungsparametern ab.

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

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

A zero pressure indicates that the tool is hovering.

touch.pressure.calibration

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

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

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

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

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

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

touch.pressure.scale

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

Specifies a constant scale factor used in the calibration.

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

Calculation

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

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

Orientation and Tilt Fields

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

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

touch.orientation.calibration

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

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

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

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

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

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

Calculation

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

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

Distance Field

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

touch.distance.calibration

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

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

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

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

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

touch.distance.scale

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

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Calculation

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

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

Example

# Input device configuration file for a touch screen that supports pressure,
# size and orientation.  The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters will need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

Compatibility Notes

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

Older touch device drivers may also need to be updated.

Virtual Key Map Files

Touch devices are often used to implement virtual keys.

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

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

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

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

Syntax

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

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

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

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

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

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

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

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

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

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

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

Example

Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely .

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

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

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

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

type SPECIAL_FUNCTION

Indirect Multi-touch Pointer Gestures

In pointer mode, the system interprets the following gestures:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

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

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

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

  6. Multiple finger motion: freeform gesture.

Further Reading

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