Android unterstützt eine Vielzahl von Touchscreens und Touchpads, darunter auch Tablets mit Stifteingabe.
Touchscreens sind Touch-Geräte, die mit einem Display verbunden sind, sodass der Nutzer den Eindruck hat, Elemente auf dem Bildschirm direkt zu bearbeiten.
Touchpads sind Touch-Geräte, die nicht mit einem Display verbunden sind, z. B. ein Grafiktablett. Touchpads werden in der Regel zum Zeigen oder für die absolute indirekte Positionierung oder die gestenbasierte Steuerung einer Benutzeroberfläche verwendet.
Touchgeräte können Tasten haben, deren Funktionen denen von Maustasten ähneln.
Touch-Geräte können manchmal mit verschiedenen Tools wie Fingern oder einem Stift bedient werden, je nach zugrunde liegender Touch-Sensor-Technologie.
Auf Touchgeräten werden manchmal virtuelle Tasten verwendet. Auf einigen Android-Geräten erstreckt sich der Touchscreen-Sensorbereich beispielsweise über den Rand des Displays hinaus und dient als Teil eines berührungsempfindlichen Tastenfelds.
Aufgrund der großen Vielfalt an Touch-Geräten verwendet Android eine große Anzahl von Konfigurationseigenschaften, um die Eigenschaften und das gewünschte Verhalten jedes Geräts zu beschreiben.
Klassifizierung von Touchgeräten
Ein Eingabegerät wird als Multitouch-Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:
- Das Eingabegerät meldet das Vorhandensein der absoluten Achsen
ABS_MT_POSITION_X
undABS_MT_POSITION_Y
. - Das Eingabegerät hat keine Gamepad-Tasten. Diese Bedingung behebt eine Unklarheit 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 wird nicht als Multitouch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Single-Touch-Gerät oder als Multi-Touch-Gerät klassifiziert, niemals als beides.
- Das Eingabegerät meldet das Vorhandensein der absoluten Achsen
ABS_X
undABS_Y
sowie des TastencodesBTN_TOUCH
.
Wenn ein Eingabegerät als Touchgerät klassifiziert wird, wird das Vorhandensein virtueller Tasten durch den Versuch bestimmt, die Datei mit der virtuellen Tastenzuordnung für das Gerät zu laden. Wenn eine virtuelle Tastenzuordnung verfügbar ist, wird auch die Datei mit dem Tastaturlayout für das Gerät geladen. Informationen zum Speicherort und Format dieser Dateien finden Sie unter [Dateien für virtuelle Tastenzuordnung](#virtual-key-map-files).
Als Nächstes lädt das System die Konfigurationsdatei für das Eingabegerät für das Touchgerät.
Alle integrierten Touch-Geräte sollten Konfigurationsdateien für Eingabegeräte haben. Wenn keine Konfigurationsdatei für Eingabegeräte vorhanden ist, wählt das System eine Standardkonfiguration aus, die für universelle Touch-Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder Touchpads geeignet ist. Diese Standardeinstellungen sind nicht für integrierte Touchscreens vorgesehen und können zu einem falschen Verhalten führen.
Nachdem die Konfiguration des Eingabegeräts geladen wurde, klassifiziert das System das Eingabegerät als Touchscreen, Touchpad oder Zeigergerät.
- Ein Gerät mit Touchscreen wird für die direkte Bearbeitung von Objekten auf dem Bildschirm verwendet. Der Nutzer berührt den Bildschirm direkt. Das System benötigt daher keine zusätzlichen Hinweise, um die manipulierten Objekte zu identifizieren.
- Ein Gerät mit Touchpad liefert Informationen zur absoluten Positionierung für eine App in Bezug auf Berührungen in einem bestimmten Sensorbereich. Das kann für Grafiktablets nützlich sein.
- Ein Zeigergerät wird für die indirekte Bearbeitung von Objekten auf dem Bildschirm mithilfe eines Cursors verwendet. Finger werden als Multi-Touch-Zeigergesten interpretiert. Andere Tools wie 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 Zeigegerät zu klassifizieren.
- Wenn die Property
touch.deviceType
festgelegt ist, wird der Gerätetyp entsprechend festgelegt. - Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft
INPUT_PROP_DIRECT
über den ioctlEVIOCGPROP
meldet, wird der Gerätetyp auf Touchscreen festgelegt. Bei dieser Bedingung wird davon ausgegangen, dass Geräte mit direkter Touch-Eingabe an einen Bildschirm angeschlossen sind, der ebenfalls verbunden ist. - Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft
INPUT_PROP_POINTER
(über den ioctlEVIOCGPROP
) meldet, wird der Gerätetyp auf pointer gesetzt. - Wenn das Eingabegerät die relativen Achsen
REL_X
oderREL_Y
meldet, wird der Gerätetyp auf Touchpad festgelegt. Diese Bedingung behebt eine Unklarheit bei Eingabegeräten, die sowohl aus einer Maus als auch aus einem Touchpad bestehen. In diesem Fall wird das Touchpad nicht zum Steuern des Mauszeigers verwendet, da dies bereits durch die Maus erfolgt. - Andernfalls wird der Gerätetyp auf pointer gesetzt. Dieser Standardwert sorgt dafür, dass Touchpads, denen keine andere spezielle Funktion zugewiesen wurde, den Mauszeiger steuern.
Schaltflächen
Schaltflächen sind optionale Steuerelemente, mit denen Apps zusätzliche Funktionen ausführen können. Schaltflächen auf Touchgeräten verhalten sich ähnlich wie Maustasten und sind hauptsächlich für Touchgeräte vom Typ Zeiger oder für die Verwendung mit einem Stift vorgesehen.
Die folgenden Schaltflächen werden unterstützt:
BTN_LEFT
: Zugeordnet zuMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: Zugeordnet zuMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: Zugeordnet zuMotionEvent.BUTTON_MIDDLE
.BTN_BACK
undBTN_SIDE
: Zugeordnet zuMotionEvent.BUTTON_BACK
. Durch Drücken dieser Schaltfläche wird auch ein Tastendruck mit dem TastencodeKeyEvent.KEYCODE_BACK
simuliert.BTN_FORWARD
undBTN_EXTRA
: Zugeordnet zuMotionEvent.BUTTON_FORWARD
. Durch Drücken dieser Taste wird auch ein Tastendruck mit dem TastencodeKeyEvent.KEYCODE_FORWARD
simuliert.BTN_STYLUS
: Zugeordnet zuMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: Zugeordnet zuMotionEvent.BUTTON_TERTIARY
.
Tools und Tool-Typen
Ein Tool ist ein Finger, ein Stift oder ein anderes Gerät, das zur Interaktion mit dem Touchgerät verwendet wird. Einige Touch-Geräte können zwischen verschiedenen Arten von Werkzeugen unterscheiden.
An anderer Stelle in Android, z. B. in der MotionEvent
API, wird ein Tool oft als Zeiger bezeichnet.
Die folgenden Tooltypen werden unterstützt:
BTN_TOOL_FINGER
undMT_TOOL_FINGER
: Zugeordnet zuMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
undMT_TOOL_PEN
: Zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: Zugeordnet zuMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: Zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: Zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: Zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: Zugeordnet zuMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: Zugeordnet zuMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
undBTN_TOOL_QUADTAP
: WerdenMotionEvent.TOOL_TYPE_FINGER
zugeordnet.
Tools mit dem Mauszeiger oder durch Berührung auswählen
Das Werkzeug kann entweder das Touch-Gerät berühren oder sich in Reichweite befinden und darüber schweben. Nicht alle Touch-Geräte können erkennen, wenn sich ein Tool über dem Touch-Gerät befindet. Bei einigen, z. B. bei auf Funkfrequenz basierenden Stiftdigitalisierern, kann oft erkannt werden, wenn sich das Tool in einem begrenzten Bereich des Digitalisierers befindet.
Die InputReader
-Komponente unterscheidet zwischen Tools, die berührt werden, und Tools, die sich im Hover-Zustand befinden. Auch die Art und Weise, wie Berührungs- und Hover-Tools an Apps gemeldet werden, ist unterschiedlich.
Berührungstools werden Apps als Touch-Ereignisse mit MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
und MotionEvent.ACTION_POINTER_UP
gemeldet.
Hovering-Tools werden Apps als generische Bewegungsereignisse über MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
und MotionEvent.ACTION_HOVER_EXIT
gemeldet.
Treiberanforderungen für Touchgeräte
- Touch-Gerätetreiber sollten nur die Achsen und Tastencodes für die von ihnen unterstützten Achsen und Tasten registrieren. 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, dassBTN_TOUCH
immer verwendet wird, um anzugeben, ob das Tool den Bildschirm berührt.BTN_TOUCH
sollte daher nicht verwendet werden, um anzugeben, dass sich das Tool nur im Bereich befindet und schwebt. - Auf Geräten mit Single-Touch werden die folgenden Linux-Eingabeereignisse verwendet:
ABS_X
: ERFORDERLICH Meldet die X-Koordinate des Tools.ABS_Y
: ERFORDERLICH Gibt die Y-Koordinate des Tools an.ABS_PRESSURE
: (optional) Gibt den physischen Druck an, der auf die Spitze des Tools ausgeübt wird, oder die Signalstärke des Berührungskontakts.ABS_TOOL_WIDTH
: (optional) Gibt die Querschnittsfläche oder Breite des Berührungskontakts oder des Tools selbst an.ABS_DISTANCE
: (optional) Gibt die Entfernung des Tools von der Oberfläche des Touchgeräts an.ABS_TILT_X
: (optional) Gibt die Neigung des Tools von der Oberfläche des Touch-Geräts entlang der X-Achse an.ABS_TILT_Y
: (Optional) Gibt die Neigung des Tools von der Oberfläche des Touchgeräts entlang der Y-Achse an.BTN_TOUCH
: ERFORDERLICH Gibt an, ob das Tool das Gerät berührt.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (optional) Meldet den Status der Schaltfläche.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (optional) Meldet den Tool-Typ.
- Auf Multi-Touch-Geräten werden die folgenden Linux-Eingabeereignisse verwendet:
ABS_MT_POSITION_X
: ERFORDERLICH Meldet die X-Koordinate des Tools.ABS_MT_POSITION_Y
: ERFORDERLICH Gibt die Y-Koordinate des Tools an.ABS_MT_PRESSURE
: (optional) Gibt den physischen Druck an, der auf die Spitze des Tools ausgeübt wird, oder die Signalstärke des Berührungskontakts.ABS_MT_TOUCH_MAJOR
: (optional) Gibt die Querschnittsfläche des Berührungskontakts oder die Länge der längeren Dimension des Berührungskontakts an.ABS_MT_TOUCH_MINOR
: (optional) Gibt die Länge der kürzeren Dimension des Touch-Kontakts an. Diese Achse sollte nicht verwendet werden, wennABS_MT_TOUCH_MAJOR
eine Flächenmessung meldet.ABS_MT_WIDTH_MAJOR
: (optional) Gibt die Querschnittsfläche des Tools selbst oder die Länge der längeren Abmessung des Tools selbst an. Verwenden Sie diese Achse nur, wenn Sie die Abmessungen des Werkzeugs kennen.ABS_MT_WIDTH_MINOR
: (optional) Gibt die Länge der kürzeren Dimension des Tools selbst an. Diese Achse sollte nicht verwendet werden, wenn fürABS_MT_WIDTH_MAJOR
eine Flächenmessung gemeldet wird oder die Abmessungen des Tools selbst unbekannt sind.ABS_MT_ORIENTATION
: (optional) Gibt die Ausrichtung des Tools an.ABS_MT_DISTANCE
: (optional) Gibt die Entfernung des Tools von der Oberfläche des Touch-Geräts an.ABS_MT_TOOL_TYPE
: (optional) Gibt den Tooltyp alsMT_TOOL_FINGER
oderMT_TOOL_PEN
an.ABS_MT_TRACKING_ID
: (optional) Gibt die Tracking-ID des Tools an. Die Tracking-ID ist eine beliebige nicht negative Ganzzahl, mit der jedes Tool unabhängig identifiziert und verfolgt wird, wenn mehrere Tools aktiv sind. Wenn beispielsweise mehrere Finger das Gerät berühren, sollte jedem Finger eine eindeutige Tracking-ID zugewiesen werden, die verwendet wird, solange der Finger in Kontakt bleibt. Tracking-IDs können wiederverwendet werden, wenn die zugehörigen Tools nicht mehr in Reichweite sind.ABS_MT_SLOT
: (optional) Meldet die Slot-ID des Tools, wenn das Linux-Multitouch-Protokoll „B“ verwendet wird. Weitere Informationen finden Sie in der Dokumentation zum Linux-Multitouch-Protokoll.BTN_TOUCH
: ERFORDERLICH Gibt an, ob das Tool das Gerät berührt.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (optional) Meldet den Status der Schaltfläche.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (optional): Meldet den Tool-Typ.
- Wenn Achsen für das Single-Touch- und das Multi-Touch-Protokoll definiert sind, werden nur die Multi-Touch-Achsen verwendet und die Single-Touch-Achsen ignoriert.
Die Mindest- und Höchstwerte der Achsen
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
undABS_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 Touchgeräts, der das Display tatsächlich abdeckt.Bei einem Touchscreen interpoliert das System die gemeldeten Berührungspositionen in Oberflächeneinheiten automatisch, um Berührungspositionen in Displaypixeln zu erhalten. Die Berechnung erfolgt nach folgender Formel:
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 erfolgen, werden nicht an Apps weitergeleitet, können aber für virtuelle Tasten verwendet werden.
Berührungen, die im aktiven Bereich beginnen oder in den Displaybereich eintreten und ihn wieder verlassen, werden an Apps weitergeleitet. Wenn eine Berührung innerhalb der Grenzen einer App beginnt und sich dann außerhalb des aktiven Bereichs bewegt, erhält die App möglicherweise Berührungsereignisse mit Anzeigekoordinaten, die negativ sind oder über die Grenzen des Displays hinausgehen. Das ist so vorgesehen.
Bei einem Touchgerät sollten die Touch-Koordinaten niemals auf die Grenzen des aktiven Bereichs beschränkt werden. Wenn eine Berührung den aktiven Bereich verlässt, sollte sie als außerhalb des aktiven Bereichs gemeldet oder gar nicht gemeldet werden.
Wenn der Finger des Nutzers beispielsweise die linke obere Ecke des Touchscreens berührt, wird möglicherweise die Koordinate (minX, minY) gemeldet. Wenn sich der Finger weiter außerhalb des aktiven Bereichs bewegt, sollte der Touchscreen entweder Koordinaten mit Komponenten melden, die kleiner als minX und minY sind, z. B. (minX – 2, minY – 3), oder die Berührung sollte nicht mehr gemeldet werden. Mit anderen Worten: Der Touchscreen sollte nicht (minX, minY) melden, wenn der Finger des Nutzers tatsächlich außerhalb des aktiven Bereichs liegt.
Wenn die Touch-Koordinaten an den Displayrand angelegt werden, entsteht eine künstliche harte Grenze am Bildschirmrand. Dadurch kann das System Bewegungen, die in den Displaybereich eintreten oder ihn verlassen, nicht reibungslos erfassen.
Die von
ABS_PRESSURE
oderABS_MT_PRESSURE
gemeldeten Werte müssen, sofern sie überhaupt gemeldet werden, ungleich null sein, wenn das Tool das Gerät berührt, und andernfalls null, um anzuzeigen, dass das Tool schwebt.Die Angabe von Druckinformationen ist optional, wird aber dringend empfohlen. Apps können Druckinformationen verwenden, um druckempfindliches Zeichnen und andere Effekte zu implementieren.
Die von
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
oderABS_MT_WIDTH_MINOR
gemeldeten Werte sollten ungleich null sein, wenn das Tool das Gerät berührt, und ansonsten null. Dies ist jedoch nicht erforderlich. Ein Touch-Gerät kann beispielsweise die Größe von Fingerberührungen, aber nicht von Stiftberührungen messen.Die Angabe von Größeninformationen ist optional, wird aber dringend empfohlen. Apps können Druckinformationen verwenden, um größenabhängige Zeichnungen und andere Effekte zu implementieren.
Die von
ABS_DISTANCE
oderABS_MT_DISTANCE
gemeldeten Werte sollten gegen null gehen, wenn das Tool das Gerät berührt. Der Abstand kann auch dann ungleich null bleiben, wenn das Werkzeug direkten Kontakt hat. Die genauen gemeldeten Werte hängen davon ab, wie die Hardware die Entfernung misst.Die Angabe von Distanzinformationen ist optional, wird aber für Stiftgeräte empfohlen.
Die von
ABS_TILT_X
undABS_TILT_Y
gemeldeten Werte sollten null sein, wenn das Tool senkrecht zum Gerät steht. Eine Neigung ungleich null bedeutet, dass das Tool geneigt gehalten wird.Die Neigungswinkel entlang der X- und Y-Achse werden in Grad von der Senkrechten aus angegeben. Der Mittelpunkt (senkrecht) wird für jede Achse durch
(max + min) / 2
angegeben. Werte, die kleiner als der Mittelpunkt sind, stehen für eine Neigung nach oben oder links, Werte, die größer als der Mittelpunkt sind, für eine Neigung nach unten oder rechts.Mit
InputReader
werden die X- und Y-Neigungskomponenten in einen senkrechten Neigungswinkel zwischen 0 undPI / 2
Radianten und einen planaren Ausrichtungswinkel zwischen-PI
undPI
Radianten umgewandelt. Diese Darstellung führt zu einer Beschreibung der Ausrichtung, die mit der Beschreibung von Fingerberührungen kompatibel ist.Das Melden von Neigungsinformationen ist optional, wird aber für Stiftgeräte empfohlen.
Wenn der Tooltyp von
ABS_MT_TOOL_TYPE
gemeldet wird, hat er Vorrang vor allen Tooltyp-Informationen, die vonBTN_TOOL_*
gemeldet werden. Wenn überhaupt keine Informationen zum Tooltyp verfügbar sind, wird standardmäßigMotionEvent.TOOL_TYPE_FINGER
verwendet.Ein Tool gilt unter den folgenden Bedingungen als aktiv:
Bei Verwendung des Single-Touch-Protokolls ist das Tool aktiv, wenn
BTN_TOUCH
oderBTN_TOOL_*
gleich 1 ist.Diese Bedingung impliziert, dass
InputReader
zumindest einige Informationen zur Art des Werkzeugs enthalten muss, z. B. ob es berührt wird oder zumindest den Werkzeugtyp. Wenn keine Informationen verfügbar sind, wird davon ausgegangen, dass das Tool inaktiv ist (außerhalb des Bereichs).- Bei Verwendung des Multitouch-Protokolls A ist das Tool aktiv, wenn es im letzten Synchronisierungsbericht angezeigt wird. Wenn das Tool nicht mehr in Synchronisierungsberichten angezeigt wird, ist es nicht mehr vorhanden.
- Bei Verwendung des Multitouch-Protokolls B ist das Tool aktiv, solange es einen aktiven Slot hat. Wenn der Slot gelöscht wird, ist das Tool nicht mehr vorhanden.
- Ein Tool wird unter den folgenden Bedingungen als schwebend eingestuft:
- Wenn das Tool
BTN_TOOL_MOUSE
oderBTN_TOOL_LENS
ist, wird es nicht schwebend angezeigt, auch wenn eine der folgenden Bedingungen erfüllt ist. - Wenn das Tool aktiv ist und der Stift Druckinformationen meldet und der gemeldete Druck null ist, schwebt das Tool.
- Wenn das Tool aktiv ist, der Treiber den Tastencode
BTN_TOUCH
unterstützt undBTN_TOUCH
den Wert 0 hat, wird das Tool schwebend dargestellt.
- Wenn das Tool
InputReader
unterstützt sowohl das Multi-Touch-Protokoll A als auch das Protokoll B. Neue Fahrer sollten das Protokoll „B“ verwenden, aber beide funktionieren.Ab Android 4.0 müssen Touchscreen-Treiber möglicherweise geändert werden, um der Spezifikation des Linux-Eingabeprotokolls zu entsprechen.
Möglicherweise sind folgende Änderungen erforderlich:
Wenn ein Tool inaktiv wird (Finger geht „hoch“), sollte es in nachfolgenden Berichten zur Synchronisierung von Multitouch-Gesten 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 vonSYN_REPORT
.In früheren Android-Versionen wurde erwartet, dass „up“-Ereignisse durch Senden eines Druckwerts von 0 gemeldet werden. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.
Informationen zum physischen Druck oder zur Signalstärke sollten mit
ABS_MT_PRESSURE
gemeldet werden.In früheren Android-Versionen wurden Druckinformationen aus
ABS_MT_TOUCH_MAJOR
abgerufen. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.- Informationen zur Berührungsgröße sollten mit
ABS_MT_TOUCH_MAJOR
gemeldet werden.In früheren Android-Versionen wurden Größeninformationen aus
ABS_MT_TOOL_MAJOR
abgerufen. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.
Bedienung von Touchgeräten
Im Folgenden finden Sie eine kurze Zusammenfassung der Bedienung von Touchgeräten unter Android.
EventHub
liest Rohereignisse aus demevdev
-Treiber.InputReader
verarbeitet die Rohereignisse und aktualisiert den internen Status in Bezug auf die Position und andere Merkmale der einzelnen Tools. Außerdem werden Schaltflächenstatus erfasst.- Wenn BACK oder FORWARD gedrückt oder losgelassen wurde, benachrichtigt
InputReader
InputDispatcher
über das Schlüsselereignis. InputReader
gibt an, ob ein virtueller Tastendruck erfolgt ist. Falls ja, wirdInputDispatcher
über das Schlüsselereignis benachrichtigt.InputReader
gibt an, ob die Berührung innerhalb der Grenzen des Displays erfolgt ist. In diesem Fall wirdInputDispatcher
über das Touch-Ereignis benachrichtigt.- Wenn es keine Tools gibt, die das Display berühren, aber mindestens ein Tool, das sich darüber befindet, benachrichtigt
InputReader
InputDispatcher
über das Hover-Ereignis. - Wenn der Touch-Gerätetyp pointer ist, führt
InputReader
die Erkennung von Zeigergesten aus, bewegt den Zeiger und die entsprechenden Punkte und benachrichtigtInputDispatcher
über das Zeigerereignis. InputDispatcher
verwendetWindowManagerPolicy
, um zu bestimmen, ob die Ereignisse gesendet werden sollen und ob sie das Gerät aktivieren sollen.InputDispatcher
leitet die Ereignisse dann an die entsprechenden Apps weiter.
Konfiguration von Touchgeräten
Das Verhalten bei Berührung wird durch die Achsen, Tasten, Eingabeeigenschaften, die Konfiguration des Eingabegeräts, die virtuelle Tastenzuordnung und das Tastaturlayout des Geräts bestimmt.
Weitere Informationen zu den Dateien, die an der Tastaturkonfiguration beteiligt sind, finden Sie in den folgenden Abschnitten:
Properties
Das System stützt sich auf viele Konfigurationseigenschaften für Eingabegeräte, um das Verhalten von Touchgeräten zu konfigurieren und zu kalibrieren.
Ein Grund dafür ist, dass die Gerätetreiber für Touchgeräte die Eigenschaften von Berührungen oft in gerätespezifischen Einheiten melden.
Viele Touchgeräte messen beispielsweise die Berührungsfläche anhand einer internen gerätespezifischen Skala, z. B. der Gesamtzahl der durch die Berührung ausgelösten Sensorknoten. Dieser Rohgrößenwert wäre für Apps nicht aussagekräftig, da sie die physische Größe und andere Merkmale der Touch-Gerätesensorknoten kennen müssten.
Das System verwendet Kalibrierungsparameter, die in den Konfigurationsdateien des Eingabegeräts codiert sind, um die vom Touch-Gerät gemeldeten Werte zu decodieren, zu transformieren und zu normalisieren. So werden sie in einer einfacheren Standarddarstellung wiedergegeben, die Apps verstehen können.
Konventionen für die Dokumentation
In der Dokumentation verwenden wir die folgenden Konventionen, um die Werte zu beschreiben, die vom System während der Kalibrierung verwendet werden.
Unverarbeitete Achsenwerte
Die folgenden Ausdrücke geben die Rohwerte an, die vom Touchgeräte-Treiber als EV_ABS
-Ereignisse gemeldet werden.
raw.x
- Der Wert der
ABS_X
- oderABS_MT_POSITION_X
-Achse. raw.y
- Der Wert der
ABS_Y
- oderABS_MT_POSITION_Y
-Achse. raw.pressure
- Der Wert der
ABS_PRESSURE
- oderABS_MT_PRESSURE
-Achse oder 0, falls nicht verfügbar. raw.touchMajor
- Der Wert der
ABS_MT_TOUCH_MAJOR
-Achse oder 0, falls nicht verfügbar. raw.touchMinor
- Der Wert der
ABS_MT_TOUCH_MINOR
-Achse oderraw.touchMajor
, falls nicht verfügbar. raw.toolMajor
- Der Wert der
ABS_TOOL_WIDTH
- oderABS_MT_WIDTH_MAJOR
-Achse oder 0, falls nicht verfügbar. raw.toolMinor
- Der Wert der
ABS_MT_WIDTH_MINOR
-Achse oderraw.toolMajor
, falls nicht verfügbar. raw.orientation
- Der Wert der
ABS_MT_ORIENTATION
-Achse oder 0, falls nicht verfügbar. raw.distance
- Der Wert der
ABS_DISTANCE
- oderABS_MT_DISTANCE
-Achse oder 0, falls nicht verfügbar. raw.tiltX
- Der Wert der
ABS_TILT_X
-Achse oder 0, falls nicht verfügbar. raw.tiltY
- Der Wert der
ABS_TILT_Y
-Achse oder 0, falls nicht verfügbar.
Rohachsenbereiche
Die folgenden Ausdrücke geben die Grenzen der Rohwerte an. Sie werden durch Aufrufen von EVIOCGABS
ioctl für jede Achse abgerufen.
raw.*.min
- Der inklusive Mindestwert der Rohachse.
raw.*.max
- Der inklusive Maximalwert der Rohachse.
raw.*.range
- Entspricht
raw.*.max - raw.*.min
. raw.*.fuzz
- Die Genauigkeit der Rohachse, z. B. „fuzz = 1“ bedeutet, dass die Werte auf +/- 1 Einheit genau sind.
raw.width
- Die Breite des Berührungsbereichs, einschließlich der Ränder, entspricht
raw.x.range + 1
. raw.height
- Die inklusive Höhe des Berührungsbereichs, entsprechend
raw.y.range + 1
.
Ausgabebereiche
Die folgenden Ausdrücke bezeichnen die Merkmale des Ausgabekoordinatensystems. Das System verwendet die lineare Interpolation, um Informationen zur Berührungsposition von den Oberflächeneinheiten des Touch-Geräts in die Ausgabeeinheiten zu übersetzen, die an Apps wie Displaypixel gemeldet werden.
output.width
- Die Ausgabebreite. Bei Touchscreens (die mit einem Display verbunden sind) ist dies die Displaybreite in Pixeln. Bei Touchpads, die nicht mit einem Display verbunden sind, entspricht die Ausgabebreite
raw.width
. Das bedeutet, dass keine Interpolation erfolgt. output.height
- Die Ausgabehöhe. Bei Touchscreens (die mit einem Display verbunden sind) ist dies die Höhe des Displays in Pixeln. Bei Touchpads, die nicht mit einem Display verknüpft sind, entspricht die Ausgabehöhe
raw.height
. Das bedeutet, dass keine Interpolation erfolgt. output.diag
- Die diagonale Länge des Ausgabekoordinatensystems, entsprechend
sqrt(output.width ^2 + output.height ^2)
.
Grundlegende Konfiguration
Der Touch-Eingabe-Mapper verwendet viele Konfigurationseigenschaften in der Konfigurationsdatei des Eingabegeräts, um Kalibrierungswerte anzugeben. In der folgenden Tabelle werden einige allgemeine Konfigurationseigenschaften beschrieben. Alle anderen Eigenschaften werden in den folgenden Abschnitten zusammen mit den Feldern beschrieben, die zur Abstimmung verwendet werden.
touch.deviceType
Definition:touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Gibt den Typ des Touch-Geräts an.
-
Wenn der Wert
touchScreen
ist, ist das Touch-Gerät ein Touchscreen, der mit einem Display verbunden ist. -
Wenn der Wert
touchPad
ist, ist das Touch-Gerät ein Touchpad, das nicht mit einem Display verbunden ist. -
Wenn der Wert
pointer
ist, handelt es sich bei dem Touch-Gerät um ein Touchpad, das nicht mit einem Display verbunden ist. Seine Bewegungen werden für indirekte Multi-Touch-Zeigergesten verwendet. -
Wenn der Wert
default
ist, erkennt das System den Gerätetyp automatisch anhand des Klassifizierungsalgorithmus.
Weitere Informationen dazu, wie sich der Gerätetyp auf das Verhalten des Touch-Geräts auswirkt, finden Sie im Abschnitt Klassifizierung.
In Android 3 und niedriger wurde davon ausgegangen, dass alle Touch-Geräte Touchscreens sind.
touch.orientationAware
Definition:touch.orientationAware
= 0
| 1
Gibt an, ob das Touchgerät auf Änderungen der Bildschirmausrichtung reagieren soll.
-
Wenn der Wert
1
ist, werden die vom Touch-Gerät gemeldeten Berührungspositionen gedreht, wenn sich die Ausrichtung des Displays ändert. -
Wenn der Wert
0
ist, sind die vom Touch-Gerät gemeldeten Berührungspositionen unabhängig von Änderungen der Displayausrichtung.
Der Standardwert ist 1
, wenn das Gerät ein Touchscreen ist, andernfalls 0
.
Das System unterscheidet zwischen internen und externen Touchscreens und Displays. Ein ausrichtungsabhängiger interner Touchscreen wird entsprechend der Ausrichtung des internen Displays gedreht. Ein ausrichtungsabhängiger externer Touchscreen wird entsprechend der Ausrichtung des externen Displays gedreht.
Die Ausrichtungserkennung wird verwendet, um die Drehung von Touchscreens auf Geräten wie dem Nexus One zu unterstützen. Wenn das Gerät beispielsweise um 90 Grad im Uhrzeigersinn gedreht wird, werden die absoluten Positionen von Berührungen so neu zugeordnet, dass eine Berührung in der oberen linken Ecke des absoluten Koordinatensystems des Touchscreens als Berührung in der oberen linken Ecke des gedrehten Koordinatensystems des Displays gemeldet wird. So werden Berührungen mit demselben Koordinatensystem gemeldet, das Apps zum Zeichnen ihrer visuellen Elemente verwenden.
Vor Honeycomb wurde davon ausgegangen, dass alle Touch-Geräte die Ausrichtung erkennen.
touch.gestureMode
Definition:touch.gestureMode
= pointer
| spots
|
default
Gibt den Präsentationsmodus für Zeigergesten an. Diese Konfigurationseigenschaft ist nur relevant, wenn das Touch-Gerät vom Typ pointer ist.
-
Wenn der Wert
pointer
ist, werden die Touchpad-Gesten über einen Cursor ähnlich einem Mauszeiger dargestellt. -
Wenn der Wert
spots
ist, werden die Touchpad-Gesten durch einen Anker dargestellt, der den Schwerpunkt der Geste repräsentiert, und eine Reihe von kreisförmigen Punkten, die die Position der einzelnen Finger darstellen.
Der Standardwert ist pointer
, wenn die Eingabe-Property INPUT_PROP_SEMI_MT
festgelegt ist, andernfalls spots
.
X- und Y-Felder
Die Felder „X“ und „Y“ enthalten Positionsinformationen für den Mittelpunkt des Kontaktbereichs.
Berechnung
Die Berechnung ist einfach: 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
Felder „touchMajor“, „touchMinor“, „toolMajor“, „toolMinor“ und „size“
Die Felder touchMajor
und touchMinor
beschreiben die ungefähren Abmessungen der Kontaktfläche in Ausgabeeinheiten (Pixel).
In den Feldern toolMajor
und toolMinor
werden die ungefähren Abmessungen des Tools selbst in Ausgabeeinheiten (Pixel) beschrieben.
Das Feld size
beschreibt die normalisierte Größe der Berührung im Verhältnis zur größtmöglichen Berührung, die das Touch-Gerät erkennen kann. Die kleinste mögliche normalisierte Größe ist 0, 0 (kein Kontakt oder nicht messbar) und die größte mögliche normalisierte Größe ist 1,0 (Sensorbereich ist gesättigt).
Wenn sowohl die ungefähre Länge als auch die ungefähre Breite gemessen werden können, gibt das Feld touchMajor
die längere und das Feld touchMinor
die kürzere Dimension der Kontaktfläche an. Wenn nur der ungefähre Durchmesser der Kontaktfläche gemessen werden kann, sind die Felder touchMajor
und touchMinor
gleich.
Entsprechend gibt das Feld toolMajor
die längere und das Feld toolMinor
die kürzere Abmessung des Querschnitts des Werkzeugs an.
Wenn die Berührungsgröße nicht verfügbar ist, aber die Werkzeuggröße verfügbar ist, wird die Werkzeuggröße auf die Berührungsgröße festgelegt. Wenn die Tool-Größe nicht verfügbar ist, die Touch-Größe aber schon, wird die Touch-Größe auf die Tool-Größe festgelegt.
Touch-Geräte messen oder melden die Touch- und Tool-Größe auf unterschiedliche Weise. Die aktuelle Implementierung unterstützt drei verschiedene Arten von Messungen: Durchmesser, Fläche und geometrische Bounding Box in Flächeneinheiten.
Definition:touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Touch-Größe und die Tool-Größe zu melden.
-
Wenn der Wert
none
ist, wird die Größe auf null gesetzt. -
Wenn der Wert
geometric
ist, wird davon ausgegangen, dass die Größe in denselben Oberflächeneinheiten wie die Position angegeben ist. Sie wird also auf dieselbe Weise skaliert. -
Wenn der Wert
diameter
ist, wird davon ausgegangen, dass die Größe proportional zum Durchmesser (zur Breite) der Berührung oder des Tools ist. -
Wenn der Wert
area
ist, wird davon ausgegangen, dass die Größe proportional zur Fläche der Berührung oder des Tools ist. -
Wenn der Wert
default
ist, verwendet das System diegeometric
-Abstimmung, sofern die Achseraw.touchMajor
oderraw.toolMajor
verfügbar ist. Andernfalls wird dienone
-Abstimmung verwendet.
touch.size.scale
Definition:touch.size.scale
= <a non-negative floating point number>
Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 1.0
.
touch.size.bias
Definition:touch.size.bias
= <a non-negative floating point number>
Gibt einen konstanten Bias-Wert an, der bei der Abstimmung verwendet wird.
Der Standardwert ist 0.0
.
touch.size.isSummed
Definition:touch.size.isSummed
= 0
| 1
Gibt an, ob die Größe als Summe der Größen aller aktiven Kontakte oder für jeden Kontakt einzeln angegeben wird.
-
Wenn der Wert
1
ist, wird die angegebene Größe vor der Verwendung durch die Anzahl der Kontakte geteilt. -
Wenn der Wert
0
ist, wird die angegebene Größe unverändert verwendet.
Der Standardwert ist 0
.
Einige Touch-Geräte, insbesondere „Semi-MT“-Geräte, können die einzelnen Dimensionen mehrerer Kontakte nicht unterscheiden. Daher wird eine Größenmessung gemeldet, die die Gesamtfläche oder ‑breite darstellt. Diese Property sollte für solche Geräte nur auf 1
festgelegt werden. Setzen Sie diesen Wert im Zweifelsfall auf 0
.
Berechnung
Die Berechnung der Felder touchMajor
, touchMinor
, toolMajor
, toolMinor
und size
hängt von den angegebenen Kalibrierungsparametern ab.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
Druckfeld
Das Feld pressure
beschreibt den ungefähren physischen Druck, der auf das Touch-Gerät ausgeübt wird, als normalisierten Wert zwischen 0,0 (keine Berührung) und 1,0 (normaler Druck).
Ein Druck von null bedeutet, dass das Tool schwebt.
touch.pressure.calibration
Definition:touch.pressure.calibration
= none
|
physical
| amplitude
| default
Gibt die Art der Messung an, die vom Touch-Treiber zum Melden des Drucks verwendet wird.
-
Wenn der Wert
none
ist, ist der Druck unbekannt. Er wird also auf 1,0 gesetzt, wenn das Display berührt wird, und auf 0,0, wenn der Finger darüber schwebt. -
Wenn der Wert
physical
ist, wird davon ausgegangen, dass die Druckachse die tatsächliche physische Intensität des auf das Touchpad ausgeübten Drucks misst. -
Wenn der Wert
amplitude
ist, wird davon ausgegangen, dass auf der Druckachse die Signalamplitude gemessen wird, die mit der Größe des Kontakts und dem ausgeübten Druck zusammenhängt. -
Wenn der Wert
default
ist, verwendet das System diephysical
-Abstimmung, sofern die Druckachse verfügbar ist. Andernfalls wirdnone
verwendet.
touch.pressure.scale
Definition:touch.pressure.scale
= <a non-negative floating point number>
Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 1.0 / raw.pressure.max
.
Berechnung
Die Berechnung des Felds pressure
hängt von den angegebenen Abgleichsparametern ab.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Felder für Ausrichtung und Neigung
Das Feld orientation
beschreibt die Ausrichtung der Berührung und des Tools als Winkelmessung. Eine Ausrichtung von 0
bedeutet, dass die Hauptachse vertikal ausgerichtet ist, -PI/2
, dass sie nach links ausgerichtet ist, und PI/2
, dass sie nach rechts ausgerichtet ist. Wenn ein Stift vorhanden ist, kann der Orientierungsbereich als vollständiger Kreisbereich von -PI
oder PI
beschrieben werden.
Im Feld tilt
wird die Neigung des Tools als Winkelmaß beschrieben.
Eine Neigung von 0
bedeutet, dass das Tool senkrecht zur Oberfläche ausgerichtet ist.
Eine Neigung von PI/2
bedeutet, dass das Tool flach auf der Oberfläche liegt.
touch.orientation.calibration
Definition:touch.orientation.calibration
= none
|
interpolated
| vector
| default
Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Ausrichtung zu melden.
- Wenn der Wert
none
ist, ist die Ausrichtung unbekannt und wird auf 0 gesetzt. - Wenn der Wert
interpolated
ist, wird die Ausrichtung linear interpoliert, sodass ein Rohwert vonraw.orientation.min
auf-PI/2
und ein Rohwert vonraw.orientation.max
aufPI/2
abgebildet wird. Der Mittelwert von(raw.orientation.min + raw.orientation.max) / 2
entspricht0
. - Wenn der Wert
vector
ist, wird die Ausrichtung als gepackter Vektor interpretiert, der aus zwei 4‑Bit-Feldern mit Vorzeichen besteht. Diese Darstellung wird für Teile des Atmel Object Based Protocol verwendet. Nach der Dekodierung ergibt der Vektor einen Ausrichtungswinkel und eine Konfidenzgröße. Die Konfidenz wird verwendet, um die Größeninformationen zu skalieren, sofern sie nicht geometrisch ist. - Wenn der Wert
default
ist, verwendet das System dieinterpolated
-Abstimmung, sofern die Ausrichtungsachse verfügbar ist. Andernfalls wirdnone
verwendet.
Berechnung
Die Berechnung der Felder orientation
und tilt
hängt von den angegebenen Abgleichsparametern 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
Feld „Distanz“
Das Feld distance
beschreibt den Abstand zwischen dem Tool und der Oberfläche des Touchgeräts. Ein Wert von 0,0 bedeutet direkten Kontakt, größere Werte weisen auf einen zunehmenden Abstand zur Oberfläche hin.
touch.distance.calibration
Definition:touch.distance.calibration
= none
|
scaled
| default
Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Entfernung zu melden.
-
Wenn der Wert
none
ist, ist die Entfernung unbekannt und wird auf 0 gesetzt. -
Wenn der Wert
scaled
ist, wird die gemeldete Distanz mit einem konstanten Skalierungsfaktor multipliziert. -
Wenn der Wert
default
ist, verwendet das System diescaled
-Abstimmung, sofern die Distanzachse verfügbar ist. Andernfalls wirdnone
verwendet.
touch.distance.scale
Definition:touch.distance.scale
= <a non-negative floating point number>
Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 1.0
.
Berechnung
Die Berechnung des Felds distance
hängt von den angegebenen Abgleichsparametern 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
Hinweise zur Kompatibilität
Die Konfigurationseigenschaften für Touch-Geräte haben sich in Android 4.0 (Ice Cream Sandwich) erheblich geändert. Alle Konfigurationsdateien für Eingabegeräte für Touchgeräte müssen aktualisiert werden, damit die neuen Konfigurationseigenschaften verwendet werden.
Möglicherweise müssen auch ältere Treiber für Touchgeräte aktualisiert werden.
Dateien für die virtuelle Tastenbelegung
Auf Touch-Geräten können virtuelle Tasten implementiert werden.
Je nach den Funktionen des Touch-Controllers gibt es dafür mehrere Möglichkeiten. Einige Touch-Controller können direkt für die Implementierung von Softkeys konfiguriert werden, indem Firmware-Register festgelegt werden. In anderen Fällen ist es wünschenswert, die Zuordnung von Touch-Koordinaten zu Tastencodes in der Software vorzunehmen.
Wenn virtuelle Tasten in Software implementiert werden, muss der Kernel eine Datei mit der Zuordnung virtueller Tasten namens virtualkeys.<devicename>
als Board-Eigenschaft exportieren. Wenn die Touchscreen-Gerätetreiber beispielsweise den Namen „touchyfeely“ melden, muss die Datei mit der virtuellen Tastenzuordnung den Pfad /sys/board_properties/virtualkeys.touchyfeely
haben.
Eine Datei mit der virtuellen Tastenzuordnung beschreibt die Koordinaten und Linux-Tastencodes der virtuellen Tasten auf dem Touchscreen.
Zusätzlich zur Datei mit der virtuellen Tastenzuordnung muss es eine entsprechende Datei mit dem Tastaturlayout und eine Datei mit der Tastenzeichenzuordnung geben, um die Linux-Tastencodes den Android-Tastencodes zuzuordnen und den Typ des Tastaturgeräts anzugeben (normalerweise SPECIAL_FUNCTION
).
Syntax
Eine Datei mit einer virtuellen Tastaturbelegung ist eine Nur-Text-Datei, die aus einer Reihe von Beschreibungen der virtuellen Tastaturbelegung besteht, die entweder durch Zeilenumbrüche oder durch Doppelpunkte getrennt sind.
Kommentarzeilen beginnen mit „#“ und werden bis zum Ende der Zeile fortgesetzt.
Jeder virtuelle Schlüssel wird durch sechs durch Doppelpunkte getrennte Komponenten beschrieben:
0x01
: Ein Versionscode. Muss immer0x01
sein.- <Linux key code>: Der Linux-Tastencode der virtuellen Taste.
- <centerX>: Die X-Pixelkoordinate des Mittelpunkts der virtuellen Taste.
- <centerY>: Die Y-Pixelkoordinate des Mittelpunkts der virtuellen Taste.
- <width>: Die Breite der virtuellen Taste in Pixeln.
- <height>: Die Höhe der virtuellen Taste in Pixeln.
Alle Koordinaten und Größen werden im Koordinatensystem des Displays angegeben.
Hier sehen Sie eine virtuelle Tastenzuordnungsdatei, die in einer einzigen Zeile geschrieben ist.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Dieselbe Datei mit der virtuellen Tastenzuordnung kann auch in mehreren Zeilen geschrieben werden.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Im obigen Beispiel hat der Touchscreen eine Auflösung von 480 × 800. Dementsprechend haben alle virtuellen Tasten eine <centerY>-Koordinate von 835, die etwas unterhalb des sichtbaren Bereichs des Touchscreens liegt.
Die erste Taste hat den Linux-Scancode 158
(KEY_BACK
), centerX von 55
, centerY von 835
, eine Breite von 90
und eine Höhe von 55
.
Beispiel
Datei mit virtueller Tastenzuordnung: /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
Datei mit Tastaturbelegung: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Datei mit der Zuordnung von Tastenzeichen: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirekte Multitouch-Zeigergesten
Im Zeigermodus interpretiert das System die folgenden Gesten:
- Einmal mit einem Finger tippen: Klicken.
- Bewegung mit einem Finger: Mauszeiger bewegen.
- Bewegung mit einem Finger plus Tastendrücke: Ziehen Sie den Mauszeiger.
- Bewegung mit zwei Fingern, wobei sich beide Finger in dieselbe Richtung bewegen: Ziehen Sie den Bereich unter dem Mauszeiger in diese Richtung. Der Zeiger selbst bewegt sich nicht.
- Bewegung mit zwei Fingern, bei der sich beide Finger aufeinander zu oder voneinander weg in unterschiedlichen Richtungen bewegen: Schwenken/Skalieren/Drehen des Bereichs um den Mauszeiger. Der Zeiger selbst bewegt sich nicht.
- Bewegung mit mehreren Fingern: Freiform-Geste.
Handballenerkennung
Ab Android 13 kann das System Eingaben von Handflächen automatisch ablehnen, wenn das integrierte Framework aktiviert ist. Eigene, benutzerdefinierte Lösungen werden weiterhin unterstützt, müssen aber möglicherweise so angepasst werden, dass das Flag TOOL_TYPE_PALM
zurückgegeben wird, wenn eine Handfläche erkannt wird. Das integrierte Framework funktioniert auch in Verbindung mit benutzerdefinierten Lösungen.
Das tatsächliche Modell berücksichtigt die ersten 90 ms der Gestendaten, den aktuellen und die umgebenden Pointer sowie den Abstand der Berührungen zum Displayrand.
Anschließend wird für jeden Zeiger ermittelt, ob es sich um eine Handfläche handelt. Dabei wird auch die Größe der einzelnen Kontakte berücksichtigt, wie von touchMajor
und touchMinor
angegeben. Das Android-Framework entfernt dann die Zeiger, die im Touchstream als Handflächen markiert sind.
Wenn bereits ein Zeiger an die Apps gesendet wurde, gilt für das System Folgendes:
- (Wenn es andere aktive Zeiger gibt) Bricht den Zeiger mit
ACTION_POINTER_UP
undFLAG_CANCELED
ab. - (Wenn dies der einzige Zeiger ist) Bricht den Zeiger mit
ACTION_CANCEL
ab.
Eine öffentliche API, MotionEvent.FLAG_CANCELED
, gibt an, dass das aktuelle Ereignis keine Nutzeraktion auslösen sollte. Dieses Flag ist sowohl für ACTION_CANCEL
als auch für ACTION_POINTER_UP
festgelegt.
Wenn der Handflächenzeiger nicht an Apps gesendet wurde, wird er vom System einfach verworfen.
Handflächenabweisung aktivieren
- Verwenden Sie im Touch-Treiber das
input_abs_set_res
-Makro, um die Auflösungen für die folgenden Felder festzulegen (Einheiten sind Pixel pro Millimeter):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
Die Unterstützung von
ABS_MT_TOUCH_MINOR
ist optional. Wenn dein Gerät die Funktion jedoch unterstützt, musst du die Auflösung richtig einstellen. - Führen Sie Folgendes aus, um zu prüfen, ob die Felder richtig festgelegt sind:
$ adb shell getevent -li
- So aktivieren Sie das Feature während der Laufzeit:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Starte den
system_server
-Vorgang neu.$ adb shell stop && adb shell start
- Prüfe, ob
adb shell dumpsys input
anzeigt, dass sich inUnwantedInteractionBlocker
Handflächenabweiser befinden. Wenn nicht, suchen Sie in den eingabebezogenen Logs nach Hinweisen darauf, was möglicherweise falsch konfiguriert ist.Hier ein Beispiel:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Wenn Sie die Funktion dauerhaft aktivieren möchten, fügen Sie den entsprechenden sysprop-Befehl in die Datei
init**rc
ein:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1