Touchgeräte

Android unterstützt eine Vielzahl von Touchscreens und Touchpads, einschließlich stiftbasierter Digitizer-Tablets.

Touchscreens sind Touch-Geräte, die mit einem Display verknüpft sind, sodass der Nutzer den Eindruck hat, Elemente auf dem Bildschirm direkt zu bearbeiten.

Touchpads sind Touch-Geräte, die nicht mit einem Display verknüpft sind, z. B. ein Grafiktablett. Touchpads werden in der Regel zum Zeigen oder für die absolute indirekte Positionierung oder gestenbasierte Steuerung einer Benutzeroberfläche verwendet.

Touch-Geräte können Tasten haben, deren Funktionen denen von Maustasten ähneln.

Touch-Geräte können je nach zugrunde liegender Touch-Sensortechnologie manchmal mit verschiedenen Tools wie Fingern oder einem Eingabestift bedient werden.

Touch-Geräte werden manchmal verwendet, um virtuelle Tasten zu implementieren. Auf einigen Android-Geräten erstreckt sich der Touchscreen-Sensorbereich beispielsweise über den Rand des Displays hinaus und dient gleichzeitig als Teil einer berührungsempfindlichen Tastatur.

Aufgrund der großen Vielfalt an Touch-Geräten verwendet Android eine große Anzahl von Konfigurationseigenschaften, um die Merkmale und das gewünschte Verhalten der einzelnen Geräte zu beschreiben.

Klassifizierung von Touch-Geräten

Ein Eingabegerät wird als Multi-Touch-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 hat keine Gamepad-Tasten. Diese Bedingung löst eine Mehrdeutigkeit bei bestimmten Gamepads auf, die Achsen mit Codes melden, die sich mit denen der MT-Achsen überschneiden.

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

  • Das Eingabegerät ist nicht als Multi-Touch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Single-Touch- oder als Multi-Touch-Gerät klassifiziert, nie als beides.
  • Das Eingabegerät meldet das Vorhandensein der absoluten Achsen ABS_X und ABS_Y sowie des Tastencodes BTN_TOUCH.

Wenn ein Eingabegerät als Touch-Gerät klassifiziert wird, wird das Vorhandensein virtueller Tasten durch den Versuch bestimmt, die Datei mit der virtuellen Tastenzuordnung für das Gerät zu laden. Wenn eine virtuelle Tastenbelegung verfügbar ist, wird auch die Tastenlayoutdatei für das Gerät geladen. Informationen zum Speicherort und Format dieser Dateien finden Sie unter [Dateien für virtuelle Tastenbelegung](#virtual-key-map-files).

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

Alle integrierten Touchgeräte 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 allgemeine Touch-Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder Touchpads geeignet ist. Diese Standardeinstellungen sind nicht für integrierte Touchscreens gedacht und können zu fehlerhaftem Verhalten führen.

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

  • Ein Touchscreen-Gerät wird für die direkte Manipulation von Objekten auf dem Bildschirm verwendet. Der Nutzer berührt das Display direkt, sodass das System keine zusätzlichen Affordanzen benötigt, um die manipulierten Objekte anzuzeigen.
  • Ein Touchpad-Gerät wird verwendet, um einer App Informationen zur absoluten Positionierung von Berührungen auf einem bestimmten Sensorbereich bereitzustellen. Sie kann für Digitalisiertablets nützlich sein.
  • Ein Zeigegerät wird für die indirekte Manipulation von Objekten auf dem Bildschirm mithilfe eines Cursors verwendet. Finger werden als Multitouch-Zeigergesten interpretiert. Andere Tools wie Eingabestifte werden anhand absoluter Positionen interpretiert. Weitere Informationen findest du unter Indirekte Multi-Touch-Zeigergesten.

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

  • Wenn das Attribut touch.deviceType festgelegt ist, wird der Gerätetyp wie angegeben festgelegt.
  • Wenn das Eingabegerät das Vorhandensein der Eingabe-Property INPUT_PROP_DIRECT (über den EVIOCGPROP-ioctl) meldet, wird der Gerätetyp auf Touchscreen festgelegt. Bei dieser Bedingung wird davon ausgegangen, dass Touchgeräte mit direkter Eingabe an ein Display angeschlossen sind, das ebenfalls verbunden ist.
  • Wenn das Eingabegerät das Vorhandensein der Eingabe-Property INPUT_PROP_POINTER (über den EVIOCGPROP-ioctl) meldet, wird der Gerätetyp auf pointer gesetzt.
  • Wenn das Eingabegerät das Vorhandensein der relativen Achsen REL_X oder REL_Y meldet, wird der Gerätetyp auf Touchpad festgelegt. Diese Bedingung löst eine Mehrdeutigkeit bei Eingabegeräten auf, die sowohl aus einer Maus als auch aus einem Touchpad bestehen. In diesem Fall wird das Touchpad nicht zur Steuerung des Mauszeigers verwendet, da dieser bereits über die Maus gesteuert wird.
  • Andernfalls wird der Gerätetyp auf pointer gesetzt. Diese Standardeinstellung sorgt dafür, dass Touchpads, denen kein anderer spezieller Zweck zugewiesen wurde, den Zeiger steuern.

Tasten

Schaltflächen sind optionale Steuerelemente, mit denen Apps zusätzliche Funktionen ausführen können. Tasten auf Touch-Geräten verhalten sich ähnlich wie Maustasten und sind hauptsächlich für Touch-Geräte mit Zeiger oder für Eingabestifte nützlich.

Die folgenden Schaltflächen werden unterstützt:

  • BTN_LEFT: Zugeordnet zu MotionEvent.BUTTON_PRIMARY.
  • BTN_RIGHT: Zugeordnet zu MotionEvent.BUTTON_SECONDARY.
  • BTN_MIDDLE: Zugeordnet zu MotionEvent.BUTTON_MIDDLE.
  • BTN_BACK und BTN_SIDE: MotionEvent.BUTTON_BACK zugeordnet. Durch Drücken dieser Taste wird auch ein Tastendruck mit dem Tastencode KeyEvent.KEYCODE_BACK simuliert.
  • BTN_FORWARD und BTN_EXTRA: Zugeordnet zu MotionEvent.BUTTON_FORWARD. Durch Drücken dieser Taste wird auch ein Tastendruck mit dem Tastencode KeyEvent.KEYCODE_FORWARD simuliert.
  • BTN_STYLUS: Zugeordnet zu MotionEvent.BUTTON_SECONDARY.
  • BTN_STYLUS2: Zugeordnet zu MotionEvent.BUTTON_TERTIARY.

Tools und Tooltypen

Ein Tool ist ein Finger, ein Eingabestift oder ein anderes Gerät, das für die Interaktion mit dem Touch-Gerät verwendet wird. Einige Touchgeräte können zwischen verschiedenen Arten von Tools unterscheiden.

An anderen Stellen in Android, z. B. in der MotionEvent API, wird ein Tool oft als Pointer bezeichnet.

Die folgenden Tooltypen werden unterstützt:

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

Tools mit dem Eingabestift berühren oder den Eingabestift darüber bewegen

Tools können entweder das Touch-Gerät berühren oder sich in Reichweite befinden und darüber schweben. Nicht alle Touch-Geräte können die Anwesenheit eines Tools erkennen, das sich über dem Touch-Gerät befindet. Bei Geräten, die das tun, wie z. B. HF-basierte Eingabestift-Digitalisierer, kann oft erkannt werden, wenn sich das Tool in einem begrenzten Bereich des Digitalisierers befindet.

Die Komponente InputReader unterscheidet zwischen Berührungs- und Hover-Tools. Ebenso werden Berührungstools und Hover-Tools auf unterschiedliche Weise an Apps gemeldet.

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

Hover-Tools werden Apps als allgemeine Bewegungsereignisse mit MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE und MotionEvent.ACTION_HOVER_EXIT gemeldet.

Anforderungen an Treiber für Touchgeräte

  • Touch-Gerätetreiber sollten nur die Achsen und Tastencodes für die Achsen und Tasten registrieren, die sie unterstützen. Die Registrierung nicht unterstützter Achsen oder Tastencodes 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 Tastencode BTN_TOUCH meldet, geht das System davon aus, dass BTN_TOUCH immer verwendet wird, um anzugeben, ob das Tool den Bildschirm berührt. Daher sollte BTN_TOUCH nicht verwendet werden, um anzugeben, dass sich das Tool lediglich im Bereich befindet und darüber bewegt wird.
  • 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 an, der auf die Spitze des Tools ausgeübt wird, oder die Signalstärke des Berührungskontakts.
    • ABS_TOOL_WIDTH: (optional) Gibt die Querschnittsfläche oder Breite des Berührungskontakts 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) Meldet die Zustände der Schaltfläche.
    • 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 Tooltyp an.
  • Multi-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
    • ABS_MT_POSITION_X: (ERFORDERLICH) Gibt die X-Koordinate des Tools an.
    • ABS_MT_POSITION_Y: (ERFORDERLICH) Gibt die Y-Koordinate des Tools an.
    • ABS_MT_PRESSURE: (optional) Gibt den physischen Druck an, der auf die Spitze des Tools ausgeübt wird, oder die Signalstärke des Berührungskontakts.
    • ABS_MT_TOUCH_MAJOR: (optional) Gibt die Querschnittsfläche des Berührungskontakts oder die Länge der längeren Dimension des Berührungskontakts an.
    • ABS_MT_TOUCH_MINOR: (optional) Gibt die Länge der kürzeren Dimension des Berührungskontakts an. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_TOUCH_MAJOR eine Flächenmessung meldet.
    • ABS_MT_WIDTH_MAJOR: (optional) Gibt die Querschnittsfläche des Tools selbst oder die Länge der längeren Dimension des Tools selbst an. Verwenden Sie diese Achse nur, wenn Sie die Abmessungen des Tools selbst 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 meldet oder wenn die Abmessungen des Werkzeugs selbst unbekannt sind.
    • ABS_MT_ORIENTATION: (optional) Gibt die Ausrichtung des Tools an.
    • ABS_MT_DISTANCE: (optional) Gibt den Abstand des Tools von der Oberfläche des Touch-Geräts an.
    • ABS_MT_TOOL_TYPE: (optional) Gibt den Tooltyp als MT_TOOL_FINGER oder MT_TOOL_PEN an.
    • ABS_MT_TRACKING_ID: (optional) Gibt die Tracking-ID des Tools an. Die Tracking-ID ist eine beliebige nicht negative Ganzzahl, mit der jedes Tool unabhängig identifiziert und verfolgt wird, wenn mehrere Tools aktiv sind. Wenn beispielsweise mehrere Finger das Gerät berühren, sollte jedem Finger eine eindeutige Tracking-ID zugewiesen werden, die so lange verwendet wird, wie der Finger in Kontakt bleibt. Tracking-IDs können wiederverwendet werden, wenn die zugehörigen Werkzeuge sich außerhalb der Reichweite befinden.
    • ABS_MT_SLOT: (optional) Gibt die Slot-ID des Tools an, wenn das Linux-Multi-Touch-Protokoll „B“ verwendet wird. Weitere Informationen findest du in der Dokumentation zum Linux-Multi-Touch-Protokoll.
    • 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) Meldet die Zustände der Schaltfläche.
    • 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 Tooltyp an.
  • 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 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 Oberflächeneinheiten. Bei einem Touchscreen beschreibt der aktive Bereich den Teil des Touch-Geräts, der das Display tatsächlich abdeckt.

    Bei einem Touchscreen interpoliert das System die gemeldeten Berührungspositionen in Oberflächeneinheiten automatisch, um Berührungspositionen 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 weitergeleitet, können aber für virtuelle Tasten verwendet werden.

    Berührungen, die innerhalb des aktiven Bereichs initiiert werden oder in den Displaybereich eintreten und ihn verlassen, werden an Apps weitergeleitet. Wenn eine Berührung innerhalb der Grenzen einer App beginnt und sich dann außerhalb des aktiven Bereichs bewegt, kann die App Touch-Events mit Displaykoordinaten empfangen, die negativ sind oder außerhalb der Grenzen des Displays liegen. Das ist ganz normal.

    Ein Touch-Gerät sollte die Touch-Koordinaten niemals auf die Grenzen des aktiven Bereichs beschränken. Wenn eine Berührung den aktiven Bereich verlässt, sollte sie als außerhalb des aktiven Bereichs liegend oder gar nicht gemeldet werden.

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

    Durch das Festlegen von Berührungskoordinaten am Displayrand wird eine künstliche harte Grenze um den Bildschirmrand herum erstellt, die verhindert, dass das System Bewegungen, die in den Anzeigebereich hinein- oder aus ihm herausgehen, reibungslos verfolgt.

  • Die von ABS_PRESSURE oder ABS_MT_PRESSURE gemeldeten Werte müssen, sofern sie überhaupt gemeldet werden, ungleich null sein, wenn das Tool das Gerät berührt, und andernfalls null, um anzugeben, dass das Tool über dem Gerät schwebt.

    Die Angabe von Druckinformationen ist optional, wird aber dringend empfohlen. Apps können Druckinformationen verwenden, um druckempfindliches Zeichnen und andere Effekte zu implementieren.

  • 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 Tool das Gerät berührt, und andernfalls null. Dies ist jedoch nicht erforderlich. Beispielsweise kann das Touch-Gerät möglicherweise die Größe von Fingerberührungen, aber nicht von Eingabestiftberührungen messen.

    Die Angabe von Größeninformationen ist optional, wird aber dringend empfohlen. Apps können Druckinformationen verwenden, um größenabhängiges Zeichnen und andere Effekte zu implementieren.

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

    Die Angabe von Entfernungsinformationen ist optional, wird aber für Eingabestifte empfohlen.

  • Die von ABS_TILT_X und ABS_TILT_Y gemeldeten Werte sollten null sein, wenn das Tool senkrecht zum Gerät steht. Eine Neigung ungleich null bedeutet, dass das Tool schräg gehalten wird.

    Die Neigungswinkel entlang der X- und Y-Achse werden in Grad von der Senkrechten angegeben. Der Mittelpunkt (perfekt senkrecht) wird für jede Achse durch (max + min) / 2 angegeben. 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.

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

    Die Meldung von Neigungsinformationen ist optional, wird aber für Eingabestiftgeräte empfohlen.

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

  • Ein Tool gilt unter den folgenden Bedingungen als aktiv:

    • Wenn Sie das Single-Touch-Protokoll verwenden, 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 ob es berührt oder zumindest seinen Tooltyp. Wenn keine Informationen verfügbar sind, wird davon ausgegangen, dass das Tool inaktiv (außerhalb des Bereichs) ist.

    • Bei Verwendung des Multi-Touch-Protokolls „A“ ist das Tool immer dann aktiv, wenn es im letzten Synchronisierungsbericht angezeigt wird. Wenn das Tool nicht mehr in Synchronisierungsberichten angezeigt wird, ist es nicht mehr vorhanden.
    • Bei Verwendung des Multi-Touch-Protokolls „B“ ist das Tool aktiv, solange es einen aktiven Slot hat. Wenn der Slot geleert wird, ist das Tool nicht mehr vorhanden.
  • Ein Tool wird unter den folgenden Bedingungen als schwebend eingestuft:
    • Wenn das Tool BTN_TOOL_MOUSE oder BTN_TOOL_LENS ist, wird es nicht als schwebend betrachtet, auch wenn eine der folgenden Bedingungen erfüllt ist.
    • Wenn das Tool aktiv ist und der Treiber Druckinformationen meldet und der gemeldete Druck null ist, befindet sich das Tool im Hover-Zustand.
    • Wenn das Tool aktiv ist und der Treiber den Schlüsselcode BTN_TOUCH unterstützt und BTN_TOUCH den Wert null hat, wird das Tool bewegt.
  • InputReader unterstützt sowohl das Multi-Touch-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, um der Linux-Eingabeprotokollspezifikation zu entsprechen.

    Die folgenden Änderungen sind möglicherweise erforderlich:

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

      In früheren Android-Versionen wurden „Up“-Ereignisse durch Senden eines Druckwerts von 0 gemeldet. Das alte Verhalten war mit der Linux-Eingabeprotokollspezifikation nicht kompatibel und wird nicht mehr unterstützt.

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

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

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

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

    Treiber für Touch-Geräte benötigen keine Android-spezifischen Anpassungen mehr. Durch die Verwendung des Linux-Standardeingabeprotokolls kann Android eine größere Vielfalt an Touch-Peripheriegeräten wie externe HID-Multitouch-Touchscreens mit unveränderten Treibern unterstützen.

Bedienung von Touchgeräten

Im Folgenden finden Sie eine kurze Zusammenfassung der Bedienung von Touchgeräten unter Android.

  1. EventHub liest Rohereignisse aus dem evdev-Treiber.
  2. InputReader verarbeitet die Rohereignisse und aktualisiert den internen Status zur Position und zu anderen Merkmalen der einzelnen Tools. Außerdem werden die Schaltflächenstatus erfasst.
  3. Wenn ZURÜCK oder VORWÄRTS gedrückt oder losgelassen wurde, benachrichtigt InputReader InputDispatcher über das Schlüsselereignis.
  4. InputReader bestimmt, ob eine virtuelle Taste gedrückt wurde. Wenn ja, wird InputDispatcher über das Schlüsselereignis benachrichtigt.
  5. InputReader bestimmt, ob die Berührung innerhalb der Grenzen des Displays initiiert wurde. In diesem Fall wird InputDispatcher über das Touch-Event benachrichtigt.
  6. Wenn es keine Berührungstools, aber mindestens ein Hover-Tool gibt, benachrichtigt InputReader InputDispatcher über das Hover-Ereignis.
  7. Wenn der Touch-Gerätetyp pointer ist, führt InputReader die Erkennung von Zeigergesten durch, bewegt den Zeiger und die Punkte entsprechend und benachrichtigt InputDispatcher über das Zeigerereignis.
  8. InputDispatcher verwendet WindowManagerPolicy, um zu bestimmen, ob die Ereignisse gesendet werden sollen und ob sie das Gerät aktivieren sollen. Anschließend stellt InputDispatcher die Ereignisse den entsprechenden Apps bereit.

Konfiguration von Touchgeräten

Das Verhalten von Touch-Geräten wird durch die Achsen, Tasten, Eingabeeigenschaften, die Konfiguration des Eingabegeräts, die virtuelle Tastenbelegung und das Tastenlayout des Geräts bestimmt.

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

Attribute

Das System verwendet viele Konfigurationseigenschaften für Eingabegeräte, 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 die Eigenschaften von Berührungen oft in gerätespezifischen Einheiten melden.

Viele Touch-Geräte messen die Touch-Kontaktfläche beispielsweise mit 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 aussagekräftig, da sie die physische Größe und andere Eigenschaften der Sensorknoten des Touch-Gerä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 decodieren, zu transformieren und in eine einfachere Standarddarstellung zu normalisieren, die von Apps verstanden werden kann.

Dokumentationskonventionen

In dieser Dokumentation werden die folgenden Konventionen verwendet, um die Werte zu beschreiben, die das System während des Kalibrierungsprozesses verwendet.

Unverarbeitete Achsenwerte

Die folgenden Ausdrücke bezeichnen die Rohwerte, die vom Touch-Gerätetreiber als EV_ABS-Ereignisse gemeldet werden.

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 ABS_PRESSURE- oder ABS_MT_PRESSURE-Achse oder 0, wenn nicht verfügbar.
raw.touchMajor
Der Wert der ABS_MT_TOUCH_MAJOR-Achse oder 0, falls nicht verfügbar.
raw.touchMinor
Der Wert der ABS_MT_TOUCH_MINOR-Achse oder raw.touchMajor, falls nicht verfügbar.
raw.toolMajor
Der Wert der ABS_TOOL_WIDTH- oder ABS_MT_WIDTH_MAJOR-Achse oder 0, wenn 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 ABS_DISTANCE- oder ABS_MT_DISTANCE-Achse oder 0, wenn 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.

Rohachsenbereiche

Die folgenden Ausdrücke bezeichnen die Grenzen von Rohwerten. Sie werden durch Aufrufen von EVIOCGABS-ioctl für jede Achse abgerufen.

raw.*.min
Der inklusive Mindestwert der Rohachse.
raw.*.max
Der Höchstwert der Rohachse (einschließlich).
raw.*.range
Entspricht raw.*.max - raw.*.min.
raw.*.fuzz
Die Genauigkeit der Rohachse. Beispiel: fuzz = 1 bedeutet, dass die Werte auf +/- 1 Einheit genau sind.
raw.width
Die Breite des Berührungsbereichs, einschließlich der Ränder, entspricht raw.x.range + 1.
raw.height
Die Höhe des Berührungsbereichs, einschließlich der Ränder, entspricht raw.y.range + 1.

Ausgabebereiche

Die folgenden Ausdrücke bezeichnen die Merkmale des Ausgabekoordinatensystems. Das System verwendet die lineare Interpolation, um Informationen zur Berührungsposition von den Oberflächeneinheiten des Touch-Geräts in die Ausgabeeinheiten zu übersetzen, die an Apps wie Displaypixel gemeldet werden.

output.width
Die Ausgabebreite. Bei Touchscreens (die mit einem Display verknüpft sind) ist dies die Displaybreite in Pixeln. Bei Touchpads (die keinem Display zugeordnet sind) entspricht die Ausgabebreite raw.width, was bedeutet, dass keine Interpolation durchgeführt wird.
output.height
Die Ausgabehöhe. Bei Touchscreens (die mit einem Display verknüpft sind) ist dies die Displayhöhe in Pixeln. Bei Touchpads (die keinem Display zugeordnet sind) entspricht 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 Konfigurationsattribute in der Konfigurationsdatei des Eingabegeräts, um Kalibrierungswerte anzugeben. In der folgenden Tabelle werden einige allgemeine Konfigurationsattribute beschrieben. Alle anderen Properties werden in den folgenden Abschnitten zusammen mit den Feldern beschrieben, für die sie verwendet 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 Touch-Gerät ein Touchscreen, der mit einem Display verknüpft ist.

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

  • Wenn der Wert pointer ist, handelt es sich bei dem Touch-Gerät um ein Touchpad, das keinem Display zugeordnet ist. Seine Bewegungen werden für indirekte Multi-Touch-Zeigergesten verwendet.

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

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

In Android 3 und niedriger wurde davon ausgegangen, dass alle Touch-Geräte Touchscreens sind.

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 Bildschirmausrichtung ändert.

  • Wenn der Wert 0 ist, sind die vom Touch-Gerät gemeldeten Berührungspositionen immun gegen Änderungen der Displayausrichtung.

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

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

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

Vor Honeycomb wurde davon ausgegangen, dass alle Touch-Geräte die Ausrichtung erkennen.

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 pointer 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 darstellt, und durch eine Reihe von kreisförmigen Punkten, die die Position der einzelnen Finger darstellen.

Der Standardwert ist pointer, wenn das Eingabeattribut INPUT_PROP_SEMI_MT festgelegt ist, andernfalls spots.

X- und Y-Felder

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

Berechnung

Die Berechnung ist einfach: 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

Die Felder touchMajor und touchMinor beschreiben die ungefähren Abmessungen des Kontaktbereichs in Ausgabeeinheiten (Pixel).

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

Das Feld size beschreibt die normalisierte Größe der Berührung im Verhältnis zur größtmöglichen Berührung, die das Touch-Gerät erkennen 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 (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 der Kontaktfläche an. Wenn nur der ungefähre Durchmesser des Kontaktbereichs gemessen werden kann, sind die Felder touchMajor und touchMinor identisch.

Ebenso gibt das Feld toolMajor die längere Dimension und das Feld toolMinor die kürzere Dimension der Querschnittsfläche des Werkzeugs an.

Wenn die Berührungsgröße nicht verfügbar ist, aber die Werkzeuggröße, wird die Werkzeuggröße auf die Berührungsgröße festgelegt. Wenn die Werkzeuggröße nicht verfügbar ist, aber die Berührungsgröße, wird die Berührungsgröße auf die Werkzeuggröße gesetzt.

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

<touch.size.calibration< h4=""></touch.size.calibration<>

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

Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Touch-Größe und die Tool-Größ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 Oberflächeneinheiten wie die Position angegeben ist. Sie wird also auf dieselbe Weise skaliert.

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

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

  • Wenn der Wert default ist, verwendet das System die geometric-Kalibrierung, wenn die raw.touchMajor- oder raw.toolMajor-Achse 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 Bias-Wert 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 gemeldet wird.

  • Wenn der Wert 1 ist, wird die gemeldete Größe vor der Verwendung durch die Anzahl der Kontakte 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 Dimensionen mehrerer Kontakte nicht unterscheiden. Sie melden daher eine Größe, die die Gesamtfläche oder -breite darstellt. Diese Property sollte für solche Geräte nur auf 1 festgelegt werden. Legen Sie diesen Wert im Zweifelsfall auf 0 fest.

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 (normaler Druck).

Ein Druck von null zeigt an, dass das Tool 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 bei Berührung auf 1,0 und beim Bewegen des Mauszeigers auf 0,0 gesetzt.

  • Wenn der Wert physical ist, wird davon ausgegangen, dass die Druckachse die tatsächliche physische Intensität des auf das Touchpad ausgeübten Drucks misst.

  • 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.pressure.scale

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 Abstimmungsparametern 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

Das Feld orientation beschreibt die Ausrichtung der Berührung und des Tools als Winkelmessung. Eine Ausrichtung von 0 gibt an, dass die Hauptachse vertikal ausgerichtet ist, -PI/2 gibt an, dass die Hauptachse nach links ausgerichtet ist, und PI/2 gibt an, dass die Hauptachse nach rechts ausgerichtet ist. Wenn ein Eingabestift vorhanden ist, kann der Ausrichtungsbereich in einem vollständigen Kreisbereich von -PI oder PI beschrieben werden.

Das Feld tilt beschreibt die Neigung des Tools als Winkelmessung. Eine Neigung von 0 gibt an, dass das Tool senkrecht zur Oberfläche steht. Eine Neigung von PI/2 gibt an, dass das Tool flach auf der Oberfläche liegt.

touch.orientation.calibration

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

Gibt die Art der Messung an, die vom Touch-Treiber zum Melden der Ausrichtung verwendet wird.

  • 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 wird 0 zugeordnet.
  • Wenn der Wert vector ist, wird die Ausrichtung als gepackter 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 verwendet, um die Größeninformationen zu skalieren, sofern sie nicht geometrisch sind.
  • 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. Der Wert 0,0 gibt direkten Kontakt an, größere Werte eine zunehmende Entfernung von der Oberfläche.

touch.distance.calibration

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

Gibt die Art der Messung an, die vom Touch-Treiber zum Melden der Entfernung verwendet wird.

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

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

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

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 Abstimmungsparametern ab.

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

Beispiel

# 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 Touchgeräte haben sich in Android Ice Cream Sandwich 4.0 erheblich geändert. Alle Konfigurationsdateien für Eingabegeräte für Touch-Geräte müssen aktualisiert werden, um die neuen Konfigurationsattribute zu verwenden.

Möglicherweise müssen auch ältere Treiber für Touchgeräte aktualisiert werden.

Dateien für virtuelle Tastenbelegung

Touch-Geräte können verwendet werden, um virtuelle Tasten zu implementieren.

Je nach den Funktionen des Touch-Controllers gibt es dafür mehrere Möglichkeiten. Einige Touch-Controller können direkt so konfiguriert werden, dass Softkeys durch Festlegen von Firmware-Registern implementiert werden. In anderen Fällen ist es wünschenswert, die Zuordnung von Berührungskoordinaten zu Tastencodes in der Software vorzunehmen.

Wenn virtuelle Tasten in der Software implementiert sind, muss der Kernel eine Datei mit der Zuordnung der virtuellen Tasten namens virtualkeys.<devicename> als Board-Attribut exportieren. Wenn der Touchscreen-Gerätetreiber beispielsweise den Namen „touchyfeely“ meldet, muss die Datei für die virtuelle Tastenzuordnung den Pfad /sys/board_properties/virtualkeys.touchyfeely haben.

In einer Datei mit einer virtuellen Tastenzuordnung werden die Koordinaten und Linux-Tastencodes virtueller Tasten auf dem Touchscreen beschrieben.

Zusätzlich zur Datei für die virtuelle Tastaturbelegung muss eine entsprechende Datei für das Tastenlayout und eine Datei für die Tastaturbelegung vorhanden sein, um die Linux-Tastencodes den Android-Tastencodes zuzuordnen und den Typ des Tastaturgeräts anzugeben (normalerweise SPECIAL_FUNCTION).

Syntax

Eine Datei mit einer virtuellen Tastenbelegung ist eine Nur-Text-Datei, die aus einer Abfolge von Layoutbeschreibungen für virtuelle Tasten besteht, die entweder durch Zeilenumbrüche oder durch Doppelpunkte getrennt sind.

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

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

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

Alle Koordinaten und Größen werden im Koordinatensystem des Displays angegeben.

Hier ist eine Datei mit einer virtuellen Tastaturbelegung, die in einer einzigen 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

Dieselbe Datei für die Zuordnung virtueller Tasten kann auch in 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 × 800. Dementsprechend haben alle virtuellen Tasten die <centerY>-Koordinate 835, die sich etwas unterhalb des sichtbaren Bereichs des Touchscreens befindet.

Die erste Taste hat den Linux-Scancode 158 (KEY_BACK), centerX = 55, centerY = 835, width = 90 und height = 55.

Beispiel

Datei für virtuelle 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

Tastenlayoutdatei: /system/usr/keylayout/touchyfeely.kl.

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

Datei für die Zuordnung von Tastenzeichen: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Indirekte Multitouch-Zeigergesten

Im Zeigermodus interpretiert das System die folgenden Gesten:

  • Einmal mit einem Finger tippen: klicken.
  • Bewegung mit einem Finger: Mauszeiger bewegen.
  • Bewegung mit einem Finger und Drücken der Tasten: Der Zeiger wird gezogen.
  • Zwei-Finger-Bewegung, bei der sich beide Finger in dieselbe Richtung bewegen: Der Bereich unter dem Mauszeiger wird in diese Richtung gezogen. Der Zeiger selbst bewegt sich nicht.
  • Zwei-Finger-Bewegung, bei der sich beide Finger aufeinander zu oder voneinander weg in verschiedene Richtungen bewegen: Schwenken/Skalieren/Drehen des Bereichs um den Mauszeiger. Der Zeiger selbst bewegt sich nicht.
  • Bewegung mit mehreren Fingern: Freiformgeste.

Handballenerkennung

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, müssen aber möglicherweise so geändert werden, dass das Flag TOOL_TYPE_PALM zurückgegeben wird, wenn eine Handfläche erkannt wird. Das integrierte Framework funktioniert auch in Verbindung mit benutzerdefinierten Lösungen.

Das tatsächliche Modell berücksichtigt die ersten 90 ms der Gestendaten, den aktuellen Zeiger und die umgebenden Zeiger und prüft dann, wie weit die Berührungen vom Displayrand entfernt sind. Anschließend wird für jeden Zeiger einzeln ermittelt, ob es sich um eine Handfläche handelt. Außerdem wird die Größe der einzelnen Kontakte berücksichtigt, wie von touchMajor und touchMinor gemeldet. Das Android-Framework entfernt dann die als Handflächen markierten Zeiger aus dem Touch-Stream.

Wenn bereits ein Zeiger an die Apps gesendet wurde, führt das System einen der folgenden Schritte aus:

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

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

Wenn der Handballen-Pointer nicht an Apps gesendet wurde, wird er vom System einfach verworfen.

Handballenerkennung aktivieren

  1. Verwende in deinem Touch-Treiber das Makro input_abs_set_res, 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 dies jedoch unterstützt, achte darauf, dass die Auflösung richtig eingestellt ist.

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

    Sehen Sie sich das folgende Beispiel an:

    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. Wenn Sie die Funktion dauerhaft aktivieren möchten, fügen Sie den entsprechenden sysprop-Befehl in die Datei init**rc ein:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Weitere Informationen