Geräte mit Touchscreen

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

Touchscreens sind Touch-Geräte, die mit einem Display verbunden sind, so dass der Benutzer 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 Digitalisiertablett. Touchpads werden typischerweise zum Zeigen oder zur absoluten indirekten Positionierung oder gestenbasierten Steuerung einer Benutzeroberfläche verwendet.

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

Touch-Geräte können je nach zugrunde liegender Touch-Sensor-Technologie manchmal mit verschiedenen Werkzeugen wie Fingern oder einem Stift bedient werden.

Touch-Geräte werden manchmal zur Implementierung virtueller Tasten verwendet. Bei manchen Android-Geräten reicht der Sensorbereich des Touchscreens beispielsweise über den Rand des Displays hinaus und erfüllt als Teil einer berührungsempfindlichen Tastatur einen doppelten Zweck.

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

Klassifizierung von Touch-Geräten

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

  • Das Eingabegerät meldet das Vorhandensein der Absolutachsen ABS_MT_POSITION_X und ABS_MT_POSITION_Y .
  • Das Eingabegerät verfügt über keine Gamepad-Tasten. Diese Bedingung behebt eine Mehrdeutigkeit bei bestimmten Gamepads, 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 Multitouch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Single-Touch-Gerät oder als Multi-Touch-Gerät klassifiziert, niemals beides.
  • Das Eingabegerät meldet das Vorhandensein der absoluten Achsen ABS_X und ABS_Y sowie das Vorhandensein des Tastencodes BTN_TOUCH .

Wenn ein Eingabegerät als Touch-Gerät klassifiziert wird, wird das Vorhandensein virtueller Tasten durch den Versuch ermittelt, die virtuelle Tastenzuordnungsdatei 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 [Virtuelle Tastenzuordnungsdateien](#virtual-key-map-files).

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

Alle integrierten Touch-Geräte sollten über Konfigurationsdateien für Eingabegeräte verfügen. Wenn keine Konfigurationsdatei für Eingabegeräte vorhanden ist, wählt das System eine Standardkonfiguration, 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 konzipiert 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 Zeigergerät .

  • Ein Touchscreen -Gerät dient der direkten Manipulation von Objekten auf dem Bildschirm. Der Benutzer berührt den Bildschirm direkt, sodass das System keine zusätzlichen Funktionen benötigt, um die zu manipulierenden Objekte anzuzeigen.
  • Ein Touchpad- Gerät wird verwendet, um einer App absolute Positionsinformationen über Berührungen auf einem bestimmten Sensorbereich bereitzustellen. Dies kann für Digitalisiertabletts nützlich sein.
  • Ein Zeigergerät dient zur indirekten Manipulation von Objekten auf dem Bildschirm mithilfe eines Cursors. Finger werden als Multitouch-Zeigergesten interpretiert. Andere Werkzeuge, wie z. B. Stifte, werden anhand absoluter Positionen interpretiert. Weitere Informationen finden Sie unter Indirekte Multitouch-Zeigergesten .

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

  • Wenn die Eigenschaft touch.deviceType festgelegt ist, wird der Gerätetyp wie angegeben festgelegt.
  • Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft INPUT_PROP_DIRECT meldet (über das EVIOCGPROP Ioctl), wird der Gerätetyp auf Touchscreen festgelegt. Bei dieser Bedingung wird davon ausgegangen, dass Direkteingabe-Touch-Geräte an ein ebenfalls angeschlossenes Display angeschlossen sind.
  • Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft INPUT_PROP_POINTER meldet (über das EVIOCGPROP Ioctl), 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 eingestellt. Diese Bedingung behebt eine Mehrdeutigkeit für Eingabegeräte, die sowohl aus einer Maus als auch einem Touchpad bestehen. In diesem Fall wird das Touchpad nicht zur Steuerung des Zeigers verwendet, da die Maus ihn bereits steuert.
  • Andernfalls wird der Gerätetyp auf pointer gesetzt. Diese Standardeinstellung stellt sicher, dass Touchpads, denen kein anderer besonderer 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 werden hauptsächlich bei Touch-Geräten mit Zeiger oder einem Stift verwendet.

Folgende 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 : Zu MotionEvent.BUTTON_BACK zugeordnet. Durch Drücken dieser Taste wird auch ein Tastendruck mit dem Tastencode KeyEvent.KEYCODE_BACK synthetisiert.
  • 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 synthetisiert.
  • BTN_STYLUS : MotionEvent.BUTTON_SECONDARY zugeordnet.
  • BTN_STYLUS2 : MotionEvent.BUTTON_TERTIARY zugeordnet.

Werkzeuge und Werkzeugtypen

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

An anderer Stelle in Android, wie in der MotionEvent API, wird ein Werkzeug oft als Zeiger bezeichnet.

Folgende Werkzeugtypen werden unterstützt:

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

Schwebende versus berührende Werkzeuge

Werkzeuge können entweder Kontakt mit dem Touch-Gerät haben oder sich in dessen Reichweite befinden und darüber schweben. Nicht alle Touch-Geräte können die Anwesenheit eines Werkzeugs erkennen, das über dem Touch-Gerät schwebt. Diejenigen, die dies tun, wie z. B. HF-basierte Stylus-Digitalisierer, können oft erkennen, wenn sich das Werkzeug innerhalb einer begrenzten Reichweite des Digitalisierers befindet.

Die InputReader Komponente unterscheidet berührende Werkzeuge von schwebenden Werkzeugen. Ebenso werden berührende und schwebende Werkzeuge auf unterschiedliche Weise an Apps gemeldet.

Berührende Werkzeuge werden mithilfe von MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN und MotionEvent.ACTION_POINTER_UP als Berührungsereignisse an Apps gemeldet.

Schwebewerkzeuge werden Apps als generische Bewegungsereignisse mit MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE und MotionEvent.ACTION_HOVER_EXIT gemeldet.

Anforderungen an den Touch-Gerätetreiber

  • 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 Geräteklassifizierungsalgorithmus 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 anzuzeigen, ob das Werkzeug den Bildschirm berührt. Daher sollte BTN_TOUCH nicht verwendet werden, um anzuzeigen, dass sich das Werkzeug lediglich in der Reichweite befindet und schwebt.
  • Single-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
    • ABS_X : (ERFORDERLICH) Meldet die X-Koordinate des Werkzeugs.
    • ABS_Y : (ERFORDERLICH) Meldet die Y-Koordinate des Werkzeugs.
    • ABS_PRESSURE : (optional) Meldet den auf die Spitze des Werkzeugs ausgeübten physischen Druck oder die Signalstärke des Berührungskontakts.
    • ABS_TOOL_WIDTH : (optional) Meldet die Querschnittsfläche oder Breite des Berührungskontakts oder des Werkzeugs selbst.
    • ABS_DISTANCE : (optional) Meldet den Abstand des Werkzeugs von der Oberfläche des Touch-Geräts.
    • ABS_TILT_X : (optional) Meldet die Neigung des Werkzeugs von der Oberfläche des Touch-Geräts entlang der X-Achse.
    • ABS_TILT_Y : (optional) Meldet die Neigung des Werkzeugs von der Oberfläche des Touch-Geräts entlang der Y-Achse.
    • BTN_TOUCH : (ERFORDERLICH) Gibt an, ob das Werkzeug das Gerät berührt.
    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (optional) Meldet Schaltflächenzustände .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN , BTN_TOOL_RUBBER , BTN_TOOL_BRUSH , BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_LENS , BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP , BTN_TOOL_QUADTAP : (optional) Meldet den Werkzeugtyp .
  • Multitouch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
    • ABS_MT_POSITION_X : (ERFORDERLICH) Meldet die X-Koordinate des Werkzeugs.
    • ABS_MT_POSITION_Y : (ERFORDERLICH) Meldet die Y-Koordinate des Werkzeugs.
    • ABS_MT_PRESSURE : (optional) Meldet den auf die Spitze des Werkzeugs ausgeübten physischen Druck oder die Signalstärke des Berührungskontakts.
    • ABS_MT_TOUCH_MAJOR : (optional) Meldet die Querschnittsfläche des Berührungskontakts oder die Länge der längeren Abmessung des Berührungskontakts.
    • ABS_MT_TOUCH_MINOR : (optional) Meldet die Länge der kürzeren Dimension des Berührungskontakts. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_TOUCH_MAJOR eine Flächenmessung meldet.
    • ABS_MT_WIDTH_MAJOR : (optional) Meldet die Querschnittsfläche des Werkzeugs selbst oder die Länge der längeren Abmessung des Werkzeugs selbst. Verwenden Sie diese Achse nur, wenn Sie die Abmessungen des Werkzeugs selbst kennen.
    • ABS_MT_WIDTH_MINOR : (optional) Meldet die Länge der kürzeren Abmessung des Werkzeugs selbst. 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) Meldet die Ausrichtung des Werkzeugs.
    • ABS_MT_DISTANCE : (optional) Meldet den Abstand des Werkzeugs von der Oberfläche des Touch-Geräts.
    • ABS_MT_TOOL_TYPE : (optional) Meldet den Werkzeugtyp als MT_TOOL_FINGER oder MT_TOOL_PEN .
    • ABS_MT_TRACKING_ID : (optional) Meldet die Tracking-ID des Tools. Die Tracking-ID ist eine beliebige, nicht negative Ganzzahl, die verwendet wird, um jedes Werkzeug unabhängig zu identifizieren und zu verfolgen, wenn mehrere Werkzeuge aktiv sind. Wenn beispielsweise mehrere Finger das Gerät berühren, sollte jedem Finger eine eindeutige Tracking-ID zugewiesen werden, die verwendet wird, solange der Finger in Kontakt bleibt. Tracking-IDs können wiederverwendet werden, wenn die zugehörigen Tools außer Reichweite geraten.
    • ABS_MT_SLOT : (optional) Meldet die Slot-ID des Tools, wenn das Linux-Multitouch-Protokoll „B“ verwendet wird. Weitere Einzelheiten finden Sie in der Dokumentation zum Linux-Multitouch-Protokoll.
    • BTN_TOUCH : (ERFORDERLICH) Gibt an, ob das Werkzeug das Gerät berührt.
    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (optional) Meldet Schaltflächenzustände .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN , BTN_TOOL_RUBBER , BTN_TOOL_BRUSH , BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_LENS , BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP , BTN_TOOL_QUADTAP : (optional) Meldet den Werkzeugtyp .
  • 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 minimalen und maximalen Werte 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 tatsächlich das Display bedeckt.

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

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

    Ein Touchscreen 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 übermittelt, können aber für virtuelle Tasten verwendet werden.

    Berührungen, die innerhalb des aktiven Bereichs initiiert werden oder die den Anzeigebereich betreten und verlassen, werden an Apps übermittelt. Wenn also eine Berührung innerhalb der Grenzen einer App beginnt und sich dann außerhalb des aktiven Bereichs bewegt, empfängt die App möglicherweise Berührungsereignisse mit Anzeigekoordinaten, die negativ sind oder über die Grenzen der Anzeige hinausgehen. Dies ist das erwartete Verhalten.

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

    Wenn der Finger des Benutzers beispielsweise die obere linke Ecke des Touchscreens berührt, wird möglicherweise eine Koordinate von (minX, minY) gemeldet. Wenn sich der Finger weiterhin weiter außerhalb des aktiven Bereichs bewegt, sollte der Touchscreen entweder mit der Meldung von Koordinaten mit Komponenten beginnen, die kleiner als minX und minY sind, z. B. (minX – 2, minY – 3), oder er sollte die Meldung der Berührung ganz einstellen. Mit anderen Worten: Der Touchscreen sollte nicht melden (minX, minY), wenn der Finger des Benutzers tatsächlich außerhalb des aktiven Bereichs berührt.

    Durch das Festklemmen von Berührungskoordinaten am Displayrand entsteht eine künstliche harte Grenze um den Rand des Bildschirms, die das System daran hindert, Bewegungen, die in die Grenzen des Displaybereichs hinein- oder daraus hervorgehen, reibungslos zu verfolgen.

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

    Die Meldung von Druckinformationen ist optional , wird jedoch dringend empfohlen. 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 Werkzeug 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ührungskontakten messen, jedoch nicht die Größe von Stiftberührungskontakten.

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

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

    Die Meldung von Entfernungsinformationen ist optional , wird jedoch für Stiftgeräte empfohlen.

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

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

    InputReader wandelt die X- und Y-Neigungskomponenten in einen senkrechten Neigungswinkel im Bereich von 0 bis PI / 2 Bogenmaß und einen planaren Ausrichtungswinkel im Bereich von -PI bis PI Bogenmaß 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 jedoch für Stiftgeräte empfohlen.

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

  • Basierend auf den folgenden Bedingungen wird festgestellt, dass ein Werkzeug aktiv ist:

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

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

    • Bei Verwendung des Multi-Touch-Protokolls „A“ ist das Tool immer dann aktiv, wenn es im neuesten Synchronisierungsbericht erscheint. Wenn das Tool nicht mehr in den Synchronisierungsberichten erscheint, ist es nicht mehr vorhanden.
    • Bei Verwendung des Multitouch-Protokolls „B“ ist das Werkzeug aktiv, solange es über einen aktiven Steckplatz verfügt. Wenn der Steckplatz gelöscht wird, existiert das Werkzeug nicht mehr.
  • Basierend auf den folgenden Bedingungen wird festgestellt, dass ein Werkzeug schwebt:
    • Wenn das Werkzeug BTN_TOOL_MOUSE oder BTN_TOOL_LENS ist, schwebt das Werkzeug nicht, auch wenn eine der folgenden Bedingungen zutrifft.
    • Wenn das Werkzeug aktiv ist und der Treiber Druckinformationen meldet und der gemeldete Druck Null ist, dann schwebt das Werkzeug.
    • Wenn das Tool aktiv ist und der Treiber den BTN_TOUCH Tastencode unterstützt und BTN_TOUCH den Wert Null hat, schwebt das Tool.
  • InputReader unterstützt sowohl das Multi-Touch-Protokoll „A“ als auch „B“. Neue Treiber sollten das „B“-Protokoll verwenden, aber beides funktioniert.
  • Ab Android 4.0 müssen möglicherweise Touchscreen-Treiber geändert werden, um der Linux-Eingabeprotokollspezifikation zu entsprechen.

    Folgende Änderungen können erforderlich sein:

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

      Frühere Versionen von Android erwarteten, dass „Up“-Ereignisse durch Senden eines Druckwerts von 0 gemeldet werden. 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.

      Frühere Versionen von Android haben 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.

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

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

Touch-Gerätebedienung

Im Folgenden finden Sie eine kurze Zusammenfassung der Touch-Gerätebedienung unter Android.

  1. EventHub liest Rohereignisse vom evdev Treiber.
  2. InputReader nutzt die Rohereignisse und aktualisiert den internen Status über die Position und andere Eigenschaften jedes Werkzeugs. Es verfolgt auch den Tastenstatus.
  3. Wenn BACK oder FORWARD gedrückt oder losgelassen wurde, benachrichtigt InputReader InputDispatcher über das Tastenereignis.
  4. InputReader ermittelt, ob ein virtueller Tastendruck stattgefunden hat. Wenn dies der Fall ist, benachrichtigt es InputDispatcher über das Schlüsselereignis.
  5. InputReader ermittelt, ob die Berührung innerhalb der Grenzen der Anzeige initiiert wurde. Wenn dies der Fall ist, benachrichtigt es InputDispatcher über das Berührungsereignis.
  6. Wenn keine berührenden Werkzeuge, aber mindestens ein schwebendes Werkzeug vorhanden sind, benachrichtigt InputReader InputDispatcher über das Hover-Ereignis.
  7. Wenn der Touch-Gerätetyp pointer ist, führt InputReader eine Zeigergestenerkennung 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 übermittelt InputDispatcher die Ereignisse an die entsprechenden Apps.

Touch-Gerätekonfiguration

Das Verhalten des Touch-Geräts 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:

Eigenschaften

Das System stützt sich auf viele Konfigurationseigenschaften von Eingabegeräten, 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 mit gerätespezifischen Einheiten melden.

Beispielsweise messen viele Touch-Geräte die Berührungskontaktfläche mithilfe einer internen gerätespezifischen Skala, beispielsweise 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 des Eingabegeräts codiert sind, um die vom Touch-Gerät gemeldeten Werte zu dekodieren, umzuwandeln und in eine einfachere Standarddarstellung zu normalisieren, die Apps verstehen können.

Dokumentationskonventionen

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

Rohachsenwerte

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

raw.x
Der Wert der Achse ABS_X oder ABS_MT_POSITION_X .
raw.y
Der Wert der Achse ABS_Y oder ABS_MT_POSITION_Y .
raw.pressure
Der Wert der 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, wenn 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 Achse ABS_TOOL_WIDTH oder ABS_MT_WIDTH_MAJOR 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, wenn 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, wenn nicht verfügbar.
raw.tiltY
Der Wert der ABS_TILT_Y Achse oder 0, wenn nicht verfügbar.

Rohachsenbereiche

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

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

Ausgabebereiche

Die folgenden Ausdrücke bezeichnen die Eigenschaften des Ausgabekoordinatensystems. Das System verwendet lineare Interpolation, um Berührungspositionsinformationen aus den vom Touch-Gerät verwendeten Oberflächeneinheiten in Ausgabeeinheiten zu übersetzen, die an Apps gemeldet werden, z. B. Anzeigepixel.

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

Basiseinstellung

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

touch.deviceType

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

Gibt den Typ des Touch-Geräts an.

  • Wenn der Wert touchScreen ist, handelt es sich bei dem Touch-Gerät um einen Touchscreen, der einer Anzeige zugeordnet ist.

  • Wenn der Wert touchPad ist, handelt es sich bei dem Touch-Gerät um ein Touchpad, das keinem Display zugeordnet ist.

  • Wenn der Wert pointer lautet, handelt es sich bei dem Touch-Gerät um ein Touchpad, das nicht mit einem Display verknüpft ist, und seine Bewegungen werden für indirekte Multitouch-Zeigergesten verwendet.

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

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

In Android 3 und niedriger wurde davon ausgegangen, dass es sich bei allen Touch-Geräten um Touchscreens handelte.

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

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

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

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

Der Standardwert ist 1 wenn es sich bei dem Gerät um einen Touchscreen handelt, andernfalls 0 .

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

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

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

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

Gibt den Darstellungsmodus 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 lautet, werden die Touchpad-Gesten durch einen Anker dargestellt, der den Schwerpunkt der Geste darstellt, und durch eine Reihe kreisförmiger Punkte, die die Position einzelner Finger darstellen.

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

X- und Y-Felder

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

Berechnung

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

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchMajor, touchMinor, toolMajor, toolMinor, Größenfelder

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

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

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

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

Wenn die Touch-Größe nicht verfügbar ist, aber die Werkzeuggröße verfügbar ist, wird die Werkzeuggröße auf die Touch-Größe gesetzt. Wenn umgekehrt die Werkzeuggröße nicht verfügbar ist, aber die Berührungsgröße verfügbar ist, wird die Berührungsgröße auf die Werkzeuggröße gesetzt.

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

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

Gibt die Art der Messung an, die der Touch-Treiber verwendet, um die Touch-Größe und Werkzeuggröße zu melden.

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

  • Wenn es sich um einen geometric Wert handelt, wird davon ausgegangen, dass die Größe in denselben Oberflächeneinheiten wie die Position angegeben wird und daher auf die gleiche Weise skaliert wird.

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

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

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

Touch-Größenskala

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 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ößenmessung, die deren Gesamtfläche oder Breite darstellt. Diese Eigenschaft sollte nur für solche Geräte auf 1 gesetzt 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 pressure beschreibt den ungefähren physischen Druck, der auf das Touch-Gerät ausgeübt wird, als normalisierter Wert zwischen 0,0 (keine Berührung) und 1,0 (normaler Druck).

Ein Nulldruck zeigt an, dass das Werkzeug schwebt.

Berührungsdruckkalibrierung

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

Gibt die Art der Messung an, die der Touch-Treiber zum Melden des Drucks verwendet.

  • Wenn der Wert none lautet, ist der Druck unbekannt und wird daher beim Berühren auf 1,0 und beim Schweben auf 0,0 gesetzt.

  • Wenn es sich um einen physical Wert handelt, wird davon ausgegangen, dass die Druckachse die tatsächliche physikalische Intensität des auf das Touchpad ausgeübten Drucks misst.

  • Wenn es sich bei dem Wert um amplitude handelt, 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 lautet, verwendet das System die physical Kalibrierung, wenn die Druckachse verfügbar ist, andernfalls wird none verwendet.

Berührungsdruckskala

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 pressure hängt von den angegebenen Kalibrierparametern 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

Orientierungs- und Neigungsfelder

Das orientation beschreibt die Orientierung der Berührung und das Werkzeug als Winkelmessung. Eine Orientierung von 0 zeigt an, dass die Hauptachse vertikal ausgerichtet ist. -PI/2 zeigt an, dass die Hauptachse nach links ausgerichtet ist, PI/2 zeigt an, dass die Hauptachse nach rechts ausgerichtet ist. Wenn ein Stiftwerkzeug vorhanden ist, kann der Orientierungsbereich in einem vollständigen Kreisbereich von -PI oder PI beschrieben werden.

Das tilt beschreibt die Neigung des Werkzeugs als Winkelmessung. Eine Neigung von 0 zeigt an, dass das Werkzeug senkrecht zur Oberfläche ist. Eine Neigung von PI/2 zeigt an, dass das Werkzeug auf der Oberfläche flach ist.

touch.orientation.calibration

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

Gibt die Art der Messung an, die der Touch -Treiber zur Meldung der Orientierung verwendet hat.

  • Wenn der Wert none ist, ist die Ausrichtung unbekannt, sodass er auf 0 gesetzt ist.
  • Wenn der Wert interpolated ist, ist die Orientierung linear interpoliert -PI/2 so PI/2 ein Rohwert von raw.orientation.min raw.orientation.max Der mittlere Wert von (raw.orientation.min + raw.orientation.max) / 2 Karten bis 0 .
  • Wenn der Wert vector ist, wird die Orientierung als gepackter Vektor interpretiert, der zwei signierte 4-Bit-Felder enthält. Diese Darstellung wird für Protokollteile von Atmel -Objektbasis verwendet. Wenn der Vektor entschlüsselt ist, gibt der Vektor einen Orientierungswinkel und eine Vertrauensgröße. Die Vertrauensgröß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 Orientierungsachse verfügbar ist, ansonsten none .

Berechnung

Die Berechnung der orientation und tilt hängt von den angegebenen Kalibrierungsparametern und den verfügbaren Eingaben 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

Entfernungsfeld

Das distance beschreibt den Abstand zwischen dem Werkzeug und der Berührungsvorrichtung. Ein Wert von 0,0 zeigt einen direkten Kontakt an und größere Werte zeigen einen zunehmenden Abstand von der Oberfläche an.

touch.distance.calibration

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

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

  • Wenn der Wert none ist, ist die Entfernung unbekannt, sodass er auf 0 gesetzt ist.

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

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

touch.distance.scale

Definition: touch.distance.scale = <a nicht negative schwimmende Punktzahl>

Gibt einen in der Kalibrierung verwendeten konstanten Skalierungsfaktor an.

Der Standardwert ist 1.0 .

Berechnung

Die Berechnung des 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

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

Möglicherweise müssen auch ältere Touch -Geräte -Treiber aktualisiert werden.

Virtuelle Kartendateien

Touch -Geräte können zum Implementieren von virtuellen Schlüssel verwendet werden.

Abhängig von den Fähigkeiten des Touch Controllers gibt es verschiedene Möglichkeiten, dies zu tun. Einige Touch -Controller können direkt konfiguriert werden, um Soft -Tasten zu implementieren, indem Firmware -Register festgelegt werden. In anderen Fällen ist es wünschenswert, die Zuordnung von Berührungskoordinaten zu Schlüsselcodes in Software durchzuführen.

Wenn virtuelle Schlüssel in Software implementiert werden, muss der Kernel eine virtuelle Kartendatei namens virtualkeys.<devicename> Als Board -Eigenschaft. Wenn die Treiber für Touchscreen -Geräte beispielsweise ihren Namen als "toppyfeely" meldet, muss die virtuelle Schlüsselkartendatei über den Pfad /sys/board_properties/virtualkeys.touchyfeely verfügen.

Eine virtuelle Kartendatei beschreibt die Koordinaten und Linux -Schlüsselcodes virtueller Schlüssel auf dem Touchscreen.

Zusätzlich zur Datei der virtuellen Tastenkartendatei muss eine entsprechende Tastenlayout -Datei und eine Schlüsselkartendatei vorhanden sein, um die Linux -Schlüsselcodes den Android -Schlüsselcodes zuzuordnen und den Typ des Tastaturgeräts anzugeben (normalerweise SPECIAL_FUNCTION ).

Syntax

Eine virtuelle Kartendatei ist eine einfache Textdatei, die aus einer Abfolge von virtuellen Schlüssellayoutbeschreibungen besteht, die entweder durch Newlines oder durch Kolons getrennt sind.

Kommentarlinien beginnen mit '#' und fahren bis zum Ende der Zeile fort.

Jeder virtuelle Schlüssel wird durch 6 Dickdarmkomponenten beschrieben:

  • 0x01 : Ein Versionscode. Muss immer 0x01 sein.
  • <Linux -Schlüsselcode>: Der Linux -Schlüsselcode des virtuellen Schlüssels.
  • <centrex>: Die X -Pixel -Koordinate der Mitte des virtuellen Schlüssels.
  • <In Centery>: Die Y -Pixel -Koordinate des Zentrums des virtuellen Schlüssels.
  • <breite>: Die Breite des virtuellen Schlüssels in Pixeln.
  • <höhe>: Die Höhe des virtuellen Schlüssels in Pixeln.

Alle Koordinaten und Größen werden in Bezug auf das Anzeigekoordinatensystem angegeben.

Hier ist eine virtuelle Kartendatei, die alle in einer Zeile geschrieben wurden.

# 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 virtuelle Kartendatei 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 x 800. Dementsprechend haben alle virtuellen Tasten eine <tentenzentrum> Koordinate von 835, die etwas unter dem sichtbaren Bereich des Touchscreens liegt.

Der erste Schlüssel hat einen Linux -Scan -Code von 158 ( KEY_BACK ), Centerx von 55 , Zentrum von 835 , Breite von 90 und Höhe von 55 .

Beispiel

Virtuelle Key Map -Datei: /sys/board_properties/virtualkeys.touchyfeely .

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

Key Layout -Datei: /system/usr/keylayout/touchyfeely.kl .

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

Key -Zeichenkartendatei: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirekte Multi-Touch-Zeiger-Gesten

Im Zeigermodus interpretiert das System die folgenden Gesten:

  • Single Finger Tipp: Klicken Sie auf.
  • Einzelfingerbewegung: Bewegen Sie den Zeiger.
  • Einzelfinger -Bewegung und Taste drückt: Ziehen Sie den Zeiger.
  • Zwei Fingerbewegungen Beide Finger bewegen sich in die gleiche Richtung: Ziehen Sie den Bereich unter den Zeiger in diese Richtung. Der Zeiger selbst bewegt sich nicht.
  • Zwei Fingerbewegungen Beide Finger bewegen sich in unterschiedliche Richtungen in Richtungeinander oder auseinander: Pfanne/Skalierung/Drehen Sie den Bereich, der den Zeiger umgibt. Der Zeiger selbst bewegt sich nicht.
  • Multiple Fingerbewegung: Freeform Geste.

Palm-Ablehnung

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

Das tatsächliche Modell befasst sich mit den ersten 90 ms Gestendaten, dem aktuellen Zeiger und den umgebenden Zeigern, und untersucht dann, wie weit die Berührungen von der Anzeigekante entfernt sind. Anschließend bestimmt es, welche der Zeiger Palmen pro Zeigerbasis sind. Es berücksichtigt auch die Größe jedes Kontakts, wie von touchMajor und touchMinor berichtet. Das Android -Framework entfernt dann die Zeiger, die als Palmen aus dem Touch -Stream gekennzeichnet sind.

Wenn bereits ein Zeiger an die Apps gesendet wurde, dann auch das System:

  • (Wenn es andere aktive Zeiger gibt) Steckt den Zeiger mit ACTION_POINTER_UP und FLAG_CANCELED ein.
  • (Wenn dies der einzige Zeiger ist) Steckt den Zeiger mit ACTION_CANCEL ab.

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

Wenn der Palmzeiger nicht an Apps gesendet wurde, lässt das System einfach den Zeiger fallen.

Palmenablehnung aktivieren

  1. Verwenden Sie in Ihrem 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 für ABS_MT_TOUCH_MINOR ist optional. Wenn Ihr Gerät dies jedoch unterstützt, stellen Sie sicher, dass die Auflösung korrekt eingestellt ist.

  2. Um zu bestätigen,
        $ adb shell getevent -li
    
    die Felder korrekt eingestellt sind
  3. Um die Funktion während der Laufzeit zu aktivieren, rennen Sie:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Starten Sie den Prozess system_server neu.
         $ adb shell stop && adb shell start
        
  5. Bestätigen Sie, dass adb shell dumpsys input zeigt, dass es im UnwantedInteractionBlocker von Palmenabfällen gibt. Wenn dies nicht der Fall ist, überprüfen Sie die Eingangsprotokolle, um Hinweise darauf zu finden, was möglicherweise falsch konfiguriert ist.

    Siehe das folgende Beispiel als Referenz:

    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. Um die Funktion dauerhaft zu aktivieren, fügen Sie den entsprechenden SYSPROP -Befehl in Ihre init**rc -Datei hinzu:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Weiterführende Literatur

,

Android unterstützt eine Vielzahl von Touchscreens und Touch-Pads, einschließlich Digitalisierer-Tablets auf Stiftbasis.

Touchscreens sind Touch -Geräte, die einer Anzeige zugeordnet sind, so dass der Benutzer den Eindruck hat, Elemente direkt auf dem Bildschirm zu manipulieren.

Touchpads sind Touch-Geräte, die nicht mit einem Display verbunden sind, z. B. ein Digitalisiertablett. Touchpads werden normalerweise zum Zeigen oder für die absolute indirekte Positionierung oder auf geste-basierte Steuerung einer Benutzeroberfläche verwendet.

Touch -Geräte können Schaltflächen haben, deren Funktionen den Maustasten ähneln.

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

Touch -Geräte werden manchmal verwendet, um virtuelle Schlüssel zu implementieren. Auf einigen Android -Geräten erstreckt sich der Touchscreen -Sensorbereich beispielsweise über den Rand des Displays und dient als Teil eines berührungsempfindlichen Schlüsselpads.

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

Klassifizierung der Berührung der Geräte

Ein Eingabegerät wird als Multi-Touch- Gerät klassifiziert, wenn beide folgenden Bedingungen gelten:

  • Das Eingabegerät meldet das Vorhandensein der ABS_MT_POSITION_X und ABS_MT_POSITION_Y Absolute Achsen.
  • Das Eingabegerät verfügt über keine Gamepad -Tasten. Diese Bedingung löst eine Mehrdeutigkeit mit bestimmten Gamepads auf, die Achsen mit Codes melden, die die der MT -Achsen überlappt.

Ein Eingabegerät wird als Single-Touch- Gerät klassifiziert, wenn beide folgenden Bedingungen gelten:

  • Das Eingabegerät wird nicht als Multi-Touch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Einzel-Touch-Gerät oder als Multi-Touch-Gerät klassifiziert, niemals beides.
  • Das Eingabegerät meldet das Vorhandensein der Absolute -Achsen von ABS_X und ABS_Y sowie das Vorhandensein des BTN_TOUCH -Schlüsselcodes.

Wenn ein Eingabegerät als Touch -Gerät klassifiziert wird, wird das Vorhandensein von virtuellen Schlüssel bestimmt, indem versucht wird, die Kartendatei der virtuellen Schlüssel für das Gerät zu laden. Wenn eine virtuelle Schlüsselkarte verfügbar ist, wird auch die Schlüssellayout -Datei für das Gerät geladen. Informationen zum Speicherort und zum Format dieser Dateien finden Sie unter [virtuelle Kartendateien] (#Virtual-Key-MAP-Files).

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

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

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

  • Ein Touchscreen -Gerät wird zur direkten Manipulation von Objekten auf dem Bildschirm verwendet. Der Benutzer berührt den Bildschirm direkt, sodass das System keine zusätzlichen Leistungen benötigt, um die manipulierten Objekte anzuzeigen.
  • Ein Touch Pad -Gerät wird verwendet, um eine App über einen bestimmten Sensorbereich absolute Positionierungsinformationen zur Verfügung zu stellen. Es kann für Digitalisierer -Tablets nützlich sein.
  • Ein Zeigergerät wird zur indirekten Manipulation von Objekten auf dem Bildschirm mit einem Cursor verwendet. Finger werden als Multi-Touch-Zeiger-Gesten interpretiert. Andere Tools, wie z. B. Stile, werden unter Verwendung absoluter Positionen interpretiert. Weitere Informationen finden Sie in indirekten Multitouch-Zeiger-Gesten .

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

  • Wenn die Eigenschaft touch.deviceType festgelegt ist, wird der Gerätetyp wie angegeben eingestellt.
  • Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft INPUT_PROP_DIRECT (über die EVIOCGPROP EviocGProp) meldet, wird der Gerätetyp auf Touchscreen eingestellt. Diese Bedingung geht davon aus, dass direkte Eingangs -Touch -Geräte an eine Anzeige angeschlossen sind, die ebenfalls angeschlossen ist.
  • Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft INPUT_PROP_POINTER (über die EVIOCGPROP von EviocGProp) ausmeldet, ist der Gerätetyp auf Zeiger eingestellt.
  • Wenn das Eingabegerät das Vorhandensein der REL_X oder REL_Y -Relativachsen meldet, ist der Gerätetyp auf Touch Pad eingestellt. Diese Bedingung löst eine Unklarheit für Eingabegeräte, die sowohl aus einer Maus als auch aus einem Touchpad bestehen. In diesem Fall wird das Touchpad nicht verwendet, um den Zeiger zu steuern, da die Maus ihn bereits steuert.
  • Andernfalls ist der Gerätetyp auf Zeiger eingestellt. Dieser Standard stellt sicher, dass Berührungskissen, die nicht als andere spezielle Zwecke bezeichnet wurden, 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 werden hauptsächlich mit Zeigertyp Touch -Geräten oder mit einem Stift verwendet.

Die folgenden Tasten werden unterstützt:

  • BTN_LEFT : MotionEvent.BUTTON_PRIMARY zugeordnet.
  • BTN_RIGHT : MotionEvent.BUTTON_SECONDARY zugeordnet.
  • BTN_MIDDLE : MotionEvent.BUTTON_MIDDLE zugeordnet.
  • BTN_BACK und BTN_SIDE : MotionEvent.BUTTON_BACK zugeordnet. Durch Drücken dieser Taste synthetisiert auch eine Taste. Drücken Sie mit dem Schlüsselcode KeyEvent.KEYCODE_BACK .
  • BTN_FORWARD und BTN_EXTRA : MotionEvent.BUTTON_FORWARD zugeordnet. Wenn Sie diese Taste drücken, synthetisiert auch eine Taste Drücken Sie mit dem Schlüsselcode KeyEvent.KEYCODE_FORWARD .
  • BTN_STYLUS : MotionEvent.BUTTON_SECONDARY zugeordnet.
  • BTN_STYLUS2 : MotionEvent.BUTTON_TERTIARY zugeordnet.

Werkzeuge und Werkzeugtypen

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

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

Die folgenden Werkzeugtypen werden unterstützt:

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

Schwebende und berührende Werkzeuge

Tools können entweder mit dem Touch -Gerät oder im Bereich in Kontakt stehen und darüber schweben. Nicht alle Berührungsgeräte können das Vorhandensein eines Werkzeugs erfassen, das über dem Berührungsgerät schwebt. Diejenigen, die wie RF-basierte Stiftungsdigitalisierer tun, können häufig erkennen, wann sich das Tool in einem begrenzten Bereich des Digitalisierers befindet.

Die InputReader -Komponente unterscheidet Berührungswerkzeuge von schwebenden Werkzeugen. Ebenso werden Apps auf unterschiedliche Weise Berührungswerkzeuge und schwebende Tools gemeldet.

Berührungswerkzeuge werden an Apps als Berührungsereignisse unter Verwendung von MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN und MotionEvent.ACTION_POINTER_UP gemeldet.

Überfahrtools werden an Apps als generische Bewegungsereignisse unter Verwendung von MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE und MotionEvent.ACTION_HOVER_EXIT gemeldet.

Anforderungen an den Treiber der Berührung des Geräts Treiber

  • Touch Device -Treiber sollten nur die Achsen und Schlüsselcodes für die von ihnen unterstützten Achsen und Tasten registrieren. Durch die Registrierung nicht unterstützter Achsen oder Schlüsselcodes kann der Geräteklassifizierungsalgorithmus verwirren oder das System dazu veranlassen, die Funktionen des Geräts falsch zu erkennen. Wenn das Gerät beispielsweise den BTN_TOUCH -Schlüsselcode 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 anzuzeigen, dass sich das Tool lediglich im Bereich befindet und schwebt.
  • Single-Touch-Geräte verwenden die folgenden Linux-Eingangsereignisse:
    • ABS_X : (Erforderlich) meldet die X -Koordinate des Tools.
    • ABS_Y : (Erforderlich) meldet die Y -Koordinate des Tools.
    • ABS_PRESSURE : (optional) meldet den physischen Druck, der auf die Spitze des Werkzeugs oder die Signalstärke des Berührungskontakts angewendet wird.
    • ABS_TOOL_WIDTH : (Optional) meldet den Querschnittsbereich oder die Breite des Berührungskontakts oder des Werkzeugs selbst.
    • ABS_DISTANCE : (optional) meldet den Abstand des Werkzeugs von der Oberfläche des Berührungsgeräts.
    • ABS_TILT_X : (optional) meldet die Neigung des Werkzeugs von der Oberfläche der Berührungsvorrichtung entlang der x -Achse.
    • ABS_TILT_Y : (Optional) meldet die Neigung des Werkzeugs von der Oberfläche der Berührungsvorrichtung entlang der Y -Achse.
    • 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) Berichte Taste .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN , BTN_TOOL_RUBBER , BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_LENS , BTN_TOOL_DOUBLETAP : der BTN_TOOL_QUADTAP .
  • Multi-Touch-Geräte verwenden die folgenden Linux-Eingangsereignisse:
    • ABS_MT_POSITION_X : (Erforderlich) meldet die X -Koordinate des Tools.
    • ABS_MT_POSITION_Y : (Erforderlich) meldet die Y -Koordinate des Tools.
    • ABS_MT_PRESSURE : (Optional) meldet den physischen Druck, der auf die Spitze des Werkzeugs oder die Signalstärke des Berührungskontakts angewendet wird.
    • ABS_MT_TOUCH_MAJOR : (Optional) meldet den Querschnittsbereich des Berührungskontakts oder die Länge der längeren Dimension des Berührungskontakts.
    • ABS_MT_TOUCH_MINOR : (Optional) meldet die Länge der kürzeren Dimension des Berührungskontakts. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_TOUCH_MAJOR eine Flächenmessung meldet.
    • ABS_MT_WIDTH_MAJOR : (Optional) meldet den Querschnittsbereich des Werkzeugs selbst oder die Länge der längeren Dimension des Werkzeugs selbst. Verwenden Sie diese Achse nicht, es sei denn, Sie kennen die Abmessungen des Werkzeugs selbst.
    • ABS_MT_WIDTH_MINOR : (Optional) meldet die Länge der kürzeren Dimension des Werkzeugs selbst. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_WIDTH_MAJOR eine Flächenmessung meldet oder wenn die Dimensionen des Werkzeugs selbst unbekannt sind.
    • ABS_MT_ORIENTATION : (Optional) meldet die Ausrichtung des Tools.
    • ABS_MT_DISTANCE : (Optional) meldet den Abstand des Werkzeugs von der Oberfläche des Berührungsgeräts.
    • ABS_MT_TOOL_TYPE : (Optional) meldet den Werkzeugtyp als MT_TOOL_FINGER oder MT_TOOL_PEN .
    • ABS_MT_TRACKING_ID : (Optional) meldet die Tracking -ID des Tools. Die Tracking-ID ist eine willkürliche nicht negative Ganzzahl, mit der jedes Tool unabhängig voneinander 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 verwendet wird, solange der Finger in Kontakt bleibt. Tracking -IDs können wiederverwendet werden, wenn sich ihre zugehörigen Tools außerhalb der Reichweite bewegen.
    • ABS_MT_SLOT : (Optional) meldet die Slot-ID des Tools, wenn das Linux Multi-Touch-Protokoll 'B' verwendet wird. Weitere Informationen finden Sie in der Linux Multi-Touch-Protokolldokumentation.
    • 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) Berichte Taste .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN , BTN_TOOL_RUBBER , BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_LENS , BTN_TOOL_DOUBLETAP : der BTN_TOOL_QUADTAP .
  • Wenn sowohl Achsen für das Einzel-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 minimalen und maximalen Werte der ABS_X , ABS_Y , ABS_MT_POSITION_X und ABS_MT_POSITION_Y Achsen definieren die Grenzen des aktiven Bereichs des Geräts in Gerätespezifischen Oberflächeneinheiten. Bei einem Touchscreen beschreibt der aktive Bereich den Teil des Berührungsgeräts, der das Display tatsächlich abdeckt.

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

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

    Ein Touchscreen kann sich außerhalb des gemeldeten aktiven Bereichs melden.

    Berührungen, die außerhalb des aktiven Bereichs initiiert werden, werden nicht an Apps geliefert, können jedoch für virtuelle Schlüssel verwendet werden.

    Berührungen, die im aktiven Bereich initiiert werden oder die den Anzeigebereich betreten und beenden, werden an Apps geliefert. Wenn eine Berührung innerhalb der Grenzen einer App beginnt und sich dann außerhalb des aktiven Bereichs bewegt, empfängt die App möglicherweise Berührungsereignisse mit Anzeigenkoordinaten, die negativ oder über die Grenzen der Anzeige hinausgehen. Dies ist das erwartete Verhalten.

    Ein Berührungsgerät sollte niemals Berührungskoordinaten an die Grenzen des aktiven Bereichs klemmen. Wenn eine Berührung den aktiven Bereich verlässt, sollte sie als außerhalb des aktiven Bereichs gemeldet werden oder überhaupt nicht gemeldet werden.

    Wenn der Finger des Benutzers beispielsweise in der Nähe der oberen linken Ecke des Touchscreens berührt, kann er eine Koordinate von (minx, miny) melden. Wenn sich der Finger weiter außerhalb des aktiven Bereichs bewegt, sollte der Touchscreen entweder Koordinaten mit Komponenten, die weniger als Minx und Miny melden, wie z. Mit anderen Worten, der Touchscreen sollte nicht berichten (minx, miny), wenn der Finger des Benutzers außerhalb des aktiven Bereichs wirklich berührt.

    Klemmungskoordinaten an der Anzeigekante erzeugen eine künstliche harte Grenze um die Rande des Bildschirms, die verhindert, dass das System die Bewegungen, die die Grenzen des Anzeigebereichs eingeben oder beenden, reibungslos verfolgt.

  • Die von ABS_PRESSURE oder ABS_MT_PRESSURE gemeldeten Werte müssen, wenn sie überhaupt gemeldet werden, ungleich Null sein, wenn das Tool das Gerät berührt, und sonst Null, um anzuzeigen, dass das Tool schwebt.

    Berichterstattungsinformationen sind optional , aber stark empfohlen. Apps können Druckinformationen verwenden, um druckempfindliche Zeichnung 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 nicht Null sein, wenn das Werkzeug das Gerät berührt, und Null, aber dies ist nicht erforderlich. Zum Beispiel kann das Touch -Gerät möglicherweise die Größe von Finger -Touch -Kontakten messen, jedoch nicht die Kontakte mit Stiftkontakten.

    Die Informationen zur Berichterstattung sind optional , aber dringend empfohlen. Apps können Druckinformationen verwenden, um die Größe sensibler Zeichnung 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. Die Entfernung kann auch dann ungleich Null bleiben, wenn sich das Tool in direktem Kontakt befindet. Die genauen Werte hängen von der Art und Weise ab, in der die Hardware den Abstand misst.

    Die Berichterstattungsinformationen sind optional , aber für Stylus -Geräte empfohlen.

  • Die von ABS_TILT_X und ABS_TILT_Y gemeldeten Werte sollten Null sein, wenn das Werkzeug senkrecht zum Gerät ist. Eine Null-Neigung zeigt an, dass das Werkzeug in einer Steigung gehalten wird.

    Es wird angenommen, dass die Neigungswinkel entlang der x- und y -Achsen in Grad von senkrechten Spezifikationen angegeben sind. Der Mittelpunkt (perfekt senkrecht) ist für jede Achse durch (max + min) / 2 gegeben. Werte, die kleiner als der Mittelpunkt sind, repräsentieren eine Neigung nach oben oder links, Werte größer als der Mittelpunkt repräsentieren eine Neigung nach unten oder nach rechts.

    InputReader wandelt die X- und Y -Neigungskomponenten in einen senkrechten Tilt -Winkel von 0 bis PI / 2 -Radian und einen planaren Orientierungswinkel von -PI bis PI -Radiern um. Diese Darstellung führt zu einer Beschreibung der Orientierung, die mit dem kompatibel ist, was zur Beschreibung von Finger -Berührungen verwendet wird.

    Die Berichterstattung über Neigungsinformationen ist optional , wird jedoch für Stylus -Geräte empfohlen.

  • Wenn der Werkzeugtyp von ABS_MT_TOOL_TYPE gemeldet wird, ersetzt er alle Werkzeugtypinformationen, die von BTN_TOOL_* gemeldet wurden. Wenn überhaupt keine Werkzeugtypinformationen verfügbar sind, stellt der Werkzeugtyp standardmäßig mit MotionEvent.TOOL_TYPE_FINGER .

  • Es wird festgestellt, dass ein Tool auf der Grundlage der folgenden Bedingungen aktiv ist:

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

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

    • Bei Verwendung des Multi-Touch-Protokolls 'A' ist das Tool aktiv, wenn es im neuesten Synchronisierungsbericht erscheint. Wenn das Tool nicht mehr in Synchronisierungsberichten erscheint, gibt es nicht mehr.
    • Bei Verwendung des Multi-Touch-Protokolls 'B' ist das Tool aktiv, solange es einen aktiven Steckplatz hat. Wenn der Schlitz geklärt ist, gibt es das Werkzeug auf, zu existieren.
  • Es wird festgestellt, dass ein Tool basierend auf den folgenden Bedingungen schwebt:
    • Wenn das Tool BTN_TOOL_MOUSE oder BTN_TOOL_LENS ist, schwebt das Tool nicht, auch wenn eine der folgenden Bedingungen wahr ist.
    • Wenn das Tool aktiv ist und der Treiber Druckinformationen meldet und der gemeldete Druck Null ist, schwebt das Tool.
    • Wenn das Tool aktiv ist und der Treiber den BTN_TOUCH -Schlüsselcode unterstützt und BTN_TOUCH einen Wert von Null hat, schwebt das Tool.
  • InputReader unterstützt beide Multi-Touch-Protokoll 'A' und 'B'. Neue Treiber sollten das 'B' -Protokoll verwenden, aber beide funktionieren.
  • Ab Android 4.0 müssen Touchscreen -Treiber möglicherweise geändert werden, um der Linux -Eingangsprotokollspezifikation einzuhalten.

    Möglicherweise sind die folgenden Änderungen erforderlich:

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

      Frühere Versionen von Android erwarteten, dass "Up" -Ereignisse gemeldet werden, indem ein Druckwert von 0 gesendet wird. Das alte Verhalten war mit der Linux -Eingangsprotokollspezifikation nicht kompatibel und wird nicht mehr unterstützt.

    • Physikalische Druck- oder Signalstärkeinformationen sollten unter Verwendung von ABS_MT_PRESSURE gemeldet werden.

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

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

      Frühere Versionen von Android -Abgerufenen Größeninformationen von ABS_MT_TOOL_MAJOR . Das alte Verhalten war mit der Linux -Eingangsprotokollspezifikation nicht kompatibel und wird nicht mehr unterstützt.

    Touch-Geräte-Treiber benötigen keine Android-spezifischen Anpassungen mehr. Durch das Verlassen des Standard-Linux-Eingangsprotokolls kann Android eine breitere Vielfalt von Touch-Peripheriegeräten wie externe HID-Multi-Touch-Touchscreens unter Verwendung nicht modifizierter Treiber unterstützen.

Berührungsvorgangsbetrieb

Das Folgende ist eine kurze Zusammenfassung des Berührungsgeräts auf Android.

  1. EventHub liest RAW -Ereignisse des evdev -Treibers.
  2. InputReader konsumiert die RAW -Ereignisse und aktualisiert den internen Zustand über die Position und andere Eigenschaften jedes Tools. Es verfolgt auch die Taste.
  3. Wenn die Rückseite oder Vorwärts gedrückt oder freigegeben wurde, benachrichtigt InputReader InputDispatcher über das Schlüsselereignis.
  4. InputReader bestimmt, ob eine virtuelle Taste -Presse aufgetreten ist. In diesem Fall werden InputDispatcher über das Schlüsselereignis informiert.
  5. InputReader bestimmt, ob die Berührung innerhalb der Grenzen der Anzeige eingeleitet wurde. Wenn ja, informiert es InputDispatcher über das Touch -Ereignis.
  6. Wenn es keine berührenden Tools gibt, aber es mindestens ein schwebendes Tool gibt, benachrichtigt InputReader InputDispatcher über das Hover -Ereignis.
  7. Wenn der Touch -Gerätetyp Zeiger ist, führt InputReader Zeiger -Gestenerkennung durch, bewegt den Zeiger und entsprechend und benachrichtigt InputDispatcher über das Zeigerereignis.
  8. InputDispatcher verwendet WindowManagerPolicy um festzustellen, ob die Ereignisse versandt werden sollen und ob sie das Gerät wecken sollten. Dann liefert InputDispatcher die Ereignisse an die entsprechenden Apps.

Berührungsgerätekonfiguration

Das Verhalten des Touch -Geräts wird durch die Achsen, Schaltflächen des Geräts, die Eingangseigenschaften, die Konfiguration der Eingabegeräte, die virtuelle Tastenkarte und das Schlüssellayout bestimmt.

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

Eigenschaften

Das System stützt sich auf viele Eingabegerätekonfigurationseigenschaften, um das Verhalten von Berührungsgeräten zu konfigurieren und zu kalibrieren.

Ein Grund dafür ist, dass die Gerätetreiber für Berührungsgeräte häufig die Eigenschaften von Berührungen mithilfe von Gerätebestimmungseinheiten melden.

Beispielsweise messen viele Berührungsgeräte den Berührungskontaktbereich mit einer internen Gerätsspezifischen Skala, z. B. die Gesamtzahl der Sensorknoten, die durch die Berührung ausgelöst wurden. Dieser Rohgrößenwert wäre für Apps nicht aussagekräftig, da sie über die physische Größe und andere Eigenschaften der Touch -Geräte -Sensorknoten wissen müssten.

Das System verwendet Kalibrierungsparameter, die in Konfigurationsdateien für Eingaberäte codiert sind, um die von der Berührungsvorrichtung angegebenen Werte in eine einfachere Standarddarstellung zu dekodieren, zu transformieren und zu normalisieren, die Apps verstehen können.

Dokumentationskonventionen

Für Dokumentationszwecke verwenden wir die folgenden Konventionen, um die vom System während des Kalibrierungsprozesses verwendeten Werte zu beschreiben.

Rohachsenwerte

Die folgenden Ausdrücke bezeichnen die RAW -Werte, die vom Touch Device -Treiber als EV_ABS -Ereignisse gemeldet wurden.

raw.x
Der Wert der ABS_X oder ABS_MT_POSITION_X AXIS.
raw.y
Der Wert der ABS_Y oder ABS_MT_POSITION_Y AXIS.
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, wenn 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 AXIS oder 0, wenn nicht verfügbar.
raw.toolMinor
Der Wert der ABS_MT_WIDTH_MINOR AXIS oder raw.toolMajor , falls dies nicht verfügbar ist.
raw.orientation
Der Wert der ABS_MT_ORIENTATION -Achse oder 0, wenn 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, wenn nicht verfügbar.
raw.tiltY
Der Wert der ABS_TILT_Y -Achse oder 0, wenn nicht verfügbar.

Rohe Achsenbereiche

Die folgenden Ausdrücke bezeichnen die Grenzen der Rohwerte. Sie werden erhalten, indem EVIOCGABS IOCTL für jede Achse aufgerufen wird.

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

Ausgabebereiche

Die folgenden Ausdrücke bezeichnen die Eigenschaften des Ausgangskoordinatensystems. Das System verwendet eine lineare Interpolation, um Berührungspositionsinformationen aus den von der Berührungsvorrichtung verwendeten Oberflächeneinheiten in die Ausgabeinheiten zu übersetzen, die Apps wie Anzeigepixel gemeldet werden.

output.width
Die Ausgangsbreite. Für Touchscreens (mit einer Anzeige) ist dies die Anzeigebreite in Pixel. Für Touchpads (nicht mit einem Display verbunden) ist die Ausgangsbreite gleich raw.width , was darauf hinweist, dass keine Interpolation durchgeführt wird.
output.height
Die Ausgangshöhe. Für Touchscreens (mit einer Anzeige) ist dies die Anzeigehöhe in Pixeln. For touch pads (not associated with a display), the output height equals raw.height , indicating that no interpolation is performed.
output.diag
The diagonal length of the output coordinate system, equivalent to sqrt(output.width ^2 + output.height ^2) .

Basiseinstellung

The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.

touch.deviceType

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

Specifies the touch device type.

  • If the value is touchScreen , the touch device is a touch screen associated with a display.

  • If the value is touchPad , the touch device is a touch pad not associated with a display.

  • If the value is pointer , the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .

  • If the value is default , the system automatically detects the device type according to the classification algorithm.

Refer to the Classification section for more details about how the device type influences the behavior of the touch device.

In Android 3 and lower, all touch devices were assumed to be touch screens.

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

Specifies whether the touch device should react to display orientation changes.

  • If the value is 1 , touch positions reported by the touch device are rotated whenever the display orientation changes.

  • If the value is 0 , touch positions reported by the touch device are immune to display orientation changes.

The default value is 1 if the device is a touch screen, 0 otherwise.

The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.

Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.

Prior to Honeycomb, all touch devices were assumed to be orientation aware.

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .

  • If the value is pointer , the touch pad gestures are presented by way of a cursor similar to a mouse pointer.

  • If the value is spots , the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.

The default value is pointer when the INPUT_PROP_SEMI_MT input property is set, or spots otherwise.

X and Y fields

The X and Y fields provide positional information for the center of the contact area.

Berechnung

The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchMajor, touchMinor, toolMajor, toolMinor, size fields

The touchMajor and touchMinor fields describe the approximate dimensions of the contact area in output units (pixels).

The toolMajor and toolMinor fields describe the approximate dimensions of the tool itself in output units (pixels).

The size field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).

When both the approximate length and breadth can be measured, then the touchMajor field specifies the longer dimension and the touchMinor field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor and touchMinor fields are equal.

Likewise, the toolMajor field specifies the longer dimension and the toolMinor field specifies the shorter dimension of the tool's cross-sectional area.

If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.

Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.

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

Specifies the kind of measurement used by the touch driver to report the touch size and tool size.

  • If the value is none , the size is set to zero.

  • If the value is geometric , the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.

  • If the value is diameter , the size is assumed to be proportional to the diameter (width) of the touch or tool.

  • If the value is area , the size is assumed to be proportional to the area of the touch or tool.

  • If the value is default , the system uses the geometric calibration if the raw.touchMajor or raw.toolMajor axis is available, otherwise it uses the none calibration.

touch.size.scale

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

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

touch.size.bias

Definition: touch.size.bias = <a non-negative floating point number>

Specifies a constant bias value used in the calibration.

The default value is 0.0 .

touch.size.isSummed

Definition: touch.size.isSummed = 0 | 1

Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.

  • If the value is 1 , the reported size is divided by the number of contacts prior to use.

  • If the value is 0 , the reported size is used as is.

Der Standardwert ist 0 .

Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1 for such devices. If in doubt, set this value to 0 .

Berechnung

The calculation of the touchMajor , touchMinor , toolMajor , toolMinor , and size fields depends on the specified calibration parameters.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

pressure field

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

A zero pressure indicates that the tool is hovering.

touch.pressure.calibration

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

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

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

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

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

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

touch.pressure.scale

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

Specifies a constant scale factor used in the calibration.

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

Berechnung

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

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

orientation and tilt fields

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

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

touch.orientation.calibration

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

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

  • If the value is none , the orientation is unknown so it is set to 0.
  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .
  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.
  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Berechnung

The calculation of the orientation and tilt fields depends on the specified calibration parameters and available input.

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

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

        output.orientation = angle

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

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

distance field

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

touch.distance.calibration

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

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

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

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

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

touch.distance.scale

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

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Berechnung

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

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

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

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

Older touch device drivers might also need to be updated.

Virtual key map files

Touch devices can be used to implement virtual keys.

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

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

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

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

Syntax

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

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

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

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

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

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

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

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

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

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

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

Beispiel

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

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

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

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

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

type SPECIAL_FUNCTION

Indirect multi-touch pointer gestures

In pointer mode, the system interprets the following gestures:

  • Single finger tap: click.
  • Single finger motion: move the pointer.
  • Single finger motion plus button presses: drag the pointer.
  • Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
  • Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
  • Multiple finger motion: freeform gesture.

Palm-Ablehnung

As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.

The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor and touchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

If a pointer was already sent to the apps, then the system either:

  • (If there are other active pointers) Cancels the pointer with ACTION_POINTER_UP and FLAG_CANCELED set.
  • (If this is the only pointer) Cancels the pointer with ACTION_CANCEL .

A public API, MotionEvent.FLAG_CANCELED , indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL and ACTION_POINTER_UP .

If the palm pointer wasn't sent to apps, then the system simply drops the pointer.

Enable palm rejection

  1. In your touch driver, use the input_abs_set_res macro to set the resolutions for the following fields (units are pixels per mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Support for ABS_MT_TOUCH_MINOR is optional. However, if your device does support it, make sure the resolution is set correctly.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . If it doesn't, check the input-related logs to find clues on what might be misconfigured.

    See the following example for reference:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Weiterführende Literatur