Geräte mit Touchscreen

Android unterstützt eine Vielzahl von Touchscreens und Touchpads, Eingabestift-basierte Digitizer-Tablets

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

Touchpads sind Touchscreens, die keinem Display zugeordnet sind, z. B. Digitizer-Tablet. Touchpads werden in der Regel verwendet, absolute indirekte Positionierung oder gestenbasierte Steuerung einer Benutzeroberfläche.

Touchgeräte können Tasten haben, die ähnlich wie Maustasten funktionieren.

Touchgeräte können manchmal mit einer Vielzahl verschiedener Tools bedient werden wie z. B. Finger oder Eingabestifte.

Touchgeräte werden manchmal zur Implementierung virtueller Tasten verwendet. Zum Beispiel auf Bei einigen Android-Geräten geht der Touchscreen-Sensorbereich über den auf dem Display und dient gleichzeitig als Teil einer berührungsempfindlichen Tastatur.

Aufgrund der großen Vielfalt an Touchscreen-Geräten benötigt Android eine große Anzahl von Konfigurationseigenschaften, um die Merkmale und das gewünschte Verhalten zu beschreiben jedes Geräts.

Klassifizierung von Touch-Geräten

Ein Eingabegerät wird als Multi-Touch-Gerät eingestuft, wenn gelten folgende Bedingungen:

  • Das Eingabegerät meldet das Vorhandensein von ABS_MT_POSITION_X und ABS_MT_POSITION_Y absolute Achsen.
  • Das Eingabegerät hat keine Gamepad-Tasten. Diese Bedingung löst eine Ambiguität mit bestimmten Gamepads, die Achsen mit Codes melden die sich mit denen der MT-Achsen überschneidet.

Ein Eingabegerät wird als Single-Touch-Gerät eingestuft, wenn folgende Bedingungen gelten:

  • Das Eingabegerät ist nicht als Multi-Touch-Gerät klassifiziert. Ein Eingabegerät ist entweder als Single-Touch-Gerät oder als Multi-Touch-Gerät klassifiziert, Niemals beides.
  • Das Eingabegerät meldet das Vorhandensein der absoluten Werte für ABS_X und ABS_Y Achsen und das Vorhandensein des Schlüsselcodes BTN_TOUCH.

Wenn ein Eingabegerät als Touch-Gerät klassifiziert wird, der virtuellen Schlüssel wird ermittelt, indem versucht wird, die Datei mit der virtuellen Schlüsselzuordnung zu laden. für das Gerät. Wenn eine virtuelle Tastenbelegung verfügbar ist, für das Gerät geladen ist. Weitere Informationen finden Sie unter [Virtual Key Map-Dateien](#virtual-key-map-files) finden Sie Informationen zum Speicherort und Format dieser Dateien.

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

Alle Geräte mit Touchscreen sollten Konfigurationsdateien für Eingabegeräte haben. Ist keine Konfigurationsdatei für Eingabegeräte vorhanden, eine Standardkonfiguration auswählt, die für allgemeine Zwecke geeignet ist. Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder Touchpads verwenden. Diese Standardeinstellungen sind nicht für integrierte Touchscreens und zu Fehlverhalten führen kann.

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

  • Mit einem Touchscreen lassen sich Objekte direkt auf dem Bildschirm. Der Nutzer berührt den Bildschirm direkt, sodass das System erfordern zusätzliche Angebote, um die Objekte anzuzeigen, manipuliert werden.
  • Ein Touchpad wird verwendet, um Informationen zur absoluten Position bereitzustellen an eine App über Berührungen eines bestimmten Sensorbereichs. Das kann nützlich sein, für Digitizer-Tablets.
  • Ein Zeiger dient der indirekten Bearbeitung von Objekten auf dem mit dem Cursor. Finger werden als Multi-Touchpoint interpretiert Gesten verwenden. Andere Tools wie Eingabestifte werden mit absoluten Positionen verwendet werden. Weitere Informationen finden Sie unter Indirekter Multi-Touch-Cursor .

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

  • Ist das Attribut touch.deviceType festgelegt, lautet der Gerätetyp wie angegeben festgelegt.
  • Wenn das Eingabegerät das Vorhandensein von INPUT_PROP_DIRECT meldet (über die ioctl-Datei EVIOCGPROP) übergeben wird, lautet der Gerätetyp auf Touchscreen eingestellt ist. Diese Bedingung setzt voraus, dass eine direkte Eingabe Geräte an ein Display angeschlossen, das ebenfalls verbunden ist.
  • Wenn das Eingabegerät das Vorhandensein von INPUT_PROP_POINTER meldet Eingabeattribut (über die ioctl-Datei EVIOCGPROP) und dann den Gerätetyp auf pointer festgelegt.
  • Wenn das Eingabegerät das Vorhandensein von REL_X oder REL_Y meldet relativen Achsen, dann wird der Gerätetyp auf Touchpad gesetzt. Diese Bedingung löst eine Ambiguität bei Eingabegeräten, die sowohl aus Maus als auch ein Touchpad. In diesem Fall wird das Touchpad nicht zur Steuerung da sie bereits mit der Maus gesteuert wird.
  • Andernfalls wird der Gerätetyp auf Zeiger eingestellt. Mit dieser Standardeinstellung wird sichergestellt, Touchpads, die keinem anderen Zweck dienen, den Zeiger steuern.

Tasten

Schaltflächen sind optionale Steuerelemente, mit denen Apps bestimmte Aktionen ausführen können. zusätzliche Funktionen. Tasten auf Touchgeräten verhalten sich ähnlich wie die Maus und werden hauptsächlich mit Touchgeräten vom Typ Zeiger oder mit Eingabestift.

Die folgenden Schaltflächen werden unterstützt:

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

Tools und Tooltypen

Ein Tool ist ein Finger, ein Eingabestift oder ein anderes Gerät, das zur Interaktion mit das Touch-Gerät. Einige Touch-Geräte können zwischen verschiedenen verschiedenen Tools.

Andernorts wird in Android, wie bei der MotionEvent API, häufig auf ein Tool verwiesen. als Zeiger verwendet werden.

Die folgenden Tooltypen werden unterstützt:

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

Tools für Mausbewegungen und Berührungen

Tools können entweder in Kontakt mit dem Touchgerät sein oder sich in Reichweite befinden und den Mauszeiger darauf bewegen darüber. Nicht alle Touchscreen-Geräte erkennen das Vorhandensein eines Tools wenn die Maus über dem Touch-Gerät bewegt wird. Solche, die dies tun, wie HF-basierte Digitalisierer, kann oft erkennen, wenn sich das Tool innerhalb eines begrenzten Bereichs des Digitizers befindet.

Die Komponente „InputReader“ unterscheidet zwischen Touch-Tools und dem Bewegen des Mauszeigers Werkzeuge. Ebenso werden Tools zum Berühren und Bewegen des Mauszeigers an Apps gemeldet. auf unterschiedliche Weise nutzen.

Tools zum Tippen werden Apps als Touch-Events gemeldet mit MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN und MotionEvent.ACTION_POINTER_UP.

Tools, die beim Bewegen des Mauszeigers angezeigt werden, werden Apps als allgemeine Bewegungsereignisse gemeldet. Dabei wird Folgendes verwendet: MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE, und MotionEvent.ACTION_HOVER_EXIT.

Treiberanforderungen für Touch-Geräte

  • Treiber für Touch-Geräte sollten nur die Achsen und Tastencodes für die Achsen registrieren und Schaltflächen, die sie unterstützen. Nicht unterstützte Achsen oder Schlüsselcodes registrieren den Algorithmus zur Geräteklassifizierung verwirren oder dazu führen kann, um die Funktionen des Geräts zu erkennen. Wenn das Gerät beispielsweise BTN_TOUCH-Schlüsselcode, das System geht davon aus, dass mit BTN_TOUCH immer angegeben wird, ob das Tool wenn sie den Bildschirm berühren. Daher sollte BTN_TOUCH nicht verwendet werden, um anzugeben, dass sich das Tool nur im Bereich befindet und die Maus darüber bewegt wird.
  • Single-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
    <ph type="x-smartling-placeholder">
      </ph>
    • ABS_X: (ERFORDERLICH) gibt die X-Koordinate des Tools an.
    • ABS_Y: (ERFORDERLICH) gibt die Y-Koordinate des Tools an.
    • ABS_PRESSURE: (optional): Gibt den Druck an, der auf die Spitze ausgeübt wird des Werkzeugs oder die Signalstärke des Berührungskontakts.
    • ABS_TOOL_WIDTH: (optional) Gibt die Querschnittsfläche oder Breite von des Berührungskontakts oder des Werkzeugs selbst.
    • ABS_DISTANCE: (optional) Gibt die Entfernung des Tools von der Oberfläche an. des Touch-Geräts.
    • ABS_TILT_X: (optional) Gibt die Neigung des Tools von der Oberfläche von das Touch-Gerät entlang der X-Achse an.
    • ABS_TILT_Y: (optional) Gibt die Neigung des Tools von der Oberfläche von das Touch-Gerät entlang der Y-Achse an.
    • BTN_TOUCH: (ERFORDERLICH) gibt an, ob das Tool den .
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (optional) Status der Schaltfläche Berichte.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH BTN_TOOL_MOUSE, BTN_TOOL_LENS BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (optional) Meldet den Tooltyp.
  • Multi-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
    <ph type="x-smartling-placeholder">
      </ph>
    • ABS_MT_POSITION_X: (ERFORDERLICH) gibt die X-Koordinate des Tools an.
    • ABS_MT_POSITION_Y: (ERFORDERLICH) gibt die Y-Koordinate des Tools an.
    • ABS_MT_PRESSURE: (optional) Gibt den körperlichen Druck an, der auf die an der Spitze des Werkzeugs oder der Signalstärke des Berührungskontakts.
    • ABS_MT_TOUCH_MAJOR: (optional) Gibt den Querschnittsbereich des Berührungskontakt oder die Länge der längeren Dimension des Berührungskontakts.
    • ABS_MT_TOUCH_MINOR: (optional) Gibt die Länge der kürzeren Dimension an des Touch-Kontakts. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_TOUCH_MAJOR eine Flächenmessung.
    • ABS_MT_WIDTH_MAJOR: (optional) Gibt den Querschnittsbereich des Tool selbst oder die Länge der längeren Abmessung des Tools selbst. Diese Achse nicht verwenden wenn Sie die Abmessungen des Tools selbst kennen.
    • ABS_MT_WIDTH_MINOR: (optional) Gibt die Länge der kürzeren Dimension an des Tools selbst. Diese Achse sollte nicht verwendet werden, wenn ABS_MT_WIDTH_MAJOR Berichte erstellt eine Flächenmessung oder die Abmessungen des Tools selbst sind unbekannt.
    • ABS_MT_ORIENTATION: (optional) gibt die Ausrichtung des Tools an.
    • ABS_MT_DISTANCE: (optional) Gibt die Entfernung des Tools vom Oberfläche des Touch-Geräts.
    • ABS_MT_TOOL_TYPE: (optional) Meldet die Tooltyp als MT_TOOL_FINGER oder MT_TOOL_PEN.
    • ABS_MT_TRACKING_ID: (optional) Gibt die Tracking-ID des Tools an. Die Tracking-ID ist eine beliebige nicht negative Ganzzahl, die zur Identifizierung und verfolgen jedes Tool einzeln, wenn mehrere Tools aktiv sind. Beispiel: Wenn mehrere Finger das Gerät berühren, sollte jedem Finger ein die verwendet wird, solange der Finger in Kontakt bleibt. Tracking-IDs wiederverwendet werden können, wenn sich die zugehörigen Tools außerhalb des zulässigen Bereichs befinden.
    • ABS_MT_SLOT: (optional) gibt die Anzeigenflächen-ID des Tools an, wenn die Linux-Multi-Touch-Protokoll „B“. Weitere Informationen finden Sie in der Dokumentation zum Linux Multi-Touch-Protokoll. .
    • BTN_TOUCH: (ERFORDERLICH) gibt an, ob das Tool den .
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (optional) Status der Schaltfläche Berichte.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (optional) Meldet den Tooltyp.
  • Wenn Achsen für das Single-Touch- und das Multi-Touch-Protokoll definiert sind, gilt: werden nur die Multi-Touch-Achsen verwendet und die Single-Touch-Achsen werden ignoriert.
  • Die Minimal- und Maximalwerte von ABS_X, ABS_Y, ABS_MT_POSITION_X, Die Achsen ABS_MT_POSITION_Y definieren die Grenzen des aktiven Bereichs des Geräts. in gerätespezifischen Oberflächeneinheiten. Bei einem Touchscreen ist der aktive Bereich beschreibt den Teil des Touch-Geräts, der das Display tatsächlich abdeckt.

    Bei einem Touchscreen interpoliert das System die gemeldete Berührung automatisch. Positionen in Oberflächeneinheiten, um Berührungspositionen in Displaypixeln entsprechend in die folgende Berechnung ein:

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

    Über einen Touchscreen können Berührungen außerhalb des gemeldeten aktiven Bereichs gemeldet werden.

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

    Berührungen, die innerhalb des aktiven Bereichs initiiert werden, oder die den Bildschirm betreten und verlassen Bereich an Apps gesendet werden. Wenn also eine Berührung innerhalb der innerhalb der Grenzen einer App und bewegt sich dann aus dem aktiven Bereich, kann Touch-Ereignisse mit Anzeigekoordinaten empfangen, die negativ oder jenseits der Anzeigegrenzen. Das ist ganz normal.

    Ein Touch-Gerät sollte niemals Berührungskoordinaten an die Grenzen des aktiven Bereich. Wenn eine Berührung den aktiven Bereich verlässt, sollte gemeldet werden, dass sie sich außerhalb von um den aktiven Bereich zu entfernen. Andernfalls wird er nicht gemeldet.

    Berührt der Nutzer beispielsweise den Finger in die obere linke Ecke der Touchscreen wird möglicherweise eine Koordinate von (minX, minY) gemeldet. Wenn der Finger weiterhin auf dem Display erscheint um sich weiter außerhalb des aktiven Bereichs zu bewegen, sollte der Touchscreen entweder mit Komponenten, die kleiner als minX und minY sind, z. B. (MinX – 2, MinY – 3), andernfalls wird die Berührung nicht mehr gemeldet. Mit anderen Worten, der Touchscreen sollte keine Berichte liefern (minX, minY). wenn der Finger der Nutzenden außerhalb des aktiven Bereichs berührt.

    Durch das Fixieren von Berührungskoordinaten an den Displayrand wird eine künstliche harte Begrenzung um den Bildschirmrand herum, die verhindert, dass das System Bewegungen, die in den Anzeigebereich ein- oder aus ihm herausragen, werden glatt erfasst.

  • Die von ABS_PRESSURE oder ABS_MT_PRESSURE gemeldeten Werte, falls sie gemeldet werden. Der Wert muss ungleich null sein, wenn das Gerät das Gerät berührt. und Null, um anzuzeigen, dass sich das Tool befindet.

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

  • Die von ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR oder ABS_MT_WIDTH_MINOR darf nicht null sein, wenn das Tool berührt das Gerät, andernfalls Null. Dies ist jedoch nicht erforderlich. Das Touchgerät kann beispielsweise die Größe der Fingerberührung messen. Kontakte, aber nicht mit Eingabestift.

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

  • Die von ABS_DISTANCE oder ABS_MT_DISTANCE gemeldeten Werte sollten Null, wenn das Werkzeug das Gerät berührt. Die Entfernung kann ungleich null bleiben. auch wenn das Tool in direktem Kontakt steht. Die genauen gemeldeten Werte hängen davon ab, wie das Gerät die Entfernung misst.

    Das Melden von Entfernungsinformationen ist optional, wird aber empfohlen für Eingabestift-Geräte.

  • 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 bedeutet, dass das Werkzeug an einer Steigung gehalten wird.

    Es wird angenommen, dass die Neigungswinkel entlang der X- und Y-Achse in Grad angegeben sind. von der senkrechten Position ab. Der Mittelpunkt (perpendikular) wird um (max + min) / 2 für jede Achse. Werte, die kleiner als der Mittelpunkt sind eine Neigung nach oben oder links darstellen, d. h. Werte, die größer als der Mittelpunkt sind eine Neigung nach unten oder nach rechts darstellen.

    InputReader wandelt die X- und Y-Neigungskomponenten in eine senkrechte Richtung um. Neigungswinkel zwischen 0 und PI / 2 Radiant und einem planaren Ausrichtungswinkel zwischen -PI und PI Radianten liegen. Diese Darstellung führt zu einer Beschreibung der Ausrichtung, die mit dem, was zur Beschreibung verwendet wird, kompatibel ist die Finger berührt.

    Die Angabe von Neigungsinformationen ist optional, wird aber für Eingabestift-Geräte empfohlen.

  • Wenn der Tooltyp von ABS_MT_TOOL_TYPE gemeldet wird, hat es Vorrang vor allen Tools Typinformationen, die von BTN_TOOL_* gemeldet wurden. Wenn keine Informationen zum Tooltyp verfügbar sind, wird standardmäßig MotionEvent.TOOL_TYPE_FINGER

  • Ein Tool wird basierend auf den folgenden Bedingungen als aktiv bestimmt:

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

      Diese Bedingung impliziert, dass InputReader mindestens einige Informationen über die Beschaffenheit des Tools, sei es ein Berühren, oder zumindest den Tool-Typ. Wenn keine Informationen verfügbar sind, wird davon ausgegangen, dass das Tool inaktiv ist (außerhalb des zulässigen Bereichs).

    • Wenn Sie das Multi-Touch-Protokoll „A“ verwenden, ist das Tool immer dann aktiv, wird im neuesten Synchronisierungsbericht angezeigt. Wenn das Tool nicht mehr angezeigt wird, Synchronisierungsberichte ist er nicht mehr vorhanden.
    • Bei Verwendung des Multi-Touch-Protokolls „B“ ist das Tool aktiv, es eine aktive Anzeigenfläche hat. Nachdem die Anzeigenfläche gelöscht wurde, ist das Werkzeug nicht mehr vorhanden.
  • Ein Tool wird basierend auf den folgenden Bedingungen als schwebend definiert:
    <ph type="x-smartling-placeholder">
      </ph>
    • Wenn das Tool den Status BTN_TOOL_MOUSE oder BTN_TOOL_LENS hat, sich nicht bewegt, auch wenn eine der folgenden Bedingungen erfüllt ist.
    • Wenn das Tool aktiv ist und der Fahrer den Druck meldet, und der gemeldete Druck gleich null ist, bewegt sich das Tool.
    • Wenn das Tool aktiv ist und der Treiber den Schlüsselcode BTN_TOUCH und BTN_TOUCH den Wert null hat, bewegt sich das Tool entsprechend.
  • InputReader unterstützt sowohl das Multi-Touch-Protokoll A und 'B'. Neue Treiber das „B“ Beides funktioniert.
  • Ab Android 4.0 müssen Treiber für Touchscreens möglicherweise geändert werden um der Linux-Spezifikation für das Eingabeprotokoll zu entsprechen.

    Folgende Änderungen sind möglicherweise erforderlich:

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

      Frühere Android-Versionen sollten "up" sein die durch das Senden von einen Druckwert von 0. Das alte Verhalten war nicht kompatibel mit dem Die Linux-Eingabeprotokollspezifikation und wird nicht mehr unterstützt.

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

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

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

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

    Touch-Gerätetreiber benötigen keine Android-spezifischen Anpassungen mehr. Durch die Nutzung des standardmäßigen Linux-Eingabeprotokolls kann Android eine Größere Auswahl an Peripheriegeräten, wie z. B. externes HID-Multi-Touch Touchscreens mit unveränderten Treibern.

Betrieb mit Touch-Gerät

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

  1. EventHub liest Rohereignisse aus dem evdev-Treiber.
  2. InputReader verarbeitet die Rohereignisse und aktualisiert den internen Status zu die Position und andere Merkmale der einzelnen Tools. Außerdem werden die Daten erfasst, Schaltflächenstatus.
  3. Wenn ZURÜCK oder WEITER gedrückt wurde, gilt Folgendes: InputReader benachrichtigt InputDispatcher über das Schlüsselereignis.
  4. InputReader bestimmt, ob ein virtueller Tastendruck erfolgt ist. Wenn ja, wird InputDispatcher über das Schlüsselereignis informiert.
  5. InputReader bestimmt, ob die Berührung innerhalb des Anzeigegrenzen. Falls ja, wird InputDispatcher über das Touch-Ereignis.
  6. Wenn sich keine Werkzeuge befinden, die sich berühren, aber mindestens ein Werkzeug vorhanden ist, das sich bewegt, InputReader benachrichtigt InputDispatcher über das Hover-Ereignis.
  7. Wenn das Touchgerät vom Typ Zeiger ist, führt InputReader einen Zeiger aus Bewegungserkennung, bewegt den Zeiger und erkennt entsprechend und benachrichtigt InputDispatcher zum Zeigerereignis.
  8. InputDispatcher verwendet WindowManagerPolicy, um zu bestimmen, sollten die Ereignisse ausgelöst werden und ob der Ruhemodus des Geräts beendet werden soll. Anschließend sendet InputDispatcher die Ereignisse an die entsprechenden Apps.

Konfiguration des Touch-Geräts

Das Verhalten des Touch-Geräts wird durch die Achsen, Tasten, Eingabeeigenschaften Konfiguration der Eingabegeräte, virtuelle Tastenbelegung und Tastenlayout.

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

Properties

Das System stützt sich bei der Konfiguration auf viele Eigenschaften der Eingabegerätekonfiguration. und das Verhalten des Touchgeräts zu kalibrieren.

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

Viele Touchgeräte messen beispielsweise den Berührungsbereich der Berührung. interne gerätespezifische Skala verwendet, wie z. B. die Gesamtzahl Sensorknoten, die durch die Berührung ausgelöst wurden. Dieser Rohgrößenwert würde sind für Apps nicht von Bedeutung, da sie wissen müssen, physische Größe und andere Eigenschaften der Sensorknoten des Touchgeräts

Das System verwendet Kalibrierungsparameter, die in der Konfiguration des Eingabegeräts codiert sind -Dateien zur Decodierung, Umwandlung und Normalisierung der bei Berührung gemeldeten Werte in eine einfachere Standarddarstellung umzuwandeln, die Apps verstehen können.

Dokumentationskonventionen

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

Rohdaten der Achsenwerte

Die folgenden Ausdrücke stehen für die unverarbeiteten Werte, die durch die Berührung gemeldet werden. Gerätetreiber als EV_ABS-Ereignisse.

raw.x
Der Wert der ABS_X- oder ABS_MT_POSITION_X-Achse.
raw.y
Der Wert der ABS_Y- oder ABS_MT_POSITION_Y-Achse.
raw.pressure
Der Wert der 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, wenn nicht verfügbar.
raw.toolMajor
Der Wert der ABS_TOOL_WIDTH- oder ABS_MT_WIDTH_MAJOR-Achse oder „0“, wenn nicht verfügbar.
raw.toolMinor
Der Wert der ABS_MT_WIDTH_MINOR-Achse oder raw.toolMajor, wenn 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 von Rohwerten an. Sie erhalten indem Sie für jede Achse EVIOCGABS ioctl aufrufen.

raw.*.min
Der inklusive Minimalwert der Rohachse.
raw.*.max
Der inklusive Maximalwert der Rohachse.
raw.*.range
Entspricht raw.*.max - raw.*.min.
raw.*.fuzz
Genauigkeit der Rohachse. z. B. „fuzz = 1“ bedeutet, dass die Werte auf +/- 1 Einheit genau sind.
raw.width
Die einschließlich der Breite des Touchbereichs, entspricht raw.x.range + 1.
raw.height
Die einschließlich der Höhe des Touchbereichs, entspricht raw.y.range + 1.

Ausgabebereiche

Die folgenden Ausdrücke geben die Eigenschaften des Ausgabekoordinatensystems an. Das System nutzt die lineare Interpolation, um Informationen zur Berührungsposition die vom Touch-Gerät verwendeten Oberflächeneinheiten in die Ausgabeeinheiten, die an Apps gemeldet werden, z. B. Displaypixel.

output.width
Die Breite der Ausgabe. Für Touchscreens (die mit einem Display verknüpft sind) ist die Anzeigebreite in Pixeln. Für Touchpads (nicht mit einem Display verknüpft): die Ausgabebreite gleich raw.width ist, was bedeutet, dass keine Interpolation durchgeführt wird.
output.height
Die Ausgabehöhe. Für Touchscreens (die mit einem Display verknüpft sind) ist die Anzeigehöhe in Pixeln. Für Touchpads (nicht mit einem Display verknüpft): die Ausgabehöhe gleich raw.height ist, was bedeutet, dass keine Interpolation durchgeführt haben.
output.diag
Die diagonale Länge des Ausgabekoordinatensystems, entspricht der sqrt(output.width ^2 + output.height ^2).

Grundlegende Konfiguration

Der Mapper zur Eingabe durch Berührung verwendet viele Konfigurationseigenschaften im Eingabegerät. Konfigurationsdatei zur Angabe von Kalibrierungswerten. In der folgenden Tabelle wird beschrieben, einige allgemeine Konfigurationseigenschaften. Alle anderen Eigenschaften werden in den folgenden Abschnitten zusammen mit den Feldern, die für die Kalibrierung verwendet werden.

Touchscreen-Typ

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

Gibt den Typ des Touch-Geräts an.

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

  • Wenn der Wert touchPad ist, ist das Touch-Gerät ein Touchpad, das nicht mit mit einem Display.

  • Wenn der Wert pointer ist, ist das Touch-Gerät ein Touchpad, das nicht mit mit einem Display. Seine Bewegungen werden indirekte Touch-Gesten für den Multi-Touch-Zeiger.

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

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

Unter Android 3 und niedriger wurde angenommen, dass es sich bei allen Touchscreen-Geräten um Touchscreens handelt.

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

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

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

  • Wenn der Wert 0 ist, sind die vom Touch-Gerät gemeldeten Berührungspositionen immun dagegen um Änderungen der Ausrichtung anzuzeigen.

Der Standardwert ist 1, wenn es sich um einen Touchscreen handelt, 0 sonst.

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

Die Funktion „Ausrichtungserkennung“ wird verwendet, um die Drehung von Touchscreens auf Geräten zu unterstützen. wie das Nexus One. Zum Beispiel, wenn das Gerät um 90 Grad im Uhrzeigersinn gedreht wird. ausgehend von ihrer natürlichen Ausrichtung werden die absoluten Positionen der Berührungen so neu zugeordnet, dass eine Berührung links oben im absoluten Koordinatensystem des Touchscreens wird als Berührung oben links im gedrehten Koordinatensystem des Bildschirms gemeldet. Dies geschieht, damit Berührungen mit demselben Koordinatensystem gemeldet werden, das auch Apps, um visuelle Elemente zu zeichnen.

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

Touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default.

Gibt den Präsentationsmodus für Zeigergesten an. Dieses Konfigurationsattribut ist nur relevant, wenn das Touchgerät vom Typ Zeiger ist.

  • Wenn der Wert pointer ist, werden die Touchpad-Gesten als Cursor dargestellt ähnlich wie ein Mauszeiger.

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

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

Felder „X“ und „Y“

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

Berechnung

Die Berechnung ist einfach: Positionsinformationen des Touch-Treibers linear mit dem Ausgabekoordinatensystem interpoliert wird.

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 Tools selbst in Ausgabeeinheiten (Pixel).

Das Feld size beschreibt die normalisierte Größe der Berührung relativ zu die größtmögliche Berührung, die das Touchgerät erfassen kann. Die kleinste mögliche normalisierte Größe ist 0,0 (kein Kontakt oder sie ist nicht messbar) und die größte mögliche normalisierte Größe bei 1,0 (Sensorbereich ist gesättigt).

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

Ebenso werden mit dem Feld toolMajor die längere Dimension und der toolMinor gibt die kürzere Abmessung des Querschnittsbereichs des Tools an.

Wenn die Berührungsgröße nicht verfügbar ist, aber die Toolgröße verfügbar ist, wird die Toolgröße der Touchscreen-Größe entspricht. Wenn die Toolgröße jedoch nicht verfügbar ist, die Berührungsgröße jedoch verfügbar ist, wird die Berührungsgröße der Toolgröße entsprechen.

Berührungsgeräte messen oder melden die Berührungsgröße und die Toolgröße auf unterschiedliche Weise. Die aktuelle Implementierung unterstützt drei verschiedene Arten von Messungen: Durchmesser, Fläche und geometrischer Markierungsrahmen in Flächeneinheiten.

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

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

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

  • Wenn der Wert geometric ist, wird angenommen, dass die Größe im selben Flächeneinheiten als Position, sodass sie auf die gleiche Weise skaliert wird.

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

  • Wenn der Wert area ist, wird angenommen, dass die Größe proportional zur des Berührungsbereichs oder des Tools.

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

touch.size.scale

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

Gibt einen konstanten Skalierungsfaktor an, der für die Kalibrierung verwendet wird.

Der Standardwert ist 1.0.

touch.size.bias

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

Gibt einen Wert für die konstante Verzerrung an, der für die 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 aktive Kontakte oder wird für jeden Kontakt einzeln gemeldet.

  • Wenn der Wert 1 ist, wird die gemeldete Größe durch die Zahl geteilt. vor der Verwendung von Kontakten gespeichert.

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

Der Standardwert ist 0.

Einige Touch-Geräte, insbesondere "Semi-MT" können Geräte die für die einzelnen Dimensionen mehrerer Kontakte festlegen, die ihre Gesamtfläche oder Breite darstellen. Diese Eigenschaft sollte nur auf 1 für solche Geräte. Im Zweifelsfall setzen Sie diesen Wert auf 0.

Berechnung

Die Berechnung von touchMajor, touchMinor, toolMajor, toolMinor, und size abhängig von den angegebenen Kalibrierungsparametern.

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

Im Feld pressure wird der ungefähre physische Druck angegeben, der auf den Touch-Gerät als normalisierter Wert zwischen 0,0 (keine Berührung) und 1,0 (Normaldruck).

Druck von null bedeutet, dass sich das Tool in der Position befindet.

touch.druck.kalibrierung

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

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

  • Wenn der Wert none ist, ist der Druck unbekannt und wird daher auf 1,0 gesetzt, und 0,0, wenn die Maus darüber bewegt wird.

  • Wenn der Wert physical ist, wird angenommen, dass die Druckachse den tatsächlichen Wert der physischer Druck, der auf das Touchpad ausgeübt wird.

  • Wenn der Wert amplitude ist, wird angenommen, dass die Druckachse das Signal misst. Amplitude, die sich auf die Größe des Kontakts und den aufgewendeten Druck bezieht.

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

Touch.Druck.Skalierung

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

Gibt einen konstanten Skalierungsfaktor an, der für die Kalibrierung verwendet wird.

Der Standardwert ist 1.0 / raw.pressure.max.

Berechnung

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

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

Ausrichtungs- und Neigungsfelder

Das Feld orientation beschreibt die Ausrichtung der Berührung und des Tools als Winkelmessung. Die Ausrichtung 0 gibt an, dass die Hauptachse vertikal ausgerichtet ist, gibt -PI/2 an, dass die Hauptachse links ausgerichtet ist, PI/2 gibt an, dass die Hauptachse nach rechts ausgerichtet ist. Wenn ein Eingabestift Tool vorhanden ist, kann der Ausrichtungsbereich als Vollkreis dargestellt werden. von -PI oder PI.

Im Feld tilt wird die Neigung des Werkzeugs als Winkelmessung angegeben. Eine Neigung von 0 gibt an, dass das Werkzeug senkrecht zur Oberfläche steht. Eine Neigung von PI/2 zeigt an, dass das Werkzeug flach auf der Oberfläche liegt.

Touch.Ausrichtung.Kalibrierung

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

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

  • Wenn der Wert none ist, ist die Ausrichtung unbekannt und wird daher auf 0 festgelegt.
  • Wenn der Wert interpolated ist, wird die Ausrichtung linear interpoliert, sodass ein Der Rohwert von raw.orientation.min wird -PI/2 zugeordnet und der Rohwert ist raw.orientation.max wird PI/2 zugeordnet. Der Mittenwert von (raw.orientation.min + raw.orientation.max) / 2 verweist auf 0.
  • Wenn der Wert vector ist, wird die Ausrichtung als gepackter Vektor interpretiert, zwei signierten 4-Bit-Felder. Diese Darstellung wird auf dem objektbasierten Atmel-Protokoll verwendet Teile. Nach der Decodierung liefert der Vektor einen Ausrichtungswinkel und eine Konfidenz Größenordnung. Die Konfidenzgröße wird verwendet, um die Größeninformationen es sei denn, es ist geometrisch.
  • Wenn der Wert default ist, verwendet das System die interpolated-Kalibrierung wenn die Ausrichtungsachse verfügbar ist. Andernfalls wird none verwendet.

Berechnung

Die Berechnung der Felder orientation und tilt hängt von der die angegebenen Kalibrierungsparameter und die verfügbare Eingabe.

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

Distanzfeld

Das Feld distance beschreibt den Abstand zwischen dem Tool und dem Touch-Gerät. Oberfläche. Ein Wert von 0,0 steht für einen direkten Kontakt, größere Werte geben an, um den Abstand zur Oberfläche zu vergrößern.

touch.distance.calibration

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

Gibt die Art der Messung an, die der Touchscreen-Treiber verwendet, um die Entfernung aufzuzeichnen.

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

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

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

touch.distance.scale

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

Gibt einen konstanten Skalierungsfaktor an, der für die Kalibrierung verwendet wird.

Der Standardwert ist 1.0.

Berechnung

Die Berechnung des Felds distance hängt von der angegebenen Kalibrierung ab Parameter.

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 haben sich im folgenden Jahr erheblich geändert: Android Ice Cream Sandwich 4.0 Alle Konfigurationsdateien für Eingabegeräte für Berührung Geräte aktualisiert werden müssen, damit sie die neuen Konfigurationseigenschaften verwenden.

Ältere Treiber von Touch-Geräten müssen möglicherweise auch aktualisiert.

Dateien für die Zuordnung virtueller Schlüssel

Mit Touchgeräten können virtuelle Tasten implementiert werden.

Dafür gibt es je nach den Funktionen des Touch-Controller. Einige Touch-Controller können direkt für die Implementierung Softkeys durch die Einrichtung von Firmware-Registern. In anderen Fällen ist es wünschenswert, die Zuordnung von Berührungskoordinaten zu Tastencodes in Software.

Wenn virtuelle Schlüssel in Software implementiert sind, muss der Kernel eine virtuelle Schlüsselzuordnung exportieren Datei namens virtualkeys.<devicename> als Board-Eigenschaft. Beispiel: wenn der Treiber des Touchscreens seinen Namen als „touchyfeely“ meldet dann muss die virtuelle Schlüsselzuordnungsdatei den Pfad /sys/board_properties/virtualkeys.touchyfeely

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

Zusätzlich zur Datei für die virtuelle Tastenbelegung muss ein entsprechendes Tastenlayout vorhanden sein. und die Schlüsselzeichenzuordnungsdatei, um die Linux-Schlüsselcodes den Android-Schlüsselcodes zuzuordnen. um den Typ des Tastaturgeräts anzugeben (normalerweise SPECIAL_FUNCTION).

Syntax

Eine virtuelle Schlüsselzuordnungsdatei ist eine Nur-Text-Datei, die aus einer Abfolge virtueller Schlüssel besteht. die entweder durch Zeilenumbrüche oder Doppelpunkte voneinander getrennt sind.

Kommentarzeilen beginnen mit "#" bis zum Zeilenende.

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

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

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

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

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

Dieselbe virtuelle Keymap-Datei 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. Entsprechend sind alle die virtuellen Schlüssel haben ein <centerY> Koordinate von 835, die etwas unter dem des sichtbaren Bereichs des Touchscreens.

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

Beispiel

Virtuelle Schlüsselzuordnungsdatei: /sys/board_properties/virtualkeys.touchyfeely.

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

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

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

Schlüsselzeichenzuordnungsdatei: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Indirekte Touch-Gesten für den Multi-Touch-Zeiger

Im Zeigermodus interpretiert das System die folgenden Touch-Gesten:

  • Tippen mit einem Finger: Klicken.
  • Bewegung mit einem Finger: Zeiger bewegen
  • Bewegen des Pluszeichens mit einem einzelnen Finger: Ziehen Sie den Zeiger.
  • Bewegung mit zwei Fingern in dieselbe Richtung: Ziehen Sie den Bereich unter dem Zeiger. in diese Richtung zu lenken. Der Zeiger selbst bewegt sich nicht.
  • Bewegung mit zwei Fingern, wobei sich beide Finger zu- oder auseinander bewegen verschiedene Richtungen: Schwenken/Skalieren/Drehen des Bereichs, der den Zeiger umgibt. Der Zeiger selbst bewegt sich nicht.
  • Mehrere Fingerbewegungen: Freiform-Geste.

Ablehnung der Handfläche

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

Das tatsächliche Modell betrachtet die ersten 90 ms der Bewegungsdaten am aktuellen Zeiger die umgebenden Zeiger und berücksichtigt, wie weit die Berührungen vom Displayrand entfernt sind. Dann wird für jeden Zeiger bestimmt, welche Zeiger Handflächen sind. Sie berücksichtigt auch Größe jedes Kontakts, wie von touchMajor und touchMinor. Das Android-Framework entfernt dann die Cursor, die als Handflächen vom Berührungsstream entfernt.

Wenn bereits ein Zeiger an die Apps gesendet wurde, hat das System entweder

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

Die öffentliche API MotionEvent.FLAG_CANCELED gibt an, dass die aktuelle sollte keine Nutzeraktion auslösen. Dieses Flag ist sowohl für ACTION_CANCEL und ACTION_POINTER_UP.

Wenn der Handballenzeiger nicht an Apps gesendet wird, lässt das System ihn einfach fallen.

Handflächenablehnung aktivieren

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

    Die Unterstützung von ABS_MT_TOUCH_MINOR ist optional. Wenn Ihr Gerät jedoch unterstützen, achten Sie darauf, dass die Auflösung richtig eingestellt ist.

  2. Führen Sie folgenden Befehl aus, um zu bestätigen, dass die Felder richtig festgelegt sind:
        $ adb shell getevent -li
    
  3. Führen Sie folgenden Befehl aus, um das Feature während der Laufzeit zu aktivieren:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Starten Sie den system_server-Prozess neu.
         $ adb shell stop && adb shell start
        
  5. Bestätige, dass sich in adb shell dumpsys input Handflächenablehnungen befinden UnwantedInteractionBlocker. Ist dies nicht der Fall, überprüfen Sie die eingabebezogenen Logs, Hinweise darauf, was falsch konfiguriert sein könnte.

    Das folgende Beispiel dient 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 die init**rc Datei:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Weitere Informationen