Android unterstützt eine Vielzahl von Touchscreens und Touchpads, einschließlich stiftbasierter Digitalisiertabletts.
Touchscreens sind Touch-Geräte, die mit einem Display verbunden sind, so dass der Benutzer den Eindruck hat, Elemente auf dem Bildschirm direkt zu manipulieren.
Touchpads sind Touch-Geräte, die nicht mit einem Display verbunden sind, z. B. ein Digitalisiertablett. Touchpads werden typischerweise zum Zeigen oder zur absoluten indirekten Positionierung oder gestenbasierten Steuerung einer Benutzeroberfläche verwendet.
Touch-Geräte können über Tasten verfügen, deren Funktionen den Maustasten ähneln.
Touch-Geräte können je nach zugrunde liegender Touch-Sensor-Technologie manchmal mit verschiedenen Werkzeugen wie Fingern oder einem Stift bedient werden.
Touch-Geräte werden manchmal zur Implementierung virtueller Tasten verwendet. Bei manchen Android-Geräten reicht der Sensorbereich des Touchscreens beispielsweise über den Rand des Displays hinaus und erfüllt als Teil einer berührungsempfindlichen Tastatur einen doppelten Zweck.
Aufgrund der großen Vielfalt an Touch-Geräten ist Android auf eine große Anzahl von Konfigurationseigenschaften angewiesen, um die Eigenschaften und das gewünschte Verhalten jedes Geräts zu beschreiben.
Klassifizierung von Touch-Geräten
Ein Eingabegerät wird als Multitouch- Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:
- Das Eingabegerät meldet das Vorhandensein der Absolutachsen
ABS_MT_POSITION_X
undABS_MT_POSITION_Y
. - Das Eingabegerät verfügt über keine Gamepad-Tasten. Diese Bedingung behebt eine Mehrdeutigkeit bei bestimmten Gamepads, die Achsen mit Codes melden, die sich mit denen der MT-Achsen überschneiden.
Ein Eingabegerät wird als Single-Touch- Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:
- Das Eingabegerät ist nicht als Multitouch-Gerät klassifiziert. Ein Eingabegerät wird entweder als Single-Touch-Gerät oder als Multi-Touch-Gerät klassifiziert, niemals beides.
- Das Eingabegerät meldet das Vorhandensein der absoluten Achsen
ABS_X
undABS_Y
sowie das Vorhandensein des TastencodesBTN_TOUCH
.
Wenn ein Eingabegerät als Touch-Gerät klassifiziert wird, wird das Vorhandensein virtueller Tasten durch den Versuch ermittelt, die virtuelle Tastenzuordnungsdatei für das Gerät zu laden. Wenn eine virtuelle Tastenbelegung verfügbar ist, wird auch die Tastenlayoutdatei für das Gerät geladen. Informationen zum Speicherort und Format dieser Dateien finden Sie unter [Virtuelle Tastenzuordnungsdateien](#virtual-key-map-files).
Als nächstes lädt das System die Eingabegeräte-Konfigurationsdatei für das Touch-Gerät.
Alle integrierten Touch-Geräte sollten über Konfigurationsdateien für Eingabegeräte verfügen. Wenn keine Konfigurationsdatei für Eingabegeräte vorhanden ist, wählt das System eine Standardkonfiguration, die für allgemeine Touch-Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder Touchpads geeignet ist. Diese Standardeinstellungen sind nicht für integrierte Touchscreens konzipiert und können zu fehlerhaftem Verhalten führen.
Nachdem die Konfiguration des Eingabegeräts geladen wurde, klassifiziert das System das Eingabegerät als Touchscreen , Touchpad oder Zeigergerät .
- Ein Touchscreen -Gerät dient der direkten Manipulation von Objekten auf dem Bildschirm. Der Benutzer berührt den Bildschirm direkt, sodass das System keine zusätzlichen Funktionen benötigt, um die zu manipulierenden Objekte anzuzeigen.
- Ein Touchpad- Gerät wird verwendet, um einer App absolute Positionsinformationen über Berührungen auf einem bestimmten Sensorbereich bereitzustellen. Dies kann für Digitalisiertabletts nützlich sein.
- Ein Zeigergerät dient zur indirekten Manipulation von Objekten auf dem Bildschirm mithilfe eines Cursors. Finger werden als Multitouch-Zeigergesten interpretiert. Andere Werkzeuge, wie z. B. Stifte, werden anhand absoluter Positionen interpretiert. Weitere Informationen finden Sie unter Indirekte Multitouch-Zeigergesten .
Die folgenden Regeln werden verwendet, um das Eingabegerät als Touchscreen, Touchpad oder Zeigergerät zu klassifizieren.
- Wenn die Eigenschaft
touch.deviceType
festgelegt ist, wird der Gerätetyp wie angegeben festgelegt. - Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft
INPUT_PROP_DIRECT
meldet (über dasEVIOCGPROP
Ioctl), wird der Gerätetyp auf Touchscreen festgelegt. Bei dieser Bedingung wird davon ausgegangen, dass Direkteingabe-Touch-Geräte an ein ebenfalls angeschlossenes Display angeschlossen sind. - Wenn das Eingabegerät das Vorhandensein der Eingabeeigenschaft
INPUT_PROP_POINTER
meldet (über dasEVIOCGPROP
Ioctl), wird der Gerätetyp auf pointer gesetzt. - Wenn das Eingabegerät das Vorhandensein der relativen Achsen
REL_X
oderREL_Y
meldet, wird der Gerätetyp auf Touchpad eingestellt. Diese Bedingung behebt eine Mehrdeutigkeit für Eingabegeräte, die sowohl aus einer Maus als auch einem Touchpad bestehen. In diesem Fall wird das Touchpad nicht zur Steuerung des Zeigers verwendet, da die Maus ihn bereits steuert. - Andernfalls wird der Gerätetyp auf pointer gesetzt. Diese Standardeinstellung stellt sicher, dass Touchpads, denen kein anderer besonderer Zweck zugewiesen wurde, den Zeiger steuern.
Tasten
Schaltflächen sind optionale Steuerelemente, mit denen Apps zusätzliche Funktionen ausführen können. Tasten auf Touch-Geräten verhalten sich ähnlich wie Maustasten und werden hauptsächlich bei Touch-Geräten mit Zeiger oder einem Stift verwendet.
Folgende Schaltflächen werden unterstützt:
-
BTN_LEFT
: Zugeordnet zuMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: Zugeordnet zuMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: Zugeordnet zuMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
undBTN_SIDE
: ZuMotionEvent.BUTTON_BACK
zugeordnet. Durch Drücken dieser Taste wird auch ein Tastendruck mit dem TastencodeKeyEvent.KEYCODE_BACK
synthetisiert. -
BTN_FORWARD
undBTN_EXTRA
: Zugeordnet zuMotionEvent.BUTTON_FORWARD
. Durch Drücken dieser Taste wird auch ein Tastendruck mit dem TastencodeKeyEvent.KEYCODE_FORWARD
synthetisiert. -
BTN_STYLUS
:MotionEvent.BUTTON_SECONDARY
zugeordnet. -
BTN_STYLUS2
:MotionEvent.BUTTON_TERTIARY
zugeordnet.
Werkzeuge und Werkzeugtypen
Ein Werkzeug ist ein Finger, ein Stift oder ein anderes Gerät, das zur Interaktion mit dem Touch-Gerät verwendet wird. Einige Touch-Geräte können zwischen verschiedenen Werkzeugtypen unterscheiden.
An anderer Stelle in Android, wie in der MotionEvent
API, wird ein Werkzeug oft als Zeiger bezeichnet.
Folgende Werkzeugtypen werden unterstützt:
-
BTN_TOOL_FINGER
undMT_TOOL_FINGER
: ZuMotionEvent.TOOL_TYPE_FINGER
zugeordnet. -
BTN_TOOL_PEN
undMT_TOOL_PEN
: ZuMotionEvent.TOOL_TYPE_STYLUS
zugeordnet. -
BTN_TOOL_RUBBER
: Zugeordnet zuMotionEvent.TOOL_TYPE_ERASER
. -
BTN_TOOL_BRUSH
: ZuMotionEvent.TOOL_TYPE_STYLUS
zugeordnet. -
BTN_TOOL_PENCIL
: ZuMotionEvent.TOOL_TYPE_STYLUS
zugeordnet. -
BTN_TOOL_AIRBRUSH
: ZuMotionEvent.TOOL_TYPE_STYLUS
zugeordnet. -
BTN_TOOL_MOUSE
: ZuMotionEvent.TOOL_TYPE_MOUSE
zugeordnet. -
BTN_TOOL_LENS
: ZuMotionEvent.TOOL_TYPE_MOUSE
zugeordnet. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
undBTN_TOOL_QUADTAP
: Zugeordnet zuMotionEvent.TOOL_TYPE_FINGER
.
Schwebende versus berührende Werkzeuge
Werkzeuge können entweder Kontakt mit dem Touch-Gerät haben oder sich in dessen Reichweite befinden und darüber schweben. Nicht alle Touch-Geräte können die Anwesenheit eines Werkzeugs erkennen, das über dem Touch-Gerät schwebt. Diejenigen, die dies tun, wie z. B. HF-basierte Stylus-Digitalisierer, können oft erkennen, wenn sich das Werkzeug innerhalb einer begrenzten Reichweite des Digitalisierers befindet.
Die InputReader
Komponente unterscheidet berührende Werkzeuge von schwebenden Werkzeugen. Ebenso werden berührende und schwebende Werkzeuge auf unterschiedliche Weise an Apps gemeldet.
Berührende Werkzeuge werden mithilfe von MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
und MotionEvent.ACTION_POINTER_UP
als Berührungsereignisse an Apps gemeldet.
Schwebewerkzeuge werden Apps als generische Bewegungsereignisse mit MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
und MotionEvent.ACTION_HOVER_EXIT
gemeldet.
Anforderungen an den Touch-Gerätetreiber
- Touch-Gerätetreiber sollten nur die Achsen und Tastencodes für die Achsen und Tasten registrieren, die sie unterstützen. Die Registrierung nicht unterstützter Achsen oder Tastencodes kann den Geräteklassifizierungsalgorithmus verwirren oder dazu führen, dass das System die Funktionen des Geräts falsch erkennt. Wenn das Gerät beispielsweise den Tastencode
BTN_TOUCH
meldet, geht das System davon aus, dassBTN_TOUCH
immer verwendet wird, um anzuzeigen, ob das Werkzeug den Bildschirm berührt. Daher sollteBTN_TOUCH
nicht verwendet werden, um anzuzeigen, dass sich das Werkzeug lediglich in der Reichweite befindet und schwebt. - Single-Touch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
-
ABS_X
: (ERFORDERLICH) Meldet die X-Koordinate des Werkzeugs. -
ABS_Y
: (ERFORDERLICH) Meldet die Y-Koordinate des Werkzeugs. -
ABS_PRESSURE
: (optional) Meldet den auf die Spitze des Werkzeugs ausgeübten physischen Druck oder die Signalstärke des Berührungskontakts. -
ABS_TOOL_WIDTH
: (optional) Meldet die Querschnittsfläche oder Breite des Berührungskontakts oder des Werkzeugs selbst. -
ABS_DISTANCE
: (optional) Meldet den Abstand des Werkzeugs von der Oberfläche des Touch-Geräts. -
ABS_TILT_X
: (optional) Meldet die Neigung des Werkzeugs von der Oberfläche des Touch-Geräts entlang der X-Achse. -
ABS_TILT_Y
: (optional) Meldet die Neigung des Werkzeugs von der Oberfläche des Touch-Geräts entlang der Y-Achse. -
BTN_TOUCH
: (ERFORDERLICH) Gibt an, ob das Werkzeug das Gerät berührt. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (optional) Meldet Schaltflächenzustände . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (optional) Meldet den Werkzeugtyp .
-
- Multitouch-Geräte verwenden die folgenden Linux-Eingabeereignisse:
-
ABS_MT_POSITION_X
: (ERFORDERLICH) Meldet die X-Koordinate des Werkzeugs. -
ABS_MT_POSITION_Y
: (ERFORDERLICH) Meldet die Y-Koordinate des Werkzeugs. -
ABS_MT_PRESSURE
: (optional) Meldet den auf die Spitze des Werkzeugs ausgeübten physischen Druck oder die Signalstärke des Berührungskontakts. -
ABS_MT_TOUCH_MAJOR
: (optional) Meldet die Querschnittsfläche des Berührungskontakts oder die Länge der längeren Abmessung des Berührungskontakts. -
ABS_MT_TOUCH_MINOR
: (optional) Meldet die Länge der kürzeren Dimension des Berührungskontakts. Diese Achse sollte nicht verwendet werden, wennABS_MT_TOUCH_MAJOR
eine Flächenmessung meldet. -
ABS_MT_WIDTH_MAJOR
: (optional) Meldet die Querschnittsfläche des Werkzeugs selbst oder die Länge der längeren Abmessung des Werkzeugs selbst. Verwenden Sie diese Achse nur, wenn Sie die Abmessungen des Werkzeugs selbst kennen. -
ABS_MT_WIDTH_MINOR
: (optional) Meldet die Länge der kürzeren Abmessung des Werkzeugs selbst. Diese Achse sollte nicht verwendet werden, wennABS_MT_WIDTH_MAJOR
eine Flächenmessung meldet oder wenn die Abmessungen des Werkzeugs selbst unbekannt sind. -
ABS_MT_ORIENTATION
: (optional) Meldet die Ausrichtung des Werkzeugs. -
ABS_MT_DISTANCE
: (optional) Meldet den Abstand des Werkzeugs von der Oberfläche des Touch-Geräts. -
ABS_MT_TOOL_TYPE
: (optional) Meldet den Werkzeugtyp alsMT_TOOL_FINGER
oderMT_TOOL_PEN
. -
ABS_MT_TRACKING_ID
: (optional) Meldet die Tracking-ID des Tools. Die Tracking-ID ist eine beliebige, nicht negative Ganzzahl, die verwendet wird, um jedes Werkzeug unabhängig zu identifizieren und zu verfolgen, wenn mehrere Werkzeuge aktiv sind. Wenn beispielsweise mehrere Finger das Gerät berühren, sollte jedem Finger eine eindeutige Tracking-ID zugewiesen werden, die verwendet wird, solange der Finger in Kontakt bleibt. Tracking-IDs können wiederverwendet werden, wenn die zugehörigen Tools außer Reichweite geraten. -
ABS_MT_SLOT
: (optional) Meldet die Slot-ID des Tools, wenn das Linux-Multitouch-Protokoll „B“ verwendet wird. Weitere Einzelheiten finden Sie in der Dokumentation zum Linux-Multitouch-Protokoll. -
BTN_TOUCH
: (ERFORDERLICH) Gibt an, ob das Werkzeug das Gerät berührt. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (optional) Meldet Schaltflächenzustände . -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (optional) Meldet den Werkzeugtyp .
-
- Wenn Achsen sowohl für das Single-Touch- als auch für das Multi-Touch-Protokoll definiert sind, werden nur die Multi-Touch-Achsen verwendet und die Single-Touch-Achsen ignoriert.
Die minimalen und maximalen Werte der
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 Touch-Geräts, der tatsächlich das Display bedeckt.Bei einem Touchscreen interpoliert das System automatisch die gemeldeten Berührungspositionen in Oberflächeneinheiten, um Berührungspositionen in Anzeigepixeln gemäß der folgenden Berechnung zu erhalten:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Ein Touchscreen meldet möglicherweise Berührungen außerhalb des gemeldeten aktiven Bereichs.
Berührungen, die außerhalb des aktiven Bereichs initiiert werden, werden nicht an Apps übermittelt, können aber für virtuelle Tasten verwendet werden.
Berührungen, die innerhalb des aktiven Bereichs initiiert werden oder die den Anzeigebereich betreten und verlassen, werden an Apps übermittelt. Wenn also eine Berührung innerhalb der Grenzen einer App beginnt und sich dann außerhalb des aktiven Bereichs bewegt, empfängt die App möglicherweise Berührungsereignisse mit Anzeigekoordinaten, die negativ sind oder über die Grenzen der Anzeige hinausgehen. Dies ist das erwartete Verhalten.
Ein Touch-Gerät sollte niemals Touch-Koordinaten an die Grenzen des aktiven Bereichs klemmen. Wenn eine Berührung den aktiven Bereich verlässt, sollte sie als außerhalb des aktiven Bereichs liegend oder überhaupt nicht gemeldet werden.
Wenn der Finger des Benutzers beispielsweise die obere linke Ecke des Touchscreens berührt, wird möglicherweise eine Koordinate von (minX, minY) gemeldet. Wenn sich der Finger weiterhin weiter außerhalb des aktiven Bereichs bewegt, sollte der Touchscreen entweder mit der Meldung von Koordinaten mit Komponenten beginnen, die kleiner als minX und minY sind, z. B. (minX – 2, minY – 3), oder er sollte die Meldung der Berührung ganz einstellen. Mit anderen Worten: Der Touchscreen sollte nicht melden (minX, minY), wenn der Finger des Benutzers tatsächlich außerhalb des aktiven Bereichs berührt.
Durch das Festklemmen von Berührungskoordinaten am Displayrand entsteht eine künstliche harte Grenze um den Rand des Bildschirms, die das System daran hindert, Bewegungen, die in die Grenzen des Displaybereichs hinein- oder daraus hervorgehen, reibungslos zu verfolgen.
Die von
ABS_PRESSURE
oderABS_MT_PRESSURE
gemeldeten Werte dürfen, wenn überhaupt, ungleich Null sein, wenn das Werkzeug das Gerät berührt, und andernfalls Null, um anzuzeigen, dass das Werkzeug schwebt.Die Meldung von Druckinformationen ist optional , wird jedoch dringend empfohlen. Apps können Druckinformationen verwenden, um druckempfindliches Zeichnen und andere Effekte zu implementieren.
Die von
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
oderABS_MT_WIDTH_MINOR
gemeldeten Werte sollten ungleich Null sein, wenn das Werkzeug das Gerät berührt, und andernfalls Null, dies ist jedoch nicht erforderlich. Beispielsweise kann das Touch-Gerät möglicherweise die Größe von Fingerberührungskontakten messen, jedoch nicht die Größe von Stiftberührungskontakten.Die Angabe von Größeninformationen ist optional , wird jedoch dringend empfohlen. Apps können Druckinformationen verwenden, um größenabhängige Zeichnungen und andere Effekte zu implementieren.
Die von
ABS_DISTANCE
oderABS_MT_DISTANCE
gemeldeten Werte sollten gegen Null gehen, wenn das Werkzeug das Gerät berührt. Der Abstand kann auch dann ungleich Null bleiben, wenn das Werkzeug in direktem Kontakt steht. Die genauen gemeldeten Werte hängen von der Art und Weise ab, wie die Hardware die Entfernung misst.Die Meldung von Entfernungsinformationen ist optional , wird jedoch für Eingabegeräte empfohlen.
Die von
ABS_TILT_X
undABS_TILT_Y
gemeldeten Werte sollten Null sein, wenn das Werkzeug senkrecht zum Gerät steht. Eine Neigung ungleich Null zeigt an, dass das Werkzeug schräg gehalten wird.Es wird davon ausgegangen, dass die Neigungswinkel entlang der X- und Y-Achse in Grad zur Senkrechten angegeben werden. Der Mittelpunkt (perfekt senkrecht) ist für jede Achse durch
(max + min) / 2
gegeben. Werte kleiner als der Mittelpunkt bedeuten eine Neigung nach oben oder links, Werte größer als der Mittelpunkt bedeuten eine Neigung nach unten oder rechts.InputReader
wandelt die X- und Y-Neigungskomponenten in einen senkrechten Neigungswinkel im Bereich von 0 bisPI / 2
Bogenmaß und einen planaren Orientierungswinkel im Bereich von-PI
bisPI
Bogenmaß um. Diese Darstellung führt zu einer Beschreibung der Ausrichtung, die mit der Beschreibung von Fingerberührungen kompatibel ist.Die Meldung von Neigungsinformationen ist optional , wird jedoch für Stiftgeräte empfohlen.
Wenn der Werkzeugtyp von
ABS_MT_TOOL_TYPE
gemeldet wird, ersetzt er alle vonBTN_TOOL_*
gemeldeten Werkzeugtypinformationen. Wenn überhaupt keine Informationen zum Werkzeugtyp verfügbar sind, wird als Werkzeugtyp standardmäßigMotionEvent.TOOL_TYPE_FINGER
verwendet.Basierend auf den folgenden Bedingungen wird festgestellt, dass ein Werkzeug aktiv ist:
Bei Verwendung des Single-Touch-Protokolls ist das Tool aktiv, wenn
BTN_TOUCH
oderBTN_TOOL_*
1 ist.Diese Bedingung impliziert, dass
InputReader
mindestens einige Informationen über die Art des Werkzeugs haben muss, entweder ob es berührt, oder zumindest über seinen Werkzeugtyp. Wenn keine Informationen verfügbar sind, wird davon ausgegangen, dass das Werkzeug inaktiv ist (außerhalb des Bereichs).- Bei Verwendung des Multi-Touch-Protokolls „A“ ist das Tool immer dann aktiv, wenn es im neuesten Synchronisierungsbericht erscheint. Wenn das Tool nicht mehr in den Synchronisierungsberichten erscheint, ist es nicht mehr vorhanden.
- Bei Verwendung des Multitouch-Protokolls „B“ ist das Werkzeug aktiv, solange es über einen aktiven Steckplatz verfügt. Wenn der Steckplatz gelöscht wird, existiert das Werkzeug nicht mehr.
- Basierend auf den folgenden Bedingungen wird festgestellt, dass ein Werkzeug schwebt:
- Wenn das Werkzeug
BTN_TOOL_MOUSE
oderBTN_TOOL_LENS
ist, schwebt das Werkzeug nicht, auch wenn eine der folgenden Bedingungen zutrifft. - Wenn das Werkzeug aktiv ist und der Treiber Druckinformationen meldet und der gemeldete Druck Null ist, dann schwebt das Werkzeug.
- Wenn das Tool aktiv ist und der Treiber den
BTN_TOUCH
Tastencode unterstützt undBTN_TOUCH
den Wert Null hat, schwebt das Tool.
- Wenn das Werkzeug
-
InputReader
unterstützt sowohl das Multi-Touch-Protokoll „A“ als auch „B“. Neue Treiber sollten das „B“-Protokoll verwenden, aber beides funktioniert. Ab Android 4.0 müssen möglicherweise Touchscreen-Treiber geändert werden, um der Linux-Eingabeprotokollspezifikation zu entsprechen.
Folgende Änderungen können erforderlich sein:
Wenn ein Werkzeug inaktiv wird (Finger bewegt sich nach oben), sollte es in nachfolgenden Multi-Touch-Synchronisierungsberichten nicht mehr angezeigt werden. Wenn alle Tools inaktiv werden (alle Finger gehen nach oben), sollte der Treiber ein leeres Synchronisierungsberichtspaket senden, z. B.
SYN_MT_REPORT
gefolgt vonSYN_REPORT
.Frühere Versionen von Android erwarteten, dass „Up“-Ereignisse durch Senden eines Druckwerts von 0 gemeldet werden. Das alte Verhalten war mit der Linux-Eingabeprotokollspezifikation nicht kompatibel und wird nicht mehr unterstützt.
Informationen zum physischen Druck oder zur Signalstärke sollten mit
ABS_MT_PRESSURE
gemeldet werden.Frühere Versionen von Android haben Druckinformationen von
ABS_MT_TOUCH_MAJOR
abgerufen. Das alte Verhalten war mit der Linux-Eingabeprotokollspezifikation nicht kompatibel und wird nicht mehr unterstützt.- Informationen zur Berührungsgröße sollten mit
ABS_MT_TOUCH_MAJOR
gemeldet werden.Frühere Android-Versionen haben Größeninformationen von
ABS_MT_TOOL_MAJOR
abgerufen. Das alte Verhalten war mit der Linux-Eingabeprotokollspezifikation nicht kompatibel und wird nicht mehr unterstützt.
Touch-Gerätebedienung
Im Folgenden finden Sie eine kurze Zusammenfassung der Touch-Gerätebedienung unter Android.
-
EventHub
liest Rohereignisse vomevdev
Treiber. -
InputReader
nutzt die Rohereignisse und aktualisiert den internen Status über die Position und andere Eigenschaften jedes Werkzeugs. Es verfolgt auch den Tastenstatus. - Wenn BACK oder FORWARD gedrückt oder losgelassen wurde, benachrichtigt
InputReader
InputDispatcher
über das Tastenereignis. -
InputReader
ermittelt, ob ein virtueller Tastendruck stattgefunden hat. Wenn ja, benachrichtigt esInputDispatcher
über das Schlüsselereignis. -
InputReader
ermittelt, ob die Berührung innerhalb der Grenzen der Anzeige initiiert wurde. Wenn dies der Fall ist, benachrichtigt esInputDispatcher
über das Berührungsereignis. - Wenn keine berührenden Werkzeuge, aber mindestens ein schwebendes Werkzeug vorhanden sind, benachrichtigt
InputReader
InputDispatcher
über das Hover-Ereignis. - Wenn der Touch-Gerätetyp pointer ist, führt
InputReader
eine Zeigergestenerkennung durch, bewegt den Zeiger und die Punkte entsprechend und benachrichtigtInputDispatcher
über das Zeigerereignis. -
InputDispatcher
verwendetWindowManagerPolicy
um zu bestimmen, ob die Ereignisse gesendet werden sollen und ob sie das Gerät aktivieren sollen. Anschließend übermitteltInputDispatcher
die Ereignisse an die entsprechenden Apps.
Touch-Gerätekonfiguration
Das Verhalten des Touch-Geräts wird durch die Achsen, Tasten, Eingabeeigenschaften, die Konfiguration des Eingabegeräts, die virtuelle Tastenbelegung und das Tastenlayout des Geräts bestimmt.
Weitere Informationen zu den Dateien, die an der Tastaturkonfiguration beteiligt sind, finden Sie in den folgenden Abschnitten:
Eigenschaften
Das System stützt sich auf viele Konfigurationseigenschaften von Eingabegeräten, um das Verhalten von Touch-Geräten zu konfigurieren und zu kalibrieren.
Ein Grund dafür ist, dass die Gerätetreiber für Touch-Geräte die Eigenschaften von Berührungen oft mit gerätespezifischen Einheiten melden.
Viele Touch-Geräte messen beispielsweise die Berührungskontaktfläche mithilfe einer internen gerätespezifischen Skala, beispielsweise der Gesamtzahl der Sensorknoten, die durch die Berührung ausgelöst wurden. Dieser Rohgrößenwert wäre für Apps nicht aussagekräftig, da sie die physische Größe und andere Eigenschaften der Sensorknoten des Touch-Geräts kennen müssten.
Das System verwendet Kalibrierungsparameter, die in Konfigurationsdateien des Eingabegeräts codiert sind, um die vom Touch-Gerät gemeldeten Werte zu dekodieren, umzuwandeln und in eine einfachere Standarddarstellung zu normalisieren, die Apps verstehen können.
Dokumentationskonventionen
Zu Dokumentationszwecken verwenden wir die folgenden Konventionen, um die vom System während des Kalibrierungsprozesses verwendeten Werte zu beschreiben.
Rohe Achsenwerte
Die folgenden Ausdrücke bezeichnen die Rohwerte, die vom Touch-Gerätetreiber als EV_ABS
Ereignisse gemeldet werden.
-
raw.x
- Der Wert der Achse
ABS_X
oderABS_MT_POSITION_X
. -
raw.y
- Der Wert der Achse
ABS_Y
oderABS_MT_POSITION_Y
. -
raw.pressure
- Der Wert der
ABS_PRESSURE
oderABS_MT_PRESSURE
Achse oder 0, wenn nicht verfügbar. -
raw.touchMajor
- Der Wert der
ABS_MT_TOUCH_MAJOR
Achse oder 0, wenn nicht verfügbar. -
raw.touchMinor
- Der Wert der
ABS_MT_TOUCH_MINOR
Achse oderraw.touchMajor
, falls nicht verfügbar. -
raw.toolMajor
- Der Wert der Achse
ABS_TOOL_WIDTH
oderABS_MT_WIDTH_MAJOR
oder 0, wenn 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, wenn nicht verfügbar. -
raw.distance
- Der Wert der
ABS_DISTANCE
oderABS_MT_DISTANCE
Achse oder 0, wenn nicht verfügbar. -
raw.tiltX
- Der Wert der
ABS_TILT_X
Achse oder 0, wenn nicht verfügbar. -
raw.tiltY
- Der Wert der
ABS_TILT_Y
Achse oder 0, wenn nicht verfügbar.
Rohachsenbereiche
Die folgenden Ausdrücke geben die Grenzen der Rohwerte an. Sie werden durch den Aufruf von EVIOCGABS
ioctl für jede Achse erhalten.
-
raw.*.min
- Der inklusive Mindestwert der Rohachse.
-
raw.*.max
- Der inklusive Maximalwert der Rohachse.
-
raw.*.range
- Entspricht
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Die Genauigkeit der Rohachse. z.B. fuzz = 1 bedeutet, dass die Werte auf +/- 1 Einheit genau sind.
-
raw.width
- Die inklusive Breite des Berührungsbereichs, entspricht
raw.x.range + 1
. -
raw.height
- Die inklusive Höhe des Berührungsbereichs, entspricht
raw.y.range + 1
.
Ausgabebereiche
Die folgenden Ausdrücke bezeichnen die Eigenschaften des Ausgabekoordinatensystems. Das System verwendet lineare Interpolation, um Berührungspositionsinformationen aus den vom Touch-Gerät verwendeten Oberflächeneinheiten in Ausgabeeinheiten zu übersetzen, die an Apps gemeldet werden, z. B. Anzeigepixel.
-
output.width
- Die Ausgabebreite. Bei Touchscreens (in Verbindung mit einem Display) ist dies die Anzeigebreite in Pixel. Bei Touchpads (die keinem Display zugeordnet sind) entspricht die Ausgabebreite
raw.width
, was darauf hinweist, dass keine Interpolation durchgeführt wird. -
output.height
- Die Ausgabehöhe. Bei Touchscreens (in Verbindung mit einem Display) ist dies die Anzeigehöhe in Pixel. Bei Touchpads (die keiner Anzeige zugeordnet sind) entspricht die Ausgabehöhe
raw.height
, was darauf hinweist, dass keine Interpolation durchgeführt wird. -
output.diag
- Die diagonale Länge des Ausgabekoordinatensystems, äquivalent zu
sqrt(output.width ^2 + output.height ^2)
.
Basiseinstellung
Der Touch-Input-Mapper verwendet viele Konfigurationseigenschaften in der Konfigurationsdatei des Eingabegeräts, um Kalibrierungswerte anzugeben. In der folgenden Tabelle werden einige allgemeine Konfigurationseigenschaften beschrieben. Alle anderen Eigenschaften werden in den folgenden Abschnitten beschrieben, zusammen mit den Feldern, die sie zur Kalibrierung verwenden.
touch.deviceType
Definition: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Gibt den Typ des Touch-Geräts an.
Wenn der Wert
touchScreen
ist, handelt es sich bei dem Touch-Gerät um einen Touchscreen, der einer Anzeige zugeordnet ist.Wenn der Wert
touchPad
ist, handelt es sich bei dem Touch-Gerät um ein Touchpad, das keinem Display zugeordnet ist.Wenn der Wert
pointer
lautet, handelt es sich bei dem Touch-Gerät um ein Touchpad, das nicht mit einem Display verknüpft ist, und seine Bewegungen werden für indirekte Multitouch-Zeigergesten verwendet.Wenn der Wert
default
lautet, erkennt das System den Gerätetyp automatisch anhand des Klassifizierungsalgorithmus.
Weitere Informationen dazu, wie der Gerätetyp das Verhalten des Touch-Geräts beeinflusst, finden Sie im Abschnitt „Klassifizierung“ .
In Android 3 und niedriger wurde davon ausgegangen, dass es sich bei allen Touch-Geräten um Touchscreens handelte.
touch.orientationAware
Definition: touch.orientationAware
= 0
| 1
Gibt an, ob das Touch-Gerät auf Änderungen der Anzeigeausrichtung reagieren soll.
Wenn der Wert
1
ist, werden die vom Touch-Gerät gemeldeten Berührungspositionen immer dann gedreht, wenn sich die Anzeigeausrichtung ändert.Wenn der Wert
0
ist, sind die vom Touch-Gerät gemeldeten Berührungspositionen immun gegen Änderungen der Anzeigeausrichtung.
Der Standardwert ist 1
wenn es sich bei dem Gerät um einen Touchscreen handelt, andernfalls 0
.
Das System unterscheidet zwischen internen und externen Touchscreens und Displays. Ein orientierungsbewusster interner Touchscreen wird basierend auf der Ausrichtung des internen Displays gedreht. Ein ausrichtungsbewusster externer Touchscreen wird basierend auf der Ausrichtung des externen Displays gedreht.
Die Orientierungserkennung wird verwendet, um die Drehung von Touchscreens auf Geräten wie dem Nexus One zu unterstützen. Wenn das Gerät beispielsweise um 90 Grad von seiner natürlichen Ausrichtung im Uhrzeigersinn gedreht wird, werden die absoluten Positionen von Berührungen neu zugeordnet, sodass eine Berührung in der oberen linken Ecke des absoluten Koordinatensystems des Touchscreens als Berührung in der oberen linken Ecke gemeldet wird Ecke des gedrehten Koordinatensystems der Anzeige. Dies geschieht, damit Berührungen mit demselben Koordinatensystem gemeldet werden, das Apps zum Zeichnen ihrer visuellen Elemente verwenden.
Vor Honeycomb wurde davon ausgegangen, dass alle Touch-Geräte orientierungsbewusst sind.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
| default
Gibt den Darstellungsmodus für Zeigergesten an. Diese Konfigurationseigenschaft ist nur relevant, wenn das Touch-Gerät vom Typ Zeiger ist.
Wenn der Wert
pointer
ist, werden die Touchpad-Gesten durch einen Cursor dargestellt, der einem Mauszeiger ähnelt.Wenn der Wert
spots
lautet, werden die Touchpad-Gesten durch einen Anker dargestellt, der den Schwerpunkt der Geste darstellt, und durch eine Reihe kreisförmiger Punkte, die die Position einzelner Finger darstellen.
Der Standardwert ist pointer
, wenn die Eingabeeigenschaft INPUT_PROP_SEMI_MT
festgelegt ist, andernfalls spots
.
X- und Y-Felder
Die X- und Y-Felder liefern Positionsinformationen für die Mitte des Kontaktbereichs.
Berechnung
Die Berechnung ist unkompliziert: Positionsinformationen vom Touch-Treiber werden linear in das Ausgabekoordinatensystem interpoliert.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, toolMajor, toolMinor, Größenfelder
Die Felder touchMajor
und touchMinor
beschreiben die ungefähren Abmessungen der Kontaktfläche in Ausgabeeinheiten (Pixel).
Die Felder toolMajor
und toolMinor
beschreiben die ungefähren Abmessungen des Werkzeugs selbst in Ausgabeeinheiten (Pixel).
Das size
beschreibt die normalisierte Größe der Berührung im Verhältnis zur größtmöglichen Berührung, die das Touch-Gerät wahrnehmen kann. Die kleinstmögliche normalisierte Größe ist 0,0 (kein Kontakt oder nicht messbar) und die größtmögliche normalisierte Größe ist 1,0 (Sensorbereich ist gesättigt).
Wenn sowohl die ungefähre Länge als auch die Breite gemessen werden können, gibt das Feld touchMajor
die längere Abmessung und das Feld „ touchMinor
“ die kürzere Abmessung der Kontaktfläche an. Wenn nur der ungefähre Durchmesser der Kontaktfläche gemessen werden kann, sind die Felder touchMajor
und touchMinor
gleich.
Ebenso gibt das Feld toolMajor
die längere Abmessung und das Feld „ toolMinor
“ die kürzere Abmessung der Querschnittsfläche des Werkzeugs an.
Wenn die Touch-Größe nicht verfügbar ist, aber die Werkzeuggröße verfügbar ist, wird die Werkzeuggröße auf die Touch-Größe gesetzt. Wenn umgekehrt die Werkzeuggröße nicht verfügbar ist, aber die Berührungsgröße verfügbar ist, wird die Berührungsgröße auf die Werkzeuggröße gesetzt.
Touch-Geräte messen oder melden die Touch-Größe und Werkzeuggröße auf verschiedene Weise. Die aktuelle Implementierung unterstützt drei verschiedene Arten von Messungen: Durchmesser, Fläche und geometrischer Begrenzungsrahmen in Oberflächeneinheiten.
Definition: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Gibt die Art der Messung an, die der Touch-Treiber verwendet, um die Touch-Größe und Werkzeuggröße zu melden.
Wenn der Wert
none
ist, wird die Größe auf Null gesetzt.Wenn es sich um einen
geometric
Wert handelt, wird davon ausgegangen, dass die Größe in denselben Oberflächeneinheiten wie die Position angegeben wird und daher auf die gleiche Weise skaliert wird.Wenn der Wert
diameter
lautet, wird davon ausgegangen, dass die Größe proportional zum Durchmesser (Breite) der Berührung oder des Werkzeugs ist.Wenn der Wert „
area
lautet, wird davon ausgegangen, dass die Größe proportional zur Fläche der Berührung oder des Werkzeugs ist.Wenn der Wert
default
ist, verwendet das System diegeometric
Kalibrierung, wenn die Achseraw.touchMajor
oderraw.toolMajor
verfügbar ist, andernfalls verwendet es die Kalibrierungnone
.
Touch-Größenskala
Definition: touch.size.scale
= <eine nicht negative Gleitkommazahl>
Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 1.0
.
Touch-Size-Bias
Definition: touch.size.bias
= <eine nicht negative Gleitkommazahl>
Gibt einen konstanten Bias-Wert an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 0.0
.
touch.size.isSummed
Definition: touch.size.isSummed
= 0
| 1
Gibt an, ob die Größe als Summe der Größen aller aktiven Kontakte oder einzeln für jeden Kontakt gemeldet wird.
Wenn der Wert
1
ist, wird die gemeldete Größe durch die Anzahl der Kontakte vor der Verwendung geteilt.Wenn der Wert
0
ist, wird die gemeldete Größe unverändert verwendet.
Der Standardwert ist 0
.
Einige Touch-Geräte, insbesondere „Semi-MT“-Geräte, können die einzelnen Abmessungen mehrerer Kontakte nicht unterscheiden und melden daher eine Größenmessung, die deren Gesamtfläche oder -breite darstellt. Diese Eigenschaft sollte nur für solche Geräte auf 1
gesetzt werden. Im Zweifelsfall setzen Sie diesen Wert auf 0
.
Berechnung
Die Berechnung der Felder touchMajor
, touchMinor
, toolMajor
, toolMinor
und size
hängt von den angegebenen Kalibrierungsparametern ab.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
Druckfeld
Das pressure
beschreibt den ungefähren physischen Druck, der auf das Touch-Gerät ausgeübt wird, als normalisierter Wert zwischen 0,0 (keine Berührung) und 1,0 (volle Kraft).
Ein Nulldruck zeigt an, dass das Werkzeug schwebt.
Berührungsdruckkalibrierung
Definition: touch.pressure.calibration
= none
| physical
| amplitude
| default
Gibt die Art der Messung an, die der Touch-Treiber zum Melden des Drucks verwendet.
Wenn der Wert
none
lautet, ist der Druck unbekannt und wird daher beim Berühren auf 1,0 und beim Schweben auf 0,0 gesetzt.Wenn es sich um einen
physical
Wert handelt, wird davon ausgegangen, dass die Druckachse die tatsächliche physikalische Intensität des auf das Touchpad ausgeübten Drucks misst.Wenn 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
lautet, verwendet das System diephysical
Kalibrierung, wenn die Druckachse verfügbar ist, andernfalls wirdnone
verwendet.
Berührungsdruckskala
Definition: touch.pressure.scale
= <eine nicht negative Gleitkommazahl>
Gibt einen konstanten Skalierungsfaktor an, der bei der Kalibrierung verwendet wird.
Der Standardwert ist 1.0 / raw.pressure.max
.
Berechnung
Die Berechnung des pressure
hängt von den angegebenen Kalibrierparametern ab.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Ausrichtung und Neigungsfelder
Das orientation
beschreibt die Orientierung der Berührung und das Werkzeug als Winkelmessung. Eine Orientierung von 0
zeigt an, dass die Hauptachse vertikal ausgerichtet ist. -PI/2
zeigt an, dass die Hauptachse nach links ausgerichtet ist, PI/2
zeigt an, dass die Hauptachse nach rechts ausgerichtet ist. Wenn ein Stiftwerkzeug vorhanden ist, kann der Orientierungsbereich in einem vollständigen Kreisbereich von -PI
oder PI
beschrieben werden.
Das tilt
beschreibt die Neigung des Werkzeugs als Winkelmessung. Eine Neigung von 0
zeigt an, dass das Werkzeug senkrecht zur Oberfläche ist. Eine Neigung von PI/2
zeigt an, dass das Werkzeug auf der Oberfläche flach ist.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Gibt die Art der Messung an, die der Touch -Treiber zur Meldung der Orientierung verwendet hat.
- Wenn der Wert
none
ist, ist die Ausrichtung unbekannt, sodass er auf 0 gesetzt ist. - Wenn der Wert
interpolated
ist,raw.orientation.min
die Orientierung linear interpoliert, so dass einraw.orientation.max
PI/2
-PI/2
Der mittlere Wert von(raw.orientation.min + raw.orientation.max) / 2
Karten bis0
. - Wenn der Wert
vector
ist, wird die Orientierung als gepackter Vektor interpretiert, der zwei signierte 4-Bit-Felder enthält. Diese Darstellung wird für Protokollteile von Atmel -Objektbasis verwendet. Wenn der Vektor entschlüsselt ist, gibt der Vektor einen Orientierungswinkel und eine Vertrauensgröße. Die Vertrauensgröße wird verwendet, um die Größeninformationen zu skalieren, sofern sie nicht geometrisch sind. - Wenn der Wert
default
ist, verwendet das System dieinterpolated
Kalibrierung, wenn die Orientierungsachse verfügbar ist, ansonstennone
.
Berechnung
Die Berechnung der orientation
und tilt
hängt von den angegebenen Kalibrierungsparametern und den verfügbaren Eingaben ab.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
Entfernungsfeld
Das distance
beschreibt den Abstand zwischen dem Werkzeug und der Berührungsvorrichtung. Ein Wert von 0,0 zeigt einen direkten Kontakt an und größere Werte zeigen einen zunehmenden Abstand von der Oberfläche an.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Gibt die Art der Messung an, die der Touch -Treiber verwendet, um die Entfernung zu melden.
Wenn der Wert
none
ist, ist die Entfernung unbekannt, sodass er auf 0 gesetzt ist.Wenn der Wert
scaled
ist, wird der gemeldete Abstand mit einem konstanten Skalierungsfaktor multipliziert.Wenn der Wert
default
ist, verwendet das System diescaled
Kalibrierung, wenn die Entfernungsachse verfügbar ist, ansonstennone
.
touch.distance.scale
Definition: touch.distance.scale
= <a nicht negative schwimmende Punktzahl>
Gibt einen in der Kalibrierung verwendeten konstanten Skalierungsfaktor an.
Der Standardwert ist 1.0
.
Berechnung
Die Berechnung des distance
hängt von den angegebenen Kalibrierungsparametern ab.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Beispiel
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Kompatibilitätshinweise
Die Konfigurationseigenschaften für Touch -Geräte veränderten sich in Android Ice Cream Sandwich 4.0 erheblich. Alle Konfigurationsdateien für Eingabegeräte für Touch -Geräte müssen aktualisiert werden, um die neuen Konfigurationseigenschaften zu verwenden.
Möglicherweise müssen auch ältere Touch -Geräte -Treiber aktualisiert werden.
Virtuelle Kartendateien
Berührungsgeräte werden häufig zum Implementieren von virtuellen Schlüssel verwendet.
Abhängig von den Fähigkeiten des Touch Controllers gibt es verschiedene Möglichkeiten, dies zu tun. Einige Touch -Controller können direkt konfiguriert werden, um Soft -Tasten zu implementieren, indem Firmware -Register festgelegt werden. In anderen Fällen ist es wünschenswert, die Zuordnung von Berührungskoordinaten zu Schlüsselcodes in Software durchzuführen.
Wenn virtuelle Schlüssel in Software implementiert werden, muss der Kernel eine virtuelle Kartendatei namens virtualkeys.<devicename>
Als Board -Eigenschaft. Wenn die Treiber für Touchscreen -Geräte beispielsweise ihren Namen als "toppyfeely" meldet, muss die virtuelle Schlüsselkartendatei über den Pfad /sys/board_properties/virtualkeys.touchyfeely
verfügen.
Eine virtuelle Kartendatei beschreibt die Koordinaten und Linux -Schlüsselcodes virtueller Schlüssel auf dem Touchscreen.
Zusätzlich zur Datei der virtuellen Tastenkartendatei muss eine entsprechende Tastenlayout -Datei und eine Schlüsselkartendatei vorhanden sein, um die Linux -Schlüsselcodes den Android -Schlüsselcodes zuzuordnen und den Typ des Tastaturgeräts anzugeben (normalerweise SPECIAL_FUNCTION
).
Syntax
Eine virtuelle Kartendatei ist eine einfache Textdatei, die aus einer Abfolge von virtuellen Schlüssellayoutbeschreibungen besteht, die entweder durch Newlines oder durch Kolons getrennt sind.
Kommentarlinien beginnen mit '#' und fahren bis zum Ende der Zeile fort.
Jeder virtuelle Schlüssel wird durch 6 Dickdarmkomponenten beschrieben:
-
0x01
: Ein Versionscode. Muss immer0x01
sein. - <Linux -Schlüsselcode>: Der Linux -Schlüsselcode des virtuellen Schlüssels.
- <centrex>: Die X -Pixel -Koordinate der Mitte des virtuellen Schlüssels.
- <In Centery>: Die Y -Pixel -Koordinate des Zentrums des virtuellen Schlüssels.
- <breite>: Die Breite des virtuellen Schlüssels in Pixeln.
- <höhe>: Die Höhe des virtuellen Schlüssels in Pixeln.
Alle Koordinaten und Größen werden in Bezug auf das Anzeigekoordinatensystem angegeben.
Hier ist eine virtuelle Kartendatei, die alle in einer Zeile geschrieben wurden.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
Die gleiche virtuelle Kartendatei kann auch in mehreren Zeilen geschrieben werden.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Im obigen Beispiel hat der Touchscreen eine Auflösung von 480 x 800. Dementsprechend haben alle virtuellen Tasten eine <tentenzentrum> Koordinate von 835, die etwas unter dem sichtbaren Bereich des Touchscreens liegt.
Der erste Schlüssel hat einen Linux -Scan -Code von 158
( KEY_BACK
), Centerx von 55
, Zentrum von 835
, Breite von 90
und Höhe von 55
.
Beispiel
Virtuelle Key Map -Datei: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Key Layout -Datei: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key -Zeichenkartendatei: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirekte Multi-Touch-Zeiger-Gesten
Im Zeigermodus interpretiert das System die folgenden Gesten:
- Single Finger Tipp: Klicken Sie auf.
- Einzelfingerbewegung: Bewegen Sie den Zeiger.
- Einzelfinger -Bewegung und Taste drückt: Ziehen Sie den Zeiger.
- Zwei Fingerbewegungen Beide Finger bewegen sich in die gleiche Richtung: Ziehen Sie den Bereich unter den Zeiger in diese Richtung. Der Zeiger selbst bewegt sich nicht.
- Zwei Fingerbewegungen Beide Finger bewegen sich in unterschiedliche Richtungen in Richtungeinander oder auseinander: Pfanne/Skalierung/Drehen Sie den Bereich, der den Zeiger umgibt. Der Zeiger selbst bewegt sich nicht.
- Multiple Fingerbewegung: Freeform Geste.
Palmenablehnung
Ab Android 13 kann das System Eingänge automatisch von Palmen ablehnen, wenn das integrierte Framework aktiviert ist. Im Inland werden weiterhin benutzerdefinierte Lösungen unterstützt, obwohl sie möglicherweise geändert werden müssen, um das Flag TOOL_TYPE_PALM
zurückzugeben, wenn eine Palme erkannt wird. Das integrierte Framework funktioniert auch in Verbindung mit benutzerdefinierten Lösungen.
Das tatsächliche Modell befasst sich mit den ersten 90 ms Gestendaten, dem aktuellen Zeiger und den umgebenden Zeigern, und untersucht dann, wie weit die Berührungen von der Anzeigekante entfernt sind. Anschließend bestimmt es, welche der Zeiger Palmen pro Zeigerbasis sind. Es berücksichtigt auch die Größe jedes Kontakts, wie von touchMajor
und touchMinor
berichtet. Das Android -Framework entfernt dann die Zeiger, die als Palmen aus dem Touch -Stream gekennzeichnet sind.
Wenn bereits ein Zeiger an die Apps gesendet wurde, dann auch das System:
- (Wenn es andere aktive Zeiger gibt) Steckt den Zeiger mit
ACTION_POINTER_UP
undFLAG_CANCELED
ein. - (Wenn dies der einzige Zeiger ist) Steckt den Zeiger mit
ACTION_CANCEL
ab.
Eine öffentliche API, MotionEvent.FLAG_CANCELED
, gibt an, dass das aktuelle Ereignis keine Benutzeraktion auslösen sollte. Dieses Flag ist sowohl für ACTION_CANCEL
als auch ACTION_POINTER_UP
festgelegt.
Wenn der Palmzeiger nicht an Apps gesendet wurde, lässt das System einfach den Zeiger fallen.
Palmenablehnung aktivieren
- Verwenden Sie in Ihrem Touch -Treiber das Makro
input_abs_set_res
, um die Auflösungen für die folgenden Felder festzulegen (Einheiten sind Pixel pro mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Die Unterstützung für
ABS_MT_TOUCH_MINOR
ist optional. Wenn Ihr Gerät dies jedoch unterstützt, stellen Sie sicher, dass die Auflösung korrekt eingestellt ist. -
- Um zu bestätigen
$ adb shell getevent -li
dass die Felder korrekt eingestellt sind - Um die Funktion während der Laufzeit zu aktivieren, rennen Sie:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Starten Sie den Prozess
system_server
neu.$ adb shell stop && adb shell start
- Bestätigen Sie, dass
adb shell dumpsys input
zeigt, dass es imUnwantedInteractionBlocker
Interaktionsblöcke von Palmenabfällen gibt. Wenn dies nicht der Fall ist, überprüfen Sie die Eingangsprotokolle, um Hinweise darauf zu finden, was möglicherweise falsch konfiguriert ist.Siehe das folgende Beispiel als Referenz:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Um die Funktion dauerhaft zu aktivieren, fügen Sie den entsprechenden SYSPROP -Befehl in Ihre
init**rc
-Datei hinzu:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1