Geräte mit Touchscreen

Android unterstützt eine Vielzahl von Touchscreens und Touchpads, einschließlich Stift-basierter Eingabetablets.

Touchscreens sind Touchscreens, die mit einem Bildschirm so verbunden sind, dass der Nutzer den Eindruck hat, Elemente auf dem Bildschirm direkt zu manipulieren.

Touchpads sind Touch-Geräte, die nicht mit einem Display verbunden sind, z. B. ein Eingabestift-Tablet. Touchpads werden in der Regel zum Bewegen des Mauszeigers oder zur absoluten indirekten Positionierung oder gestenbasierten Steuerung einer Benutzeroberfläche verwendet.

Touchbedienungen können Tasten haben, deren Funktionen denen von Maustasten ähneln.

Je nach Touchsensortechnologie können Touchgeräte manchmal mit verschiedenen Tools wie Fingern oder einem Eingabestift bedient werden.

Touchbildschirme werden manchmal zur Implementierung virtueller Tasten verwendet. Bei einigen Android-Geräten reicht der Touchscreen-Sensorbereich beispielsweise über den Rand des Displays hinaus und dient als Touchbedienung für eine Tastatur.

Aufgrund der großen Vielfalt an Touchgeräten verwendet Android eine große Anzahl von Konfigurationseigenschaften, um die Eigenschaften und das gewünschte Verhalten jedes Geräts zu beschreiben.

Klassifizierung von Touchgeräten

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

  • Das Eingabegerät meldet die Anwesenheit der absoluten Achsen ABS_MT_POSITION_X und ABS_MT_POSITION_Y.
  • Das Eingabegerät hat keine Gamepad-Tasten. Mit dieser Bedingung wird eine Unklarheit bei bestimmten Gamepads behoben, die Achsen mit Codes melden, die sich mit denen der MT-Achsen überschneiden.

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

  • Das Eingabegerät wird nicht als Multitouch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Gerät mit Ein- oder als Gerät mit Mehrfachberührung klassifiziert, niemals als beides.
  • Das Eingabegerät meldet die Anwesenheit der absoluten Achsen ABS_X und ABS_Y sowie des Schlüsselcodes BTN_TOUCH.

Wenn ein Eingabegerät als Touchgerät klassifiziert wird, wird das Vorhandensein virtueller Schlüssel ermittelt, indem versucht wird, die virtuelle Tastenbelegungsdatei für das Gerät zu laden. Wenn eine virtuelle Tastenzuordnung verfügbar ist, wird auch die Tastenlayoutdatei für das Gerät geladen. Informationen zum Speicherort und Format dieser Dateien finden Sie unter [Dateien mit virtuellen Schlüsselkarten](#virtual-key-map-files).

Als Nächstes lädt das System die Konfigurationsdatei des Eingabegeräts für das Touchgerät.

Alle integrierten Touchbedienungen sollten Konfigurationsdateien für Eingabegeräte haben. Wenn keine Konfigurationsdatei für das Eingabegerät vorhanden ist, wählt das System eine Standardkonfiguration aus, die für Touch-Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder Touchpads geeignet ist. Diese Standardeinstellungen sind nicht für integrierte Touchscreens vorgesehen und können zu Fehlfunktionen führen.

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

  • Ein Touchscreen wird zur direkten Manipulation von Objekten auf dem Bildschirm verwendet. Der Nutzer berührt den Bildschirm direkt, sodass das System keine zusätzlichen Angebote benötigt, um anzuzeigen, welche Objekte manipuliert werden.
  • Ein Touchpad liefert einer App Informationen zur absoluten Position von Berührungen in einem bestimmten Sensorbereich. Sie kann für Tablet-Zeichner nützlich sein.
  • Ein Zeiger wird zur indirekten Manipulation von Objekten auf dem Bildschirm mithilfe eines Cursors verwendet. Finger werden als Multi-Touch-Zeigerbewegungen interpretiert. Andere Tools wie Eingabestifte werden anhand von absoluten Positionen interpretiert. Weitere Informationen finden Sie unter Indirekte Touch-Gesten für den Multi-Touch-Zeiger.

Anhand der folgenden Regeln wird das Eingabegerät als Touchscreen, Touchpad oder Zeigegerät klassifiziert.

  • Wenn die Property touch.deviceType festgelegt ist, wird der Gerätetyp wie angegeben festgelegt.
  • Wenn das Eingabegerät die INPUT_PROP_DIRECT-Eingabeeigenschaft (über die EVIOCGPROP-ioctl) meldet, wird der Gerätetyp auf Touchscreen festgelegt. Bei dieser Bedingung wird davon ausgegangen, dass Geräte mit direkter Eingabe per Touchscreen an ein Display angeschlossen sind, das ebenfalls verbunden ist.
  • Wenn das Eingabegerät die INPUT_PROP_POINTER-Eingabeeigenschaft (über die EVIOCGPROP-ioctl) meldet, wird der Gerätetyp auf pointer gesetzt.
  • Wenn das Eingabegerät die relativen Achsen REL_X oder REL_Y meldet, wird der Gerätetyp auf Touchpad festgelegt. Diese Bedingung beseitigt Mehrdeutigkeiten bei Eingabegeräten, die sowohl aus einer Maus als auch einem Touchpad bestehen. In diesem Fall wird der Touchpad nicht zum Bewegen des Mauszeigers verwendet, da dies bereits über die Maus geschieht.
  • Andernfalls wird der Gerätetyp auf Zeiger eingestellt. Diese Standardeinstellung sorgt dafür, dass Touchpads, die nicht für einen anderen speziellen Zweck bestimmt sind, den Cursor steuern.

Tasten

Schaltflächen sind optionale Steuerelemente, mit denen Apps zusätzliche Funktionen ausführen können. Schaltflächen auf Touchbildschirmen funktionieren ähnlich wie Mausschaltflächen und werden hauptsächlich mit Touchbildschirmen vom Zeigertyp oder mit einem Eingabestift verwendet.

Die folgenden Schaltflächen werden unterstützt:

  • BTN_LEFT: Zugewiesen zu MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: Zugewiesen zu MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: Zugewiesen zu MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK und BTN_SIDE: zugeordnet zu MotionEvent.BUTTON_BACK. Durch Drücken dieser Schaltfläche wird gleichzeitig ein Tastendruck mit dem Tastencode KeyEvent.KEYCODE_BACK erzeugt.
  • BTN_FORWARD und BTN_EXTRA: zugeordnet zu MotionEvent.BUTTON_FORWARD. Durch Drücken dieser Taste wird auch eine Tastenbetätigung mit dem Tastencode KeyEvent.KEYCODE_FORWARD simuliert.
  • BTN_STYLUS: Zugewiesen zu MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: Zugewiesen zu MotionEvent.BUTTON_TERTIARY.

Tools und Tooltypen

Ein Tool ist ein Finger, ein Eingabestift oder ein anderes Gerät, mit dem Sie mit dem Touchgerät interagieren. Einige Touch-Geräte können zwischen verschiedenen Werkzeugen unterscheiden.

In anderen Android-Kontexten, wie in der MotionEvent API, wird ein Tool oft als Zeiger bezeichnet.

Die folgenden Tooltypen werden unterstützt:

  • BTN_TOOL_FINGER und MT_TOOL_FINGER: Zugewiesen zu MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN und MT_TOOL_PEN: zugeordnet zu MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: Zugewiesen zu MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: Zugewiesen zu MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: Zugewiesen zu MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: Zugeordnet zu MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: Zugewiesen zu MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: Zugewiesen zu MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP und BTN_TOOL_QUADTAP: Wird MotionEvent.TOOL_TYPE_FINGER zugeordnet.

Tools zum Bewegen des Mauszeigers und zum Berühren

Die Tools können entweder das Touchgerät berühren oder sich in Reichweite befinden und darüber schweben. Nicht alle Touchbildschirme können erkennen, wenn ein Tool über dem Touchbildschirm schwebt. Geräte, die dies tun, z. B. RF-basierte Eingabestift-Digitizer, können oft erkennen, wenn sich das Tool in einem begrenzten Bereich des Digitizers befindet.

Die InputReader-Komponente unterscheidet Touch-Tools von Hover-Tools. Ebenso werden Touch-Tools und Hover-Tools Apps unterschiedlich gemeldet.

Berührungstools werden Apps als Berührungsereignisse mit MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN und MotionEvent.ACTION_POINTER_UP gemeldet.

Tools, die beim Bewegen des Mauszeigers bewegt werden, werden Apps mithilfe von MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE und MotionEvent.ACTION_HOVER_EXIT als allgemeine Bewegungsereignisse gemeldet.

Anforderungen an Touchgerätetreiber

  • Touch-Gerätetreiber sollten nur die Achsen und Tastencodes für die unterstützten Achsen und Tasten registrieren. Das Registrieren nicht unterstützter Achsen oder Schlüsselcodes kann den Algorithmus zur Geräteklassifizierung 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 immer BTN_TOUCH verwendet wird, um anzuzeigen, ob das Tool den Bildschirm berührt. Daher sollte BTN_TOUCH nicht verwendet werden, um anzugeben, dass sich das Tool nur im Bereich befindet und schwebt.
  • Single-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
    • ABS_X: (ERFORDERLICH) gibt die X-Koordinate des Tools an.
    • ABS_Y: (ERFORDERLICH) gibt die Y-Koordinate des Tools an.
    • ABS_PRESSURE: (optional) Gibt den physischen Druck, der auf die Spitze des Werkzeugs ausgeübt wird, oder die Signalstärke des Berührungskontakts an.
    • ABS_TOOL_WIDTH: Optional: Gibt den Querschnitt oder die Breite des Touchkontakts oder des Tools selbst an.
    • ABS_DISTANCE: Optional. Gibt den Abstand des Tools von der Oberfläche des Touch-Geräts an.
    • ABS_TILT_X: Optional: Gibt die Neigung des Tools von der Oberfläche des Touch-Geräts entlang der X-Achse an.
    • ABS_TILT_Y: Optional: Gibt die Neigung des Tools von der Oberfläche des Touch-Geräts entlang der Y-Achse an.
    • BTN_TOUCH: (ERFORDERLICH) Gibt an, ob das Tool das Gerät berührt.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (optional) Status der Schaltfläche „Berichte“.
    • 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) Gibt den Tool-Typ an.
  • Auf Multitouch-Geräten werden die folgenden Linux-Eingabeereignisse verwendet:
    • ABS_MT_POSITION_X: (ERFORDERLICH) Die X-Koordinate des Tools.
    • ABS_MT_POSITION_Y: (ERFORDERLICH) Die Y-Koordinate des Tools.
    • ABS_MT_PRESSURE: Optional: Gibt den physischen Druck an, der auf die Spitze des Tools ausgeübt wird, oder die Signalstärke des Touchkontakts.
    • ABS_MT_TOUCH_MAJOR: Optional. Gibt den Querschnitt des Touchkontakts oder die Länge der längeren Dimension des Touchkontakts an.
    • ABS_MT_TOUCH_MINOR: Optional: Gibt die Länge der kürzeren Dimension des Touchkontakts an. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_TOUCH_MAJOR eine Flächenmessung enthält.
    • ABS_MT_WIDTH_MAJOR: (optional) gibt den Querschnittsbereich des Tools selbst oder die Länge der längeren Dimension des Tools an. Verwenden Sie diese Achse nur, wenn Sie die Abmessungen des Tools kennen.
    • ABS_MT_WIDTH_MINOR: (optional) Gibt die Länge der kürzeren Dimension des Tools selbst an. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_WIDTH_MAJOR eine Flächenmessung anzeigt oder die Abmessungen des Tools selbst nicht bekannt sind.
    • ABS_MT_ORIENTATION: (optional) Gibt die Ausrichtung des Tools an.
    • ABS_MT_DISTANCE: Optional. Gibt den Abstand des Tools zur Oberfläche des Touch-Geräts an.
    • ABS_MT_TOOL_TYPE: (optional) Meldet den Tooltyp als MT_TOOL_FINGER oder MT_TOOL_PEN an.
    • ABS_MT_TRACKING_ID: Optional: Die Tracking-ID des Tools. Die Tracking-ID ist eine beliebige nicht negative Ganzzahl, mit der jedes Tool unabhängig voneinander identifiziert und erfasst wird, wenn mehrere Tools aktiv sind. Wenn beispielsweise mehrere Finger das Gerät berühren, sollte jedem Finger eine eigene Tracking-ID zugewiesen werden. Diese wird verwendet, solange der Finger in Kontakt bleibt. Tracking-IDs können wiederverwendet werden, wenn sich die zugehörigen Tools außerhalb des zulässigen Bereichs befinden.
    • ABS_MT_SLOT: Optional: Gibt 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) gibt an, ob das Gerät das Gerät berührt.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (optional) Schaltfläche für Berichte .
    • 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) Gibt den Tool-Typ an.
  • Wenn sowohl Achsen 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 ignoriert.
  • Die Mindest- und Höchstwerte 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 Flächeneinheiten. Bei einem Touchscreen bezeichnet der aktive Bereich den Teil des Touchgeräts, der tatsächlich das Display bedeckt.

    Bei einem Touchscreen interpoliert das System automatisch die gemeldeten Touch-Positionen in Oberflächeneinheiten, um Touch-Positionen in Displaypixeln gemäß der folgenden Berechnung zu erhalten:

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

    Ein Touchscreen meldet möglicherweise Berührungen außerhalb des gemeldeten aktiven Bereichs.

    Berührungen, die außerhalb des aktiven Bereichs initiiert werden, werden nicht an Apps gesendet, können aber als virtuelle Schlüssel verwendet werden.

    Berührungen, die innerhalb des aktiven Bereichs gestartet werden oder den Displaybereich betreten und verlassen, werden an Apps gesendet. Wenn eine Berührung innerhalb der Grenzen einer App beginnt und sich dann aus dem aktiven Bereich hinausbewegt, empfängt die App möglicherweise Touch-Ereignisse mit Anzeigekoordinaten, die negativ oder jenseits der Displaygrenzen sind. Das ist ganz normal.

    Die Touch-Koordinaten eines Touch-Geräts dürfen niemals an den Grenzen des aktiven Bereichs eingeklemmt werden. Wenn ein Touch den aktiven Bereich verlässt, sollte er als außerhalb des aktiven Bereichs gemeldet werden oder gar nicht gemeldet werden.

    Wenn sich der Finger des Nutzers beispielsweise in der Nähe der oberen linken Ecke des Touchscreens befindet, wird möglicherweise die Koordinate (minX, minY) gemeldet. Bewegt sich der Finger weiter über den aktiven Bereich hinaus, sollte der Touchscreen entweder Koordinaten mit Komponenten melden, die kleiner als minX und minY sind, z. B. (minX - 2, minY - 3), oder der Touchscreen sollte gar keine Berührung mehr aufzeichnen. Mit anderen Worten: Der Touchscreen sollte (minX, minY) nicht melden, wenn sich der Finger des Nutzers tatsächlich außerhalb des aktiven Bereichs befindet.

    Wenn Touch-Koordinaten an den Displayrand gebunden werden, entsteht eine künstliche harte Begrenzung am Rand des Bildschirms. Dadurch wird verhindert, dass das System Bewegungen, die in den Anzeigebereich hinein- oder heraustreten, reibungslos erfassen kann.

  • Die von ABS_PRESSURE oder ABS_MT_PRESSURE gemeldeten Werte, sofern sie überhaupt gemeldet werden, müssen nicht null sein, wenn das Tool das Gerät berührt, und andernfalls null, um anzuzeigen, dass sich das Tool in der Position befindet.

    Angaben zur Auslastung in Berichten sind optional, werden aber dringend empfohlen. Apps können Druckinformationen verwenden, um druckempfindliches Zeichnen und andere Effekte zu implementieren.

  • Die Werte von ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR oder ABS_MT_WIDTH_MINOR sollten nicht null sein, wenn das Tool das Gerät berührt, andernfalls null. Dies ist jedoch nicht erforderlich. Das Touchgerät kann beispielsweise die Größe von Fingerkontakten messen, aber nicht von Eingabestiftkontakten.

    Informationen zur Größe von Berichten sind optional, werden aber dringend empfohlen. Apps können Druckinformationen verwenden, um größenabhängige Zeichnungen und andere Effekte zu implementieren.

  • Die von ABS_DISTANCE bzw. ABS_MT_DISTANCE gemeldeten Werte sollten gegen null gehen, wenn das Tool das Gerät berührt. Der Abstand kann ungleich null bleiben, auch wenn das Werkzeug in direktem Kontakt ist. Die genauen gemeldeten Werte hängen davon ab, wie die Hardware die Entfernung misst.

    Die Angabe von Entfernungsinformationen ist optional, wird aber für Eingabestiftgeräte empfohlen.

  • Die von ABS_TILT_X und ABS_TILT_Y gemeldeten Werte sollten null sein, wenn das Tool senkrecht zum Gerät gehalten wird. Eine Neigung ungleich null gibt an, dass das Werkzeug an einer Steigung gehalten wird.

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

    InputReader wandelt die Neigungskomponenten X und Y in einen senkrechten Neigungswinkel von 0 bis PI / 2 Radianten und einen ebenen Orientierungswinkel von -PI bis PI Radianten um. Diese Darstellung führt zu einer Beschreibung der Ausrichtung, die mit der Beschreibung von Fingerberührungen kompatibel ist.

    Das Melden von Informationen zur Neigung ist optional, wird aber für Geräte mit Eingabestift empfohlen.

  • Wenn der Tooltyp von ABS_MT_TOOL_TYPE gemeldet wird, ersetzt es alle von BTN_TOOL_* gemeldeten Informationen zum Tooltyp. Wenn keine Informationen zum Werkzeugtyp verfügbar sind, wird standardmäßig MotionEvent.TOOL_TYPE_FINGER verwendet.

  • Ein Tool wird anhand der folgenden Bedingungen als aktiv eingestuft:

    • Bei Verwendung des Protokolls für die einmalige Berührung ist das Tool aktiv, wenn BTN_TOUCH oder BTN_TOOL_* den Wert 1 hat.

      Diese Bedingung impliziert, dass InputReader zumindest einige Informationen über die Art des Tools haben muss, entweder über den Touchscreen oder zumindest über seinen Tooltyp. Wenn keine Informationen verfügbar sind, wird davon ausgegangen, dass das Tool inaktiv ist (außerhalb des Bereichs).

    • Bei Verwendung des Multitouch-Protokolls „A“ ist das Tool aktiv, wenn es im letzten Synchronisierungsbericht aufgeführt ist. Wenn das Tool nicht mehr in den Synchronisierungsberichten angezeigt wird, ist es nicht mehr verfügbar.
    • Bei Verwendung des Multitouch-Protokolls „B“ ist das Tool aktiv, solange es einen aktiven Slot hat. Wenn der Slot gelöscht wird, existiert das Tool nicht mehr.
  • Ein Tool wird anhand der folgenden Bedingungen als schwebend erkannt:
    • Wenn das Tool BTN_TOOL_MOUSE oder BTN_TOOL_LENS ist, wird es nicht schweben, auch wenn eine der folgenden Bedingungen erfüllt ist.
    • Wenn das Tool aktiv ist, der Fahrer Druckinformationen meldet und der gemeldete Druck null beträgt, bewegt sich das Tool über den Mauszeiger.
    • Wenn das Tool aktiv ist, der Treiber den Tastencode BTN_TOUCH unterstützt und BTN_TOUCH den Wert 0 hat, schwebt das Tool.
  • InputReader unterstützt sowohl das Multitouch-Protokoll „A“ als auch „B“. Neue Treiber sollten das Protokoll „B“ verwenden, aber beide funktionieren.
  • Ab Android 4.0 müssen Touchscreen-Treiber möglicherweise geändert werden, damit sie der Linux-Spezifikation für das Eingabeprotokoll entsprechen.

    Möglicherweise sind folgende Änderungen erforderlich:

    • Wenn ein Tool inaktiv wird, d. h. der Finger nach oben geht, sollte es in nachfolgenden Multi-Touch-Synchronisierungsberichten nicht mehr angezeigt werden. Wenn alle Tools inaktiv sind (alle Finger werden „hoch“ gehalten), sollte der Fahrer ein leeres Protokollpaket 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 physischen Druck oder zur Signalstärke sollten mit ABS_MT_PRESSURE erfasst werden.

      In früheren Android-Versionen wurden Auslastungsinformationen von ABS_MT_TOUCH_MAJOR abgerufen. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.

    • Informationen zur Größe des Touchbildschirms sollten mit ABS_MT_TOUCH_MAJOR angegeben werden.

      In früheren Android-Versionen wurden Größeninformationen aus ABS_MT_TOOL_MAJOR abgerufen. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.

    Treiber für Touch-Geräte erfordern keine Android-spezifischen Anpassungen mehr. Durch die Nutzung des standardmäßigen Linux-Eingabeprotokolls kann Android mit nicht modifizierten Treibern eine größere Vielfalt von Peripheriegeräten unterstützen, z. B. externe HID-Multi-Touch-Screens.

Bedienung per Touchscreen

Nachfolgend finden Sie eine kurze Zusammenfassung der Funktionsweise des Touch-Geräts unter Android.

  1. EventHub liest Rohereignisse aus dem evdev-Treiber.
  2. InputReader verbraucht die Rohereignisse und aktualisiert den internen Status hinsichtlich der Position und anderer Merkmale der einzelnen Tools. Er erfasst auch den Status von Schaltflächen.
  3. Wenn ZURÜCK oder VORAUS gedrückt oder losgelassen wurde, benachrichtigt InputReader InputDispatcher über das Schlüsselereignis.
  4. InputReader gibt an, ob eine virtuelle Tastenpresseung stattgefunden hat. In diesem Fall wird InputDispatcher über das Schlüsselereignis informiert.
  5. Mit InputReader wird ermittelt, ob die Berührung innerhalb der Grenzen des Displays gestartet wurde. In diesem Fall wird InputDispatcher über das Touch-Ereignis informiert.
  6. Wenn es keine Tools gibt, die sich berühren, aber mindestens ein Tool vorhanden ist, über das der Mauszeiger bewegt wird, benachrichtigt InputReader InputDispatcher über das Hover-Ereignis.
  7. Wenn der Touch-Gerätetyp Maus ist, führt InputReader die Mauszeiger-Gestenerkennung durch, bewegt den Mauszeiger und die Markierungen entsprechend und benachrichtigt InputDispatcher über das Mausereignis.
  8. InputDispatcher verwendet WindowManagerPolicy, um zu bestimmen, ob die Ereignisse ausgelöst und das Gerät aktiviert werden soll. Anschließend sendet InputDispatcher die Ereignisse an die entsprechenden Apps.

Konfiguration von Touchgeräten

Das Verhalten von Touchbedienungen wird durch die Achsen, Tasten, Eingabeeigenschaften, die Konfiguration des Eingabegeräts, die virtuelle Tastenzuordnung und das Tastenlayout des Geräts bestimmt.

In den folgenden Abschnitten finden Sie weitere Informationen zu den Dateien, die zur Tastaturkonfiguration gehören:

Properties

Das System verwendet viele Konfigurationseigenschaften für Eingabegeräte, um das Verhalten von Touchgeräten zu konfigurieren und zu kalibrieren.

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

Viele Touchbedienungen messen beispielsweise die Berührungsfläche 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 Apps nicht sinnvoll, da sie die physische Größe und andere Merkmale der Sensorknoten des Touch-Geräts kennen müssten.

Das System verwendet Kalibrierungsparameter, die in Konfigurationsdateien des Eingabegeräts codiert sind, um die vom Touchgerät gemeldeten Werte in eine einfachere Standarddarstellung zu decodieren, zu transformieren und zu normalisieren, die von Apps verstanden werden kann.

Konventionen für die Dokumentation

In der Dokumentation werden die vom System während der Kalibrierung verwendeten Werte mit den folgenden Konventionen beschrieben.

Rohe Achsenwerte

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

raw.x
Der Wert der ABS_X- oder ABS_MT_POSITION_X-Achse.
raw.y
Der Wert der ABS_Y- oder ABS_MT_POSITION_Y-Achse.
raw.pressure
Der Wert der Achse ABS_PRESSURE oder ABS_MT_PRESSURE oder 0, falls nicht verfügbar.
raw.touchMajor
Der Wert der ABS_MT_TOUCH_MAJOR-Achse oder „0“, wenn nicht verfügbar.
raw.touchMinor
Der Wert der ABS_MT_TOUCH_MINOR-Achse oder raw.touchMajor, wenn nicht verfügbar.
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 verfügbar.
raw.orientation
Der Wert der ABS_MT_ORIENTATION-Achse 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 ABS_TILT_Y-Achse oder 0, falls nicht verfügbar.

Bereiche der Rohachse

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

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. Wenn „fuzz“ beispielsweise den Wert „1“ hat, sind die Werte auf +/- 1 Einheit genau.
raw.width
Die Breite des Touchbereichs einschließlich Rahmen, entspricht raw.x.range + 1.
raw.height
Die einschließlich der Höhe des Touchbereichs, entspricht raw.y.range + 1.

Ausgabebereiche

Die folgenden Ausdrücke geben die Eigenschaften des Ausgabekoordinatensystems an. Das System verwendet die lineare Interpolation, um Informationen zur Touch-Position von den vom Touchgerät verwendeten Oberflächeneinheiten in die Ausgabeeinheiten umzuwandeln, die an Apps wie Displaypixel gesendet werden.

output.width
Die Ausgabebreite. Bei Touchscreens (die mit einem Display verknüpft sind) ist dies die Displaybreite in Pixeln. Bei Touchpads (nicht mit einem Display verknüpft) entspricht die Ausgabebreite raw.width, was bedeutet, dass keine Interpolation erfolgt.
output.height
Die Ausgabehöhe. Bei Touchscreens (die mit einem Display verknüpft sind) ist dies die Displayhöhe in Pixeln. Bei Touchpads (nicht mit einem Display verknüpft) ist die Ausgabehöhe raw.height, was bedeutet, dass keine Interpolation durchgeführt wird.
output.diag
Die diagonale Länge des Ausgabekoordinatensystems, entspricht sqrt(output.width ^2 + output.height ^2).

Grundlegende Konfiguration

Der Touch-Eingabe-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 Typ des Touch-Geräts an.

  • Wenn der Wert touchScreen ist, ist das Touchgerät ein Touchscreen, der mit einem Display verbunden ist.

  • Wenn der Wert touchPad ist, handelt es sich beim Touchgerät um ein Touchpad, das nicht mit einem Display verknüpft ist.

  • Wenn der Wert pointer ist, handelt es sich beim Touchgerät um ein Touchpad, das nicht mit einem Display verknüpft ist. Die Bewegungen werden für indirekte Multi-Touch-Mauszeigergesten verwendet.

  • Wenn der Wert default ist, erkennt das System den Gerätetyp automatisch anhand des Klassifizierungsalgorithmus.

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

Unter Android 3 und niedriger wurden alle Touch-Geräte als Touchscreens angenommen.

touch.orientationAware

Definition:touch.orientationAware = 0 | 1

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

  • Wenn der Wert 1 ist, werden die vom Touch-Gerät gemeldeten Berührungspositionen gedreht, wenn sich die Displayausrichtung ändert.

  • Wenn der Wert 0 ist, sind die vom Touchgerät gemeldeten Touch-Positionen unabhängig von Änderungen der Displayausrichtung.

Der Standardwert ist 1, wenn es sich um ein Gerät mit Touchscreen handelt, andernfalls 0.

Das System unterscheidet zwischen internen und externen Touchscreens und Displays. Ein richtungsabhängiger interner Touchscreen wird entsprechend der Ausrichtung des internen Displays gedreht. Ein richtungsabhängiger externer Touchscreen wird entsprechend der Ausrichtung des externen Displays gedreht.

Die Ausrichtung 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 im Uhrzeigersinn von seiner natürlichen Ausrichtung gedreht wird, werden die absoluten Positionen von Berührungen neu zugeordnet, sodass eine Berührung in der linken oberen Ecke des absoluten Koordinatensystems des Touchscreens als Berührung in der linken oberen Ecke des gedrehten Koordinatensystems des Displays gemeldet wird. Dadurch werden Berührungen mit demselben Koordinatensystem erfasst, das Apps zum Zeichnen ihrer visuellen Elemente verwenden.

Vor Honeycomb wurde angenommen, dass alle Touchgeräte die Ausrichtung berücksichtigen.

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

Gibt den Präsentationsmodus für Zeigefingergesten an. Diese Konfigurationseigenschaft ist nur relevant, wenn das Touchgerät vom Typ Zeiger ist.

  • Wenn der Wert pointer ist, werden die Touchpad-Gesten durch einen Cursor dargestellt, der einem Mauszeiger ähnelt.

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

Der Standardwert ist pointer, wenn die Eingabeeigenschaft INPUT_PROP_SEMI_MT festgelegt ist, andernfalls spots.

X- und Y-Felder

Die Felder „X“ und „Y“ enthalten Positionsinformationen für den Mittelpunkt des Kontaktbereichs.

Berechnung

Die Berechnung ist einfach: Die Positionierungsinformationen des Touch-Treibers 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

Felder „touchMajor“, „touchMinor“, „toolMajor“, „toolMinor“ und „size“

Die Felder touchMajor und touchMinor beschreiben die ungefähren Abmessungen der Kontaktfläche in Ausgabeeinheiten (Pixeln).

Die Felder toolMajor und toolMinor beschreiben die ungefähren Abmessungen des Tools selbst in Ausgabeeinheiten (Pixeln).

Das Feld size beschreibt die normalisierte Größe des Touch-Ereignisses im Vergleich zum größten möglichen Touch-Ereignis, das das Touch-Gerät erkennen kann. Die kleinstmögliche normalisierte Größe ist 0, 0 (kein Kontakt oder nicht messbar) und die größte normalisierte Größe ist 1,0 (Sensorbereich ist gesättigt).

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

Ebenso gibt das Feld toolMajor die größere und das Feld toolMinor die kleinere Dimension des Querschnitts des Werkzeugs an.

Wenn die Touch-Größe nicht verfügbar ist, die Tool-Größe aber schon, wird die Tool-Größe auf die Touch-Größe festgelegt. Wenn die Toolgröße nicht verfügbar ist, die Touch-Größe aber, wird die Touch-Größe auf die Toolgröße festgelegt.

Auf Touchbildschirmen werden die Größe des Touch-Ereignisses und die Größe des Tools auf unterschiedliche Weise gemessen oder erfasst. Die aktuelle Implementierung unterstützt drei verschiedene Arten von Messungen: Durchmesser, Fläche und geometrischer Begrenzungsrahmen in Flächeneinheiten.

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

Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Touch- und Toolgröße zu melden.

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

  • Wenn der Wert geometric ist, wird davon ausgegangen, dass die Größe in denselben Flächeneinheiten wie die Position angegeben ist. Sie wird daher auf dieselbe Weise skaliert.

  • Wenn der Wert diameter ist, wird davon ausgegangen, dass die Größe proportional zum Durchmesser (Breite) des Touch-Elements oder Tools ist.

  • Wenn der Wert area ist, wird davon ausgegangen, dass die Größe proportional zur Fläche des Touchbildschirms oder Tools ist.

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

touch.size.scale

Definition: touch.size.scale = <eine nicht negative Gleitkommazahl>

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

Der Standardwert ist 1.0.

touch.size.bias

Definition: touch.size.bias = <eine nicht negative Gleitkommazahl>

Gibt einen konstanten Biaswert 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 einzeln für jeden Kontakt erfasst wird.

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

  • Wenn der Wert 0 ist, 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 und melden daher eine Größe, die die Gesamtfläche oder Breite darstellt. Diese Property sollte nur für solche Geräte auf 1 festgelegt werden. Im Zweifelsfall setzen Sie diesen Wert auf 0.

Berechnung

Die Berechnung der Felder 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

Druckfeld

Das Feld pressure beschreibt den ungefähren physischen Druck, der auf das Touch-Gerät ausgeübt wird, als normalisierten Wert zwischen 0,0 (keine Berührung) und 1,0 (Normaldruck).

Ein Nulldruck bedeutet, dass das Werkzeug schwebt.

touch.pressure.calibration

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

Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um den Druck zu melden.

  • Wenn der Wert none ist, ist der Druck unbekannt. Er wird dann auf 1,0 gesetzt, wenn der Finger auf das Display gedrückt wird, und auf 0,0, wenn der Finger nur darüber schwebt.

  • Wenn der Wert physical ist, wird angenommen, dass die Druckachse die tatsächliche physische Druckstärke misst, die auf das Touchpad ausgeübt wird.

  • Wenn der Wert amplitude ist, wird davon ausgegangen, dass die Druckachse die Signalamplitude misst, die mit der Größe des Kontakts und dem ausgeübten Druck zusammenhängt.

  • Wenn der Wert default ist, verwendet das System die physical-Kalibrierung, wenn die Druckachse verfügbar ist, andernfalls none.

Touch.Druck.Skalierung

Definition: touch.pressure.scale = <eine nicht negative Gleitkommazahl>

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

Der Standardwert ist 1.0 / raw.pressure.max.

Berechnung

Die Berechnung des Felds pressure hängt von den angegebenen Kalibrierungsparametern ab.

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

Felder für Ausrichtung und Neigung

Im Feld orientation wird die Ausrichtung der Berührung und des Tools als Winkelmessung angegeben. Eine Ausrichtung von 0 gibt an, dass die Hauptachse vertikal ausgerichtet ist, -PI/2, dass sie nach links ausgerichtet ist, und PI/2, dass sie nach rechts ausgerichtet ist. Wenn ein Eingabestift verwendet wird, kann der Orientierungsbereich als voller Kreis von -PI oder PI beschrieben werden.

Im Feld tilt wird die Neigung des Tools als Winkelmessung beschrieben. Eine Neigung von 0 gibt an, dass das Tool senkrecht zur Oberfläche ist. Eine Neigung von PI/2 bedeutet, dass das Tool flach auf der Oberfläche aufliegt.

touch.orientation.calibration

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

Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Ausrichtung zu melden.

  • Wenn der Wert none ist, ist die Ausrichtung unbekannt und wird auf 0 gesetzt.
  • Wenn der Wert interpolated ist, wird die Ausrichtung linear interpoliert, sodass ein Rohwert von raw.orientation.min auf -PI/2 und ein Rohwert von raw.orientation.max auf PI/2 abgebildet wird. Der Mittelwert von (raw.orientation.min + raw.orientation.max) / 2 entspricht 0.
  • Wenn der Wert vector ist, wird die Ausrichtung als komprimierter Vektor interpretiert, der aus zwei vorzeichenbehafteten 4‑Bit-Feldern besteht. Diese Darstellung wird für Atmel Object Based Protocol-Teile verwendet. Nach der Decodierung liefert der Vektor einen Ausrichtungswinkel und eine Konfidenzgröße. Die Konfidenzgröße wird zum Skalieren der Größeninformationen verwendet, sofern sie nicht geometrisch ist.
  • Wenn der Wert default ist, verwendet das System die interpolated-Kalibrierung, wenn die Ausrichtungsachse verfügbar ist, andernfalls none.

Berechnung

Die Berechnung der Felder orientation und tilt hängt von den angegebenen Kalibrierungsparametern und der verfügbaren Eingabe ab.

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

Feld „Entfernung“

Das Feld distance beschreibt den Abstand zwischen dem Tool und der Oberfläche des Touch-Geräts. Ein Wert von 0,0 bedeutet direkten Kontakt und größere Werte einen zunehmenden Abstand von der Oberfläche.

touch.distance.calibration

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

Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Entfernung zu melden.

  • Wenn der Wert none ist, ist die Entfernung unbekannt und wird daher auf 0 festgelegt.

  • Wenn der Wert scaled ist, wird die gemeldete Entfernung mit einem konstanten Skalenfaktor multipliziert.

  • Wenn der Wert default ist, verwendet das System die scaled-Kalibrierung, wenn die Entfernungsachse verfügbar ist, andernfalls none.

touch.distance.scale

Definition: touch.distance.scale = <eine nicht negative Gleitkommazahl>

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

Der Standardwert ist 1.0.

Berechnung

Die Berechnung des Felds distance hängt von den angegebenen Kalibrierungsparametern ab.

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

Verwendungsbeispiele

# 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

Kompatibilitätshinweise

Die Konfigurationseigenschaften für Touch-Geräte haben sich in Android Ice Cream Sandwich 4.0 erheblich geändert. Alle Konfigurationsdateien für Eingabegeräte für Touchgeräte müssen aktualisiert werden, damit die neuen Konfigurationseigenschaften verwendet werden können.

Ältere Treiber für Touch-Geräte müssen möglicherweise ebenfalls aktualisiert werden.

Dateien mit virtuellen Tastenbelegungen

Auf Touchbildschirmen können virtuelle Tasten implementiert werden.

Je nach den Funktionen des Touch-Controllers gibt es dafür mehrere Möglichkeiten. Einige Touch-Controller können direkt für die Implementierung von Softkeys konfiguriert werden, indem Firmware-Register festgelegt werden. In anderen Fällen ist es wünschenswert, die Zuordnung von Touch-Koordinaten zu Tastencodes in der Software vorzunehmen.

Wenn virtuelle Tasten in der Software implementiert sind, muss der Kernel eine Datei mit einer virtuellen Tastenzuordnung namens virtualkeys.<devicename> als Board-Eigenschaft exportieren. Wenn die Treiber für das Touchscreen-Gerät beispielsweise als Namen „touchyfeely“ angeben, muss die Virtual Key Map-Datei den Pfad /sys/board_properties/virtualkeys.touchyfeely haben.

Eine Datei mit einer virtuellen Tastenkarte beschreibt die Koordinaten und Linux-Tastencodes der virtuellen Tasten auf dem Touchscreen.

Zusätzlich zur virtuellen Tastenbelegungsdatei muss eine entsprechende Tastenlayoutdatei und eine Schlüsselzeichenzuordnungsdatei vorhanden sein, um die Linux-Tastencodes den Android-Tastencodes zuzuordnen und den Typ des Tastaturgeräts anzugeben (in der Regel SPECIAL_FUNCTION).

Syntax

Eine Datei mit einer virtuellen Tastenbelegung ist eine Nur-Text-Datei, die eine Abfolge von Beschreibungen des Layouts virtueller Tasten enthält, die entweder durch neue Zeilen oder durch Doppelpunkte getrennt sind.

Kommentarzeilen beginnen mit „#“ und gehen bis zum Ende der Zeile.

Jeder virtuelle Schlüssel wird durch sechs durch Doppelpunkte getrennte Komponenten beschrieben:

  • 0x01: Einen Versionscode. Muss immer 0x01 sein.
  • <Linux key code>: Der Linux-Schlüsselcode des virtuellen Schlüssels.
  • <centerX>: Die X-Pixelkoordinate des Mittelpunkts des virtuellen Schlüssels.
  • <centerY>: Die Y-Pixelkoordinate der Mitte der virtuellen Taste.
  • <width>: Die Breite des virtuellen Schlüssels in Pixeln.
  • <height>: Höhe des virtuellen Schlüssels in Pixeln.

Alle Koordinaten und Größen werden im Displaykoordinatensystem angegeben.

Hier ist eine virtuelle Keymap-Datei, die alle in einer Zeile geschrieben ist.

# 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

Die gleiche Datei mit der virtuellen Tastenzuordnung kann auch auf mehreren Zeilen geschrieben werden.

# 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

Im obigen Beispiel hat der Touchscreen eine Auflösung von 480 x 800. Daher haben alle virtuellen Tasten die <centerY>-Koordinate 835, was etwas unter dem sichtbaren Bereich des Touchscreens liegt.

Der erste Schlüssel hat den Linux-Scancode 158 (KEY_BACK), centerX von 55, centerY 835, Breite 90 und Höhe 55.

Verwendungsbeispiele

Datei mit der virtuellen Tastenbelegung: /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

Schlüssellayoutdatei: /system/usr/keylayout/touchyfeely.kl.

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

Key Character Map-Datei: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Indirekte Multi-Touch-Gesten

Im Zeigermodus werden die folgenden Touch-Gesten vom System interpretiert:

  • Einmal mit einem Finger tippen: Klick.
  • Bewegung mit einem Finger: Bewegen Sie den Mauszeiger.
  • Bewegung mit einem Finger und Drücken von Tasten: Ziehen Sie den Cursor.
  • Bewegung mit zwei Fingern in dieselbe Richtung: Ziehen Sie den Bereich unter dem Zeiger in diese Richtung. Der Cursor selbst bewegt sich nicht.
  • Bewegung mit zwei Fingern, die sich aufeinander zu oder in verschiedene Richtungen bewegen: Schwenken/Zoomen/Drehen des Bereichs um den Cursor. Der Zeiger selbst bewegt sich nicht.
  • Mehrfingerbewegung: Freiform-Touch-Geste.

Ablehnung der Hand

Ab Android 13 kann das System Eingaben von Handflächen automatisch ablehnen, wenn das integrierte Framework aktiviert ist. Interne, benutzerdefinierte Lösungen werden weiterhin unterstützt, obwohl sie möglicherweise geändert werden müssen, um das Flag TOOL_TYPE_PALM zurückzugeben, wenn eine Handfläche erkannt wird. Das integrierte Framework funktioniert auch in Verbindung mit benutzerdefinierten Lösungen.

Das tatsächliche Modell betrachtet die ersten 90 ms der Gestendaten am aktuellen Zeiger und die umgebenden Zeiger und berücksichtigt dann, wie weit die Berührungen vom Displayrand entfernt sind. Anschließend wird für jeden Zeiger ermittelt, ob es sich um eine Handfläche handelt. Außerdem wird die von touchMajor und touchMinor gemeldete Größe jedes Kontakts berücksichtigt. Das Android-Framework entfernt dann die als Handflächen gekennzeichneten Mauszeiger aus dem Touchstream.

Wenn bereits ein Verweis an die Apps gesendet wurde, geschieht Folgendes:

  • (Wenn andere aktive Zeiger vorhanden sind) bricht den Zeiger mit festgelegtem ACTION_POINTER_UP und FLAG_CANCELED ab.
  • (Wenn dies der einzige Verweis ist) Der Verweis wird mit ACTION_CANCEL abgebrochen.

Eine öffentliche API, MotionEvent.FLAG_CANCELED, gibt an, dass das aktuelle Ereignis keine Nutzeraktion auslösen sollte. Dieses Flag ist sowohl für ACTION_CANCEL als auch für ACTION_POINTER_UP gesetzt.

Wenn der Palm-Cursor nicht an Apps gesendet wurde, wird er vom System einfach gelöscht.

Palm Rejection aktivieren

  1. Verwende in deinem Touch-Treiber das input_abs_set_res-Makro, um die Auflösungen für die folgenden Felder festzulegen (Einheiten sind Pixel pro mm):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Die Unterstützung von ABS_MT_TOUCH_MINOR ist optional. Wenn dein Gerät die Funktion jedoch unterstützt, achte darauf, dass die Auflösung richtig eingestellt ist.

  2. Führen Sie folgenden Befehl aus, um zu prüfen, ob die Felder richtig festgelegt sind:
        $ adb shell getevent -li
    
  3. So aktivieren Sie die Funktion während der Laufzeit:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Starte den system_server-Prozess neu.
         $ adb shell stop && adb shell start
        
  5. Prüfen Sie, ob adb shell dumpsys input zeigt, dass sich in UnwantedInteractionBlocker Palm-Rejectoren befinden. Wenn das nicht der Fall ist, prüfen Sie die Eingabe-Logs, um Hinweise auf eine mögliche Fehlkonfiguration zu finden.

    Hier ein Beispiel:

    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. Fügen Sie den entsprechenden Sysprop-Befehl in die Datei init**rc ein, um das Feature dauerhaft zu aktivieren:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Weitere Informationen