Android unterstützt eine Vielzahl von Touchscreens und Touchpads, einschließlich Stift-basierter Eingabetablets.
Touchscreens sind Touchgeräte, die mit einem Display verbunden sind, sodass der Nutzer den Eindruck hat, Elemente auf dem Bildschirm direkt zu bedienen.
Touchpads sind Touch-Geräte, die nicht mit einem Display verbunden sind, z. B. ein Eingabestift-Tablet. Touchpads werden in der Regel zum Bewegen des Mauszeigers oder zur absoluten indirekten Positionierung oder gestenbasierten Steuerung einer Benutzeroberfläche verwendet.
Touchbedienungen können Tasten haben, deren Funktionen denen von Maustasten ähneln.
Berührungssensoren können abhängig von der zugrunde liegenden Berührungssensortechnologie manchmal mit einer Vielzahl verschiedener Tools wie Finger oder Eingabestift bedient werden.
Touchbildschirme werden manchmal zur Implementierung virtueller Tasten verwendet. Bei einigen Android-Geräten erstreckt sich der Touchscreen-Sensorbereich beispielsweise über den Rand des Displays hinaus und dient zwei Zwecken als Teil einer berührungsempfindlichen Tastatur.
Aufgrund der großen Vielfalt an Touchgeräten verwendet Android eine große Anzahl von Konfigurationseigenschaften, um die Eigenschaften und das gewünschte Verhalten jedes Geräts zu beschreiben.
Klassifizierung von Touchgeräten
Ein Eingabegerät wird als Multitouch-Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:
- Das Eingabegerät meldet die Anwesenheit der absoluten Achsen
ABS_MT_POSITION_X
undABS_MT_POSITION_Y
. - Das Eingabegerät hat keine Gamepad-Tasten. Mit dieser Bedingung wird eine Unklarheit bei bestimmten Gamepads behoben, die Achsen mit Codes melden, die sich mit denen der MT-Achsen überschneiden.
Ein Eingabegerät wird als Ein-Finger-Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:
- Das Eingabegerät wird nicht als Multitouch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Gerät mit Ein- oder als Gerät mit Mehrfachberührung klassifiziert, niemals als beides.
- Das Eingabegerät meldet das Vorhandensein der absoluten Achsen
ABS_X
undABS_Y
sowie das Vorhandensein des SchlüsselcodesBTN_TOUCH
.
Wenn ein Eingabegerät als Touchgerät klassifiziert wird, wird die Anwesenheit virtueller Tasten ermittelt, indem versucht wird, die Datei mit der virtuellen Tastenzuordnung für das Gerät zu laden. Wenn eine virtuelle Tastenbelegung verfügbar ist, wird auch die Schlüssellayoutdatei für das Gerät geladen. Informationen zum Speicherort und Format dieser Dateien finden Sie unter [Dateien mit virtuellen Schlüsselkarten](#virtual-key-map-files).
Als Nächstes lädt das System die Konfigurationsdatei für das Eingabegerät für das Touch-Gerät.
Alle integrierten Touchbedienungen sollten Konfigurationsdateien für Eingabegeräte haben. Wenn keine Konfigurationsdatei für das Eingabegerät vorhanden ist, wählt das System eine Standardkonfiguration aus, die für Touch-Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder Touchpads geeignet ist. Diese Standardeinstellungen sind nicht für integrierte Touchscreens vorgesehen und können zu Fehlfunktionen führen.
Nachdem die Konfiguration des Eingabegeräts geladen wurde, klassifiziert das System das Eingabegerät als Touchscreen, Touchpad oder Maus.
- Ein Touchscreen wird zur direkten Manipulation von Objekten auf dem Bildschirm verwendet. Der Nutzer berührt den Bildschirm direkt, sodass das System keine zusätzlichen Angebote benötigt, um anzuzeigen, welche Objekte manipuliert werden.
- Ein Touchpad liefert einer App Informationen zur absoluten Position von Berührungen in einem bestimmten Sensorbereich. Sie kann für Tablet-Zeichner nützlich sein.
- Ein Zeiger wird zur indirekten Manipulation von Objekten auf dem Bildschirm mithilfe eines Cursors verwendet. Finger werden als Multi-Touch-Gesten interpretiert. Andere Tools wie Eingabestifte werden anhand von absoluten Positionen interpretiert. Weitere Informationen finden Sie unter Indirekte Multitouch-Gesten.
Anhand der folgenden Regeln wird das Eingabegerät als Touchscreen, Touchpad oder Zeigegerät klassifiziert.
- Wenn die Property
touch.deviceType
festgelegt ist, wird der Gerätetyp wie angegeben festgelegt. - Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft
INPUT_PROP_DIRECT
über das ioctlEVIOCGPROP
meldet, wird der Gerätetyp auf Touchscreen festgelegt. Bei dieser Bedingung wird davon ausgegangen, dass Geräte mit direkter Eingabe per Touchscreen an ein Display angeschlossen sind, das ebenfalls verbunden ist. - Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft
INPUT_PROP_POINTER
(über das ioctlEVIOCGPROP
) meldet, wird der Gerätetyp auf Zeiger festgelegt. - Wenn das Eingabegerät die relativen Achsen
REL_X
oderREL_Y
meldet, wird der Gerätetyp auf Touchpad festgelegt. Mit dieser Bedingung wird eine Unklarheit bei Eingabegeräten behoben, die sowohl aus einer Maus als auch aus einem Touchpad bestehen. In diesem Fall wird der Touchpad nicht zum Bewegen des Mauszeigers verwendet, da dies bereits über die Maus geschieht. - Andernfalls wird der Gerätetyp auf Maus gesetzt. Diese Standardeinstellung sorgt dafür, dass Touchpads, die nicht für einen anderen speziellen Zweck bestimmt sind, den Cursor steuern.
Tasten
Schaltflächen sind optionale Steuerelemente, mit denen Apps zusätzliche Funktionen ausführen können. Tasten auf Touchgeräten verhalten sich ähnlich wie Maustasten und werden hauptsächlich mit Touchgeräten vom Typ Zeiger oder mit einem Eingabestift verwendet.
Die folgenden Schaltflächen werden unterstützt:
BTN_LEFT
: Zugeordnet zuMotionEvent.BUTTON_PRIMARY
.BTN_RIGHT
: Zugewiesen zuMotionEvent.BUTTON_SECONDARY
.BTN_MIDDLE
: Zugewiesen zuMotionEvent.BUTTON_MIDDLE
.BTN_BACK
undBTN_SIDE
: zugeordnet zuMotionEvent.BUTTON_BACK
. Durch Drücken dieser Taste wird auch eine Tastenaktivierung mit dem TastencodeKeyEvent.KEYCODE_BACK
simuliert.BTN_FORWARD
undBTN_EXTRA
: zugeordnet zuMotionEvent.BUTTON_FORWARD
. Durch Drücken dieser Taste wird auch eine Tastenbetätigung mit dem TastencodeKeyEvent.KEYCODE_FORWARD
simuliert.BTN_STYLUS
: Zugewiesen zuMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: Zugewiesen zuMotionEvent.BUTTON_TERTIARY
.
Tools und Tooltypen
Ein Tool ist ein Finger, ein Eingabestift oder ein anderes Gerät, das zur Interaktion mit dem Touchgerät verwendet wird. Einige Touch-Geräte können zwischen verschiedenen Tooltypen unterscheiden.
In anderen Android-Kontexten, wie in der MotionEvent
API, wird ein Tool oft als Zeiger bezeichnet.
Die folgenden Tooltypen werden unterstützt:
BTN_TOOL_FINGER
undMT_TOOL_FINGER
: zugeordnet zuMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
undMT_TOOL_PEN
: Zugewiesen zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: Zugewiesen zuMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: Zugewiesen zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: Zugewiesen zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: Zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: Zugewiesen zuMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: Zugeordnet zuMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
undBTN_TOOL_QUADTAP
: WirdMotionEvent.TOOL_TYPE_FINGER
zugeordnet.
Tools für Mausbewegungen und Berührungen
Die Tools können entweder das Touchgerät berühren oder sich in Reichweite befinden und darüber schweben. Nicht alle Touchbildschirme können erkennen, wenn ein Tool über dem Touchbildschirm schwebt. Geräte, die dies tun, z. B. RF-basierte Eingabestift-Digitizer, können oft erkennen, wenn sich das Tool in einem begrenzten Bereich des Digitizers befindet.
Die InputReader
-Komponente unterscheidet zwischen Touch-Tools und Tools, die den Mauszeiger darauf bewegen. Ebenso werden berührungs- und schwebende Tools auf unterschiedliche Weise an Apps gemeldet.
Tools zum Tippen 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 mit MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
und MotionEvent.ACTION_HOVER_EXIT
gemeldet.
Treiberanforderungen für Touch-Geräte
- Touch-Gerätetreiber sollten nur die Achsen und Tastencodes für die unterstützten Achsen und Tasten registrieren. Wenn Sie nicht unterstützte Achsen oder Tastencodes registrieren, kann das den Algorithmus zur Geräteklassifizierung verwirren oder dazu führen, dass das System die Funktionen des Geräts falsch erkennt. Wenn das Gerät beispielsweise den Tastencode
BTN_TOUCH
meldet, geht das System davon aus, dassBTN_TOUCH
immer verwendet wird, um anzugeben, ob das Tool den Bildschirm berührt. Daher sollteBTN_TOUCH
nicht verwendet werden, um anzugeben, dass sich das Tool nur im Bereich befindet und schwebt. - Single-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
ABS_X
: (ERFORDERLICH) Die X-Koordinate des Tools.ABS_Y
: (ERFORDERLICH) Die Y-Koordinate des Tools.ABS_PRESSURE
: Optional: Gibt den physischen Druck an, der auf die Spitze des Tools ausgeübt wird, oder die Signalstärke des Touchkontakts.ABS_TOOL_WIDTH
: Optional: Gibt den Querschnitt oder die Breite des Touchkontakts oder des Tools selbst an.ABS_DISTANCE
: Optional. Gibt den Abstand des Tools von der Oberfläche des Touch-Geräts an.ABS_TILT_X
: Optional: Gibt die Neigung des Tools von der Oberfläche des Touch-Geräts entlang der X-Achse an.ABS_TILT_Y
: Optional: Gibt die Neigung des Tools von der Oberfläche des Touch-Geräts entlang der Y-Achse an.BTN_TOUCH
: (ERFORDERLICH) Gibt an, ob das Tool das Gerät berührt.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (optional) Schaltfläche für Berichte .BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (optional) Gibt den Tool-Typ an.
- Auf Multitouch-Geräten werden die folgenden Linux-Eingabeereignisse verwendet:
ABS_MT_POSITION_X
: (ERFORDERLICH) Die X-Koordinate des Tools.ABS_MT_POSITION_Y
: (ERFORDERLICH) Die Y-Koordinate des Tools.ABS_MT_PRESSURE
: (optional) Gibt den physischen Druck, der auf die Spitze des Werkzeugs ausgeübt wird, oder die Signalstärke des Berührungskontakts an.ABS_MT_TOUCH_MAJOR
: Optional. Gibt den Querschnitt des Touchkontakts oder die Länge der längeren Dimension des Touchkontakts an.ABS_MT_TOUCH_MINOR
: Optional: Gibt die Länge der kürzeren Dimension des Touchkontakts an. Diese Achse sollte nicht verwendet werden, wennABS_MT_TOUCH_MAJOR
eine Flächenmessung enthält.ABS_MT_WIDTH_MAJOR
: (optional) gibt den Querschnittsbereich des Tools selbst oder die Länge der längeren Dimension des Tools an. Verwenden Sie diese Achse nur, wenn Sie die Abmessungen des Tools kennen.ABS_MT_WIDTH_MINOR
: Optional: Gibt die Länge der kürzeren Dimension des Tools an. Diese Achse sollte nicht verwendet werden, wennABS_MT_WIDTH_MAJOR
eine Flächenmessung anzeigt oder die Abmessungen des Tools selbst nicht bekannt sind.ABS_MT_ORIENTATION
: Optional. Gibt die Ausrichtung des Tools an.ABS_MT_DISTANCE
: Optional. Gibt den Abstand des Tools zur Oberfläche des Touch-Geräts an.ABS_MT_TOOL_TYPE
: Optional. Gibt den Tooltyp alsMT_TOOL_FINGER
oderMT_TOOL_PEN
an.ABS_MT_TRACKING_ID
: Optional: Die Tracking-ID des Tools. Die Tracking-ID ist eine beliebige nicht negative Ganzzahl, mit der jedes Tool unabhängig voneinander identifiziert und erfasst wird, wenn mehrere Tools aktiv sind. Wenn beispielsweise mehrere Finger das Gerät berühren, sollte jedem Finger eine eindeutige Tracking-ID zugewiesen werden, die verwendet wird, solange der Finger in Kontakt bleibt. Tracking-IDs können wiederverwendet werden, wenn sich die zugehörigen Tools außerhalb der Reichweite befinden.ABS_MT_SLOT
: (optional) Gibt die Slot-ID des Tools an, wenn das Linux-Multi-Touch-Protokoll „B“ verwendet wird. Weitere Informationen 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) Status der Schaltfläche „Berichte“.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (optional) Gibt den Tool-Typ an.
- Wenn sowohl Achsen für das Single-Touch- als auch für das Multi-Touch-Protokoll definiert sind, werden nur die Multi-Touch-Achsen verwendet und die Single-Touch-Achsen ignoriert.
Die Mindest- und Höchstwerte der Achsen
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
undABS_MT_POSITION_Y
definieren die Grenzen des aktiven Bereichs des Geräts in gerätespezifischen Flächeneinheiten. Bei einem Touchscreen bezeichnet der aktive Bereich den Teil des Touchgeräts, der tatsächlich das Display bedeckt.Bei einem Touchscreen interpoliert das System automatisch die gemeldeten Touch-Positionen in Oberflächeneinheiten, um Touch-Positionen in Displaypixeln gemäß der folgenden Berechnung zu erhalten:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ein Touchscreen meldet möglicherweise Berührungen außerhalb des gemeldeten aktiven Bereichs.
Berührungen, die außerhalb des aktiven Bereichs gestartet werden, werden nicht an Apps gesendet, können aber für virtuelle Tasten verwendet werden.
Berührungen, die innerhalb des aktiven Bereichs gestartet werden oder den Displaybereich betreten und verlassen, werden an Apps gesendet. Wenn eine Berührung innerhalb der Grenzen einer App beginnt und sich dann aus dem aktiven Bereich hinausbewegt, empfängt die App möglicherweise Touch-Ereignisse mit Anzeigekoordinaten, die negativ oder jenseits der Displaygrenzen sind. Das ist ganz normal.
Ein Touch-Gerät sollte niemals Touch-Koordinaten an die Grenzen des aktiven Bereichs binden. Wenn ein Touch den aktiven Bereich verlässt, sollte er als außerhalb des aktiven Bereichs gemeldet werden oder gar nicht gemeldet werden.
Wenn sich der Finger des Nutzers beispielsweise in der Nähe der oberen linken Ecke des Touchscreens befindet, wird möglicherweise die Koordinate (minX, minY) gemeldet. 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 Touch-Eingabe sollte vollständig beendet werden. Mit anderen Worten: Der Touchscreen sollte (minX, minY) nicht melden, wenn sich der Finger des Nutzers tatsächlich außerhalb des aktiven Bereichs befindet.
Wenn Touch-Koordinaten am Displayrand begrenzt werden, entsteht eine künstliche harte Grenze um den Displayrand herum, die verhindert, dass das System Bewegungen flüssig verfolgen kann, die den Displaybereich betreten oder verlassen.
Die von
ABS_PRESSURE
oderABS_MT_PRESSURE
gemeldeten Werte, sofern sie überhaupt gemeldet werden, müssen nicht null sein, wenn das Tool das Gerät berührt, und andernfalls null, um anzuzeigen, dass sich das Tool in der Position befindet.Das Melden von Druckinformationen ist optional, wird aber dringend empfohlen. Apps können Druckinformationen verwenden, um druckempfindliche Zeichnungen 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 nicht null sein, wenn das Tool das Gerät berührt, andernfalls Null. Dies ist jedoch nicht erforderlich. Das Touchgerät kann beispielsweise die Größe von Fingerkontakten messen, aber nicht von Eingabestiftkontakten.Informationen zur Größe von Berichten sind optional, werden aber dringend empfohlen. Apps können Druckinformationen nutzen, 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 in direktem Kontakt ist. Die genauen gemeldeten Werte hängen davon ab, wie die Hardware die Entfernung misst.Die Angabe von Informationen zur Entfernung ist optional, wird aber für Geräte mit Eingabestift empfohlen.
Die von
ABS_TILT_X
undABS_TILT_Y
gemeldeten Werte sollten null sein, wenn das Tool senkrecht zum Gerät gehalten wird. Ein Wert ungleich Null gibt an, dass das Tool geneigt gehalten wird.Die Neigungswinkel entlang der X- und Y-Achsen werden in Grad von der Senkrechten aus angegeben. Der Mittelpunkt (völlig senkrecht) wird für jede Achse durch
(max + min) / 2
angegeben. Werte unter dem Mittelpunkt stehen für eine Neigung nach oben oder links, Werte über dem Mittelpunkt für eine Neigung nach unten oder rechts.InputReader
wandelt die Neigungskomponenten X und Y in einen senkrechten Neigungswinkel von 0 bisPI / 2
Radianten und einen ebenen Orientierungswinkel von-PI
bisPI
Radianten um. Diese Darstellung führt zu einer Beschreibung der Ausrichtung, die mit der Beschreibung von Fingerberührungen kompatibel ist.Das Melden von Informationen zur Neigung ist optional, wird aber für Geräte mit Eingabestift empfohlen.
Wenn der Tooltyp von
ABS_MT_TOOL_TYPE
gemeldet wird, ersetzt er alle Informationen zum Tooltyp, die vonBTN_TOOL_*
gemeldet wurden. Wenn keine Informationen zum Werkzeugtyp verfügbar sind, wird standardmäßigMotionEvent.TOOL_TYPE_FINGER
verwendet.Ein Tool wird basierend auf den folgenden Bedingungen als aktiv bestimmt:
Bei Verwendung des Protokolls für die einmalige Berührung ist das Tool aktiv, wenn
BTN_TOUCH
oderBTN_TOOL_*
den Wert 1 hat.Diese Bedingung impliziert, dass
InputReader
zumindest einige Informationen über die Art des Tools haben muss, entweder über den Touchscreen oder zumindest über seinen Tooltyp. Wenn keine Informationen verfügbar sind, wird davon ausgegangen, dass das Tool inaktiv ist (außerhalb des Bereichs).- Bei Verwendung des Multitouch-Protokolls „A“ ist das Tool aktiv, wenn es im letzten Synchronisierungsbericht aufgeführt ist. Wenn das Tool nicht mehr in den Synchronisierungsberichten angezeigt wird, ist es nicht mehr verfügbar.
- Wenn Sie das Multi-Touch-Protokoll „B“ verwenden, ist das Tool aktiv, solange es einen aktiven Slot hat. Wenn der Slot gelöscht wird, existiert das Tool nicht mehr.
- Ein Tool wird anhand der folgenden Bedingungen als schwebend erkannt:
- Wenn das Tool
BTN_TOOL_MOUSE
oderBTN_TOOL_LENS
ist, wird es nicht schweben, auch wenn eine der folgenden Bedingungen erfüllt ist. - Wenn das Tool aktiv ist, der Treiber 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, schwebt das Tool.
- Wenn das Tool
InputReader
unterstützt sowohl das Multitouch-Protokoll „A“ als auch „B“. Neue Treiber sollten das „B“-Protokoll verwenden, aber beide funktionieren.Ab Android 4.0 müssen die Touchscreen-Treiber möglicherweise geändert werden, um der Linux-Eingabeprotokollspezifikation zu entsprechen.
Möglicherweise sind folgende Änderungen erforderlich:
Wenn ein Tool inaktiv wird (Finger wird „hoch“ bewegt), sollte es in nachfolgenden Multitouch-Synchronisierungsberichten nicht mehr angezeigt werden. Wenn alle Tools inaktiv sind (alle Finger werden „hoch“ gehalten), sollte der Fahrer ein leeres Protokollpaket senden, z. B.
SYN_MT_REPORT
gefolgt vonSYN_REPORT
.In früheren Android-Versionen wurden „Hoch“-Ereignisse durch Senden eines Druckwerts von 0 gemeldet. Das alte Verhalten war nicht mit der Linux-Eingabeprotokollspezifikation kompatibel und wird nicht mehr unterstützt.
Informationen zum physischen Druck oder zur Signalstärke sollten mit
ABS_MT_PRESSURE
erfasst werden.In früheren Android-Versionen wurden Druckinformationen von
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.
Betrieb mit Touch-Gerät
Im Folgenden finden Sie eine kurze Zusammenfassung der Bedienung von Touchbedienungsgeräten unter Android.
EventHub
liest Rohereignisse aus demevdev
-Treiber.InputReader
verbraucht die Rohereignisse und aktualisiert den internen Status hinsichtlich der Position und anderer Merkmale der einzelnen Tools. Außerdem werden die Schaltflächenstatus erfasst.- Wenn ZURÜCK oder VORAUS gedrückt oder losgelassen wurde, benachrichtigt
InputReader
InputDispatcher
über das Schlüsselereignis. InputReader
bestimmt, ob ein virtueller Tastendruck erfolgt ist. Ist das der Fall, wirdInputDispatcher
über das Schlüsselereignis benachrichtigt.- Mit
InputReader
wird ermittelt, ob die Berührung innerhalb der Grenzen des Displays gestartet wurde. In diesem Fall benachrichtigt erInputDispatcher
über das Touch-Ereignis. - Wenn es keine Touch-Tools gibt, aber mindestens ein Hover-Tool, benachrichtigt
InputReader
InputDispatcher
über das Hover-Ereignis. - Wenn das Touchgerät vom Typ Zeiger ist, führt
InputReader
eine Zeigergestenerkennung durch, bewegt den Zeiger entsprechend und benachrichtigtInputDispatcher
über das Zeigerereignis. InputDispatcher
verwendetWindowManagerPolicy
, um zu bestimmen, ob die Ereignisse gesendet und das Gerät dadurch geweckt werden sollen. Anschließend sendetInputDispatcher
die Ereignisse an die entsprechenden Apps.
Konfiguration von Touchgeräten
Das Verhalten von Touchbedienungen wird durch die Achsen, Tasten, Eingabeeigenschaften, die Konfiguration des Eingabegeräts, die virtuelle Tastenzuordnung und das Tastenlayout des Geräts bestimmt.
Weitere Informationen zu den Dateien, die an der Tastaturkonfiguration beteiligt sind, finden Sie in den folgenden Abschnitten:
Properties
Das System verwendet viele Konfigurationseigenschaften für Eingabegeräte, um das Verhalten von Touchgeräten zu konfigurieren und zu kalibrieren.
Ein Grund dafür ist, dass die Gerätetreiber für Touch-Geräte häufig die Merkmale von Berührungen mit gerätespezifischen Einheiten melden.
Viele Touchbedienungen messen beispielsweise die Berührungsfläche mithilfe einer internen gerätespezifischen Skala, z. B. der Gesamtzahl der Sensorknoten, die durch die Berührung ausgelöst wurden. Dieser Rohgrößenwert wäre für Apps nicht sinnvoll, da sie die physische Größe und andere Merkmale der Sensorknoten des Touch-Geräts kennen müssten.
Das System verwendet Kalibrierungsparameter, die in Konfigurationsdateien des Eingabegeräts codiert sind, um die vom Touchgerät gemeldeten Werte in eine einfachere Standarddarstellung zu decodieren, zu transformieren und zu normalisieren, die von Apps verstanden werden kann.
Konventionen für die Dokumentation
In der Dokumentation werden die vom System während der Kalibrierung verwendeten Werte mit den folgenden Konventionen beschrieben.
Rohe Achsenwerte
Die folgenden Ausdrücke geben die Rohwerte an, die vom Touch-Gerätetreiber 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 Achse
ABS_PRESSURE
oderABS_MT_PRESSURE
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 Achse
ABS_TOOL_WIDTH
oderABS_MT_WIDTH_MAJOR
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 Achse
ABS_DISTANCE
oderABS_MT_DISTANCE
oder 0, falls nicht verfügbar. raw.tiltX
- Der Wert der
ABS_TILT_X
-Achse oder 0, falls nicht verfügbar. raw.tiltY
- Der Wert der
ABS_TILT_Y
-Achse oder 0, falls nicht verfügbar.
Bereiche der Rohachse
Die folgenden Ausdrücke geben die Grenzen der Rohwerte an. Sie werden durch Aufrufen von EVIOCGABS
ioctl für jede Achse abgerufen.
raw.*.min
- Der inklusive Mindestwert der Rohachse.
raw.*.max
- Der maximale Wert der Rohachse (einschließlich).
raw.*.range
- Entspricht
raw.*.max - raw.*.min
. raw.*.fuzz
- Die Genauigkeit der Rohachse. Wenn „fuzz“ beispielsweise den Wert „1“ hat, sind die Werte auf +/- 1 Einheit genau.
raw.width
- Die Breite des Touchbereichs einschließlich Rahmen, entspricht
raw.x.range + 1
. raw.height
- Die einschließlich der Höhe des Touchbereichs, entspricht
raw.y.range + 1
.
Ausgabebereiche
Die folgenden Ausdrücke geben die Merkmale des Ausgabekoordinatensystems an. Das System verwendet die lineare Interpolation, um Informationen zur Touch-Position von den vom Touchgerät verwendeten Oberflächeneinheiten in die Ausgabeeinheiten umzuwandeln, die an Apps wie Displaypixel gesendet werden.
output.width
- Die Ausgabebreite. Bei Touchscreens (die mit einem Display verknüpft sind) ist dies die Displaybreite in Pixeln. Bei Touchpads (nicht mit einem Display verknüpft) entspricht die Ausgabebreite
raw.width
, was bedeutet, dass keine Interpolation erfolgt. output.height
- Die Ausgabehöhe. Bei Touchscreens (die mit einem Display verknüpft sind) ist dies die Displayhöhe in Pixeln. Bei Touchpads, die keinem Display zugeordnet sind, entspricht die Ausgabehöhe
raw.height
. Dies bedeutet, dass keine Interpolation durchgeführt wird. output.diag
- Die Diagonallänge des Ausgabekoordinatensystems, entspricht
sqrt(output.width ^2 + output.height ^2)
.
Grundlegende Konfiguration
Der Mapper zur Eingabe von Berührungen verwendet viele Konfigurationseigenschaften in der Konfigurationsdatei des Eingabegeräts, um Kalibrierungswerte anzugeben. In der folgenden Tabelle werden einige allgemeine Konfigurationseigenschaften beschrieben. Alle anderen Eigenschaften werden in den folgenden Abschnitten zusammen mit den Feldern beschrieben, mit denen sie kalibriert werden.
touch.deviceType
Definition: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
Gibt den Touch-Gerätetyp an.
-
Wenn der Wert
touchScreen
ist, ist das Touchgerät ein Touchscreen, der mit einem Display verbunden ist. -
Wenn der Wert
touchPad
ist, handelt es sich beim Touchgerät um ein Touchpad, das nicht mit einem Display verknüpft ist. -
Wenn der Wert
pointer
ist, handelt es sich beim Touchgerät um ein Touchpad, das nicht mit einem Display verknüpft ist. Die Bewegungen werden für indirekte Multi-Touch-Mauszeigergesten verwendet. -
Wenn der Wert
default
ist, erkennt das System den Gerätetyp automatisch anhand des Klassifizierungsalgorithmus.
Weitere Informationen dazu, wie sich der Gerätetyp auf das Verhalten des Touch-Geräts auswirkt, finden Sie im Abschnitt Klassifizierung.
Unter Android 3 und niedriger wurden alle Touch-Geräte als Touchscreens angenommen.
touch.orientationAware
Definition: touch.orientationAware
= 0
| 1
Gibt an, ob das Touchgerät auf Änderungen der Displayausrichtung reagieren soll.
-
Wenn der Wert
1
ist, werden die vom Touchgerät gemeldeten Touch-Positionen gedreht, wenn sich die Displayausrichtung ändert. -
Wenn der Wert
0
ist, sind die vom Touchgerät gemeldeten Touch-Positionen unabhängig von Änderungen der Displayausrichtung.
Der Standardwert ist 1
, wenn es sich um ein Gerät mit Touchscreen handelt, andernfalls 0
.
Das System unterscheidet zwischen internen und externen Touchscreens und Displays. Ein richtungsabhängiger interner Touchscreen wird entsprechend der Ausrichtung des internen Displays gedreht. Ein richtungsabhängiger externer Touchscreen wird entsprechend der Ausrichtung des externen Displays gedreht.
Die Ausrichtung wird verwendet, um die Drehung von Touchscreens auf Geräten wie dem Nexus One zu unterstützen. Wenn das Gerät beispielsweise um 90 Grad im Uhrzeigersinn von seiner natürlichen Ausrichtung gedreht wird, werden die absoluten Positionen von Berührungen neu zugeordnet, sodass eine Berührung in der linken oberen Ecke des absoluten Koordinatensystems des Touchscreens als Berührung in der linken oberen Ecke des gedrehten Koordinatensystems des Displays gemeldet wird. Dadurch werden Berührungen mit demselben Koordinatensystem erfasst, das Apps zum Zeichnen ihrer visuellen Elemente verwenden.
Vor Honeycomb wurde angenommen, dass alle Touchgeräte die Ausrichtung berücksichtigen.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
|
default
Gibt den Präsentationsmodus für Zeigefingergesten an. Diese Konfigurationseigenschaft ist nur relevant, wenn das Touchgerät vom Typ Zeiger ist.
-
Wenn der Wert
pointer
ist, werden die Touchpad-Gesten durch einen Cursor dargestellt, der einem Mauszeiger ähnelt. -
Wenn der Wert
spots
ist, werden die Touchpad-Gesten durch einen Anker dargestellt, der den Schwerpunkt der Geste und eine Reihe kreisförmiger Punkte darstellt, die die Position der einzelnen Finger darstellen.
Der Standardwert ist pointer
, wenn die Eingabeeigenschaft INPUT_PROP_SEMI_MT
festgelegt ist, andernfalls spots
.
X- und Y-Felder
Die Felder „X“ und „Y“ enthalten Positionsinformationen für den Mittelpunkt des Kontaktbereichs.
Berechnung
Die Berechnung ist einfach: Die Positionierungsinformationen des Touch-Treibers werden linear in das Ausgabekoordinatensystem interpoliert.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
Felder „touchMajor“, „touchMinor“, „toolMajor“, „toolMinor“ und „size“
Die Felder touchMajor
und touchMinor
beschreiben die ungefähren Abmessungen der Kontaktfläche in Ausgabeeinheiten (Pixeln).
Die Felder toolMajor
und toolMinor
beschreiben die ungefähren Abmessungen des Tools selbst in Ausgabeeinheiten (Pixeln).
Das Feld size
beschreibt die normalisierte Größe des Touch-Ereignisses im Vergleich zum größten möglichen Touch-Ereignis, das das Touch-Gerät erkennen kann. Die kleinstmögliche normalisierte Größe ist 0, 0 (kein Kontakt oder sie ist nicht messbar) und die größtmögliche normalisierte Größe 1,0 (Sensorbereich ist gesättigt).
Wenn sowohl die ungefähre Länge als auch die Breite gemessen werden können, geben Sie im Feld touchMajor
die größere und im Feld touchMinor
die kleinere Dimension des Kontaktbereichs an. Wenn nur der ungefähre Durchmesser der Kontaktfläche gemessen werden kann, sind die Felder touchMajor
und touchMinor
gleich.
Ebenso gibt das Feld toolMajor
die längere Dimension und das Feld toolMinor
die kürzere Dimension der Querschnittsfläche des Tools an.
Wenn die Touch-Größe nicht verfügbar ist, die Tool-Größe aber schon, wird die Tool-Größe auf die Touch-Größe festgelegt. Wenn hingegen die Toolgröße nicht verfügbar ist, aber die Berührungsgröße verfügbar ist, wird die Berührungsgröße der Toolgröße entsprechen.
Auf Touchbildschirmen werden die Größe des Touch-Ereignisses und die Größe des Tools auf unterschiedliche Weise gemessen oder erfasst. Die aktuelle Implementierung unterstützt drei verschiedene Arten von Messungen: Durchmesser, Fläche und geometrische Begrenzungsrahmen in Flächeneinheiten.
Definition: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Touch- und Toolgröße zu melden.
-
Wenn der Wert
none
ist, wird die Größe auf null gesetzt. -
Wenn der Wert
geometric
ist, wird davon ausgegangen, dass die Größe in denselben Flächeneinheiten wie die Position angegeben ist. Sie wird daher auf dieselbe Weise skaliert. -
Wenn der Wert
diameter
ist, wird davon ausgegangen, dass die Größe proportional zum Durchmesser (Breite) des Touch-Elements oder Tools ist. -
Wenn der Wert
area
ist, wird davon ausgegangen, dass die Größe proportional zur Fläche des Touchbildschirms oder Tools ist. -
Wenn der Wert
default
ist, verwendet das System diegeometric
-Kalibrierung, wenn die Achseraw.touchMajor
oderraw.toolMajor
verfügbar ist. Andernfalls wird dienone
-Kalibrierung verwendet.
touch.size.scale
Definition: touch.size.scale
= <eine nicht negative Gleitkommazahl>
Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 1.0
.
touch.size.bias
Definition: touch.size.bias
= <eine nicht negative Gleitkommazahl>
Gibt einen 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 aktiven Kontakte oder für jeden Kontakt einzeln gemeldet wird.
-
Wenn der Wert
1
ist, wird die gemeldete Größe durch die Anzahl der Kontakte vor der Verwendung geteilt. -
Wenn der Wert
0
ist, wird die angegebene Größe unverändert verwendet.
Der Standardwert ist 0
.
Einige Touch-Geräte, insbesondere „Semi-MT“-Geräte, können die einzelnen Abmessungen mehrerer Kontakte nicht unterscheiden. Daher wird eine Größe angegeben, die die Gesamtfläche oder Breite darstellt. Diese Property sollte nur für solche Geräte auf 1
festgelegt werden. Im Zweifelsfall setzen Sie diesen Wert auf 0
.
Berechnung
Die Berechnung der Felder touchMajor
, touchMinor
, toolMajor
, toolMinor
und size
hängt von den angegebenen Kalibrierungsparametern ab.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
Druckfeld
Das Feld pressure
beschreibt den ungefähren physischen Druck, der auf das Touchgerät ausgeübt wird, als normalisierten Wert zwischen 0,0 (kein Touch) und 1,0 (normaler Druck).
Ein Nulldruck bedeutet, dass das Werkzeug schwebt.
touch.pressure.calibration
Definition: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um den Druck zu melden.
-
Wenn der Wert
none
ist, ist der Druck unbekannt. Er wird daher auf 1,0 beim Berühren und auf 0,0 beim Bewegen des Mauszeigers eingestellt. -
Wenn der Wert
physical
ist, wird angenommen, dass die Druckachse die tatsächliche physische Druckstärke misst, die auf das Touchpad ausgeübt wird. -
Wenn der Wert
amplitude
ist, wird davon ausgegangen, dass die Druckachse die Signalamplitude misst, die mit der Größe des Kontakts und dem ausgeübten Druck zusammenhängt. -
Wenn der Wert
default
ist, verwendet das System diephysical
-Kalibrierung, wenn die Druckachse verfügbar ist, andernfallsnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <eine nicht negative Gleitkommazahl>
Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 1.0 / raw.pressure.max
.
Berechnung
Die Berechnung des Felds pressure
hängt von den angegebenen Kalibrierungsparametern ab.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Felder für Ausrichtung und Neigung
Im Feld orientation
wird die Ausrichtung des Touch-Gadgets und des Tools als Winkelmessung beschrieben. Eine Ausrichtung von 0
gibt an, dass die Hauptachse vertikal ausgerichtet ist, -PI/2
, dass sie nach links ausgerichtet ist, und PI/2
, dass sie nach rechts ausgerichtet ist. Wenn ein Eingabestift verwendet wird, kann der Orientierungsbereich als voller Kreis von -PI
oder PI
beschrieben werden.
Im Feld tilt
wird die Neigung des Werkzeugs als Winkelmessung angegeben.
Eine Neigung von 0
gibt an, dass das Tool senkrecht zur Oberfläche ist.
Eine Neigung von PI/2
zeigt an, dass das Werkzeug 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 komprimierter Vektor interpretiert, der aus zwei vorzeichenbehafteten 4‑Bit-Feldern besteht. Diese Darstellung wird für Teile des objektbasierten Atmel-Protokolls verwendet. Nach der Dekodierung liefert der Vektor einen Orientierungswinkel und eine Konfidenzmagnitude. Die Konfidenzstärke wird verwendet, um die Größeninformationen zu skalieren, sofern sie nicht geometrisch sind. - Wenn der Wert
default
ist, verwendet das System dieinterpolated
-Kalibrierung, wenn die Ausrichtungsachse verfügbar ist, andernfallsnone
.
Berechnung
Die Berechnung der Felder orientation
und tilt
hängt von den angegebenen Kalibrierungsparametern und der verfügbaren Eingabe ab.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
Feld „Entfernung“
Das Feld distance
beschreibt den Abstand zwischen dem Tool und der Oberfläche des Touch-Geräts. Ein Wert von 0,0 bedeutet direkten Kontakt und größere Werte einen zunehmenden Abstand von der Oberfläche.
touch.distance.calibration
Definition: touch.distance.calibration
= none
|
scaled
| default
Gibt die Art der Messung an, die vom Touch-Treiber verwendet wird, um die Entfernung zu melden.
-
Wenn der Wert
none
ist, ist die Entfernung unbekannt und wird auf 0 gesetzt. -
Wenn der Wert
scaled
ist, wird die gemeldete Entfernung mit einem konstanten Skalenfaktor multipliziert. -
Wenn der Wert
default
ist, verwendet das System diescaled
-Kalibrierung, wenn die Entfernungsachse verfügbar ist, andernfallsnone
.
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 den angegebenen Kalibrierungsparametern ab.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Verwendungsbeispiele
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Kompatibilitätshinweise
Die Konfigurationseigenschaften für Touch-Geräte haben sich in Android Ice Cream Sandwich 4.0 erheblich geändert. Alle Konfigurationsdateien für Eingabegeräte für Touchgeräte müssen aktualisiert werden, damit die neuen Konfigurationseigenschaften verwendet werden können.
Möglicherweise müssen auch Treiber für ältere Touchgeräte aktualisiert werden.
Dateien mit virtuellen Tastenbelegungen
Auf Touchbildschirmen können virtuelle Tasten implementiert werden.
Abhängig von den Funktionen des Touch-Controllers gibt es mehrere Möglichkeiten, dies zu tun. Einige Touch-Controller können direkt für die Implementierung von Softkeys konfiguriert werden, indem Firmware-Register festgelegt werden. In anderen Fällen ist es wünschenswert, die Zuordnung von Touch-Koordinaten zu Tastencodes in der Software vorzunehmen.
Wenn virtuelle Tasten in der Software implementiert sind, muss der Kernel eine Datei mit einer virtuellen Tastenzuordnung namens virtualkeys.<devicename>
als Board-Eigenschaft exportieren. Wenn die 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 einer virtuellen Tastenkarte beschreibt die Koordinaten und Linux-Tastencodes der virtuellen Tasten auf dem Touchscreen.
Zusätzlich zur Datei mit der virtuellen Tastenzuordnung müssen eine entsprechende Datei mit dem Tastenlayout und eine Datei mit der Tastenbelegung vorhanden sein, um die Linux-Tastencodes den Android-Tastencodes zuzuordnen und den Typ des Tastaturgeräts anzugeben (normalerweise SPECIAL_FUNCTION
).
Syntax
Eine Datei mit einer virtuellen Tastenbelegung ist eine Nur-Text-Datei, die eine Abfolge von Beschreibungen des Layouts virtueller Tasten enthält, die entweder durch neue Zeilen oder durch Doppelpunkte getrennt sind.
Kommentarzeilen beginnen mit „#“ und gehen bis zum Ende der Zeile.
Jeder virtuelle Schlüssel wird durch sechs durch Doppelpunkte getrennte Komponenten beschrieben:
0x01
: Einen Versionscode. Muss immer0x01
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>: Die Höhe der virtuellen Taste in Pixeln.
Alle Koordinaten und Größen werden im Displaykoordinatensystem angegeben.
Hier ist eine virtuelle Keymap-Datei, die alle in einer Zeile geschrieben ist.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Die gleiche Datei mit der virtuellen Tastenzuordnung kann auch auf mehreren Zeilen geschrieben werden.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Im obigen Beispiel hat der Touchscreen eine Auflösung von 480 x 800. Dementsprechend haben alle virtuellen Tasten eine <centerY>-Koordinate von 835, die sich etwas unterhalb des sichtbaren Bereichs des Touchscreens befindet.
Der erste Schlüssel hat den Linux-Scancode 158
(KEY_BACK
), die X-Koordinate des Mittelpunkts 55
, die Y-Koordinate des Mittelpunkts 835
, die Breite 90
und die Höhe 55
.
Verwendungsbeispiele
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
Key Character Map-Datei: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirekte Touch-Gesten für den Multi-Touch-Zeiger
Im Zeigermodus werden die folgenden Touch-Gesten vom System interpretiert:
- Einmal mit einem Finger tippen: Klick.
- Bewegung mit einem Finger: Bewegen Sie den Mauszeiger.
- Bewegung mit einem Finger und Drücken von Tasten: Ziehen Sie den Cursor.
- Bewegung mit zwei Fingern in dieselbe Richtung: Ziehen Sie den Bereich unter dem Zeiger in diese Richtung. Der Cursor selbst bewegt sich nicht.
- Bewegung mit zwei Fingern, die sich aufeinander zu oder in verschiedene Richtungen bewegen: Schwenken/Zoomen/Drehen des Bereichs um den Cursor. Der Cursor selbst bewegt sich nicht.
- Mehrfingerbewegung: Freiform-Touch-Geste.
Ablehnung der Hand
Ab Android 13 kann das System Eingaben von Handflächen automatisch ablehnen, wenn das integrierte Framework aktiviert ist. Eigene Lösungen werden weiterhin unterstützt. Sie müssen jedoch möglicherweise so geändert werden, dass das Flag TOOL_TYPE_PALM
zurückgegeben wird, wenn eine Handfläche erkannt wird. Das integrierte Framework funktioniert auch in Verbindung mit benutzerdefinierten Lösungen.
Das tatsächliche Modell prüft die ersten 90 Millisekunden der Gestendaten, den aktuellen Cursor und die umliegenden Cursor und berücksichtigt dann, wie weit die Berührungen vom Displayrand entfernt sind.
Anschließend wird für jeden Zeiger ermittelt, ob es sich um eine Handfläche handelt. Außerdem wird die Größe der einzelnen Kontakte berücksichtigt, wie von touchMajor
und touchMinor
angegeben. Das Android-Framework entfernt dann die Touch-Cursor, die als Handflächen markiert sind, aus dem Touch-Stream.
Wenn bereits ein Zeiger an die Apps gesendet wurde, hat das System entweder
- (Wenn andere aktive Zeiger vorhanden sind) Der Zeiger mit den festgelegten Werten
ACTION_POINTER_UP
undFLAG_CANCELED
wird abgebrochen. - (Wenn dies der einzige Verweis ist) Der Verweis wird mit
ACTION_CANCEL
abgebrochen.
Eine öffentliche API, MotionEvent.FLAG_CANCELED
, gibt an, dass das aktuelle Ereignis keine Nutzeraktion auslösen sollte. Dieses Flag ist sowohl für ACTION_CANCEL
als auch für ACTION_POINTER_UP
festgelegt.
Wenn der Handballenzeiger nicht an Apps gesendet wurde, lässt das System ihn einfach fallen.
Palm Rejection aktivieren
- Verwenden Sie in Ihrem Touch-Treiber das
input_abs_set_res
-Makro, um die Auflösungen für die folgenden Felder festzulegen (Einheiten: Pixel pro mm):ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
Die Unterstützung von
ABS_MT_TOUCH_MINOR
ist optional. Wenn dein Gerät diese Funktion unterstützt, solltest du jedoch prüfen, ob die Auflösung richtig eingestellt ist. - Führen Sie diesen Befehl aus, um zu prüfen, ob die Felder richtig festgelegt sind:
$ adb shell getevent -li
- Führen Sie folgenden Befehl aus, um die Funktion während der Laufzeit zu aktivieren:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Starte den
system_server
-Prozess neu.$ adb shell stop && adb shell start
- Prüfe, ob
adb shell dumpsys input
inUnwantedInteractionBlocker
anzeigt, dass sich Handflächenablehnungen befinden. Wenn das nicht der Fall ist, prüfen Sie die Eingabe-Logs, um Hinweise auf eine mögliche Fehlkonfiguration zu finden.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: {} - 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