Android unterstützt eine Vielzahl von Touchscreens und Touchpads, einschließlich stiftbasierter Digitizer-Tablets.
Berührungsbildschirme sind Berührungsgeräte, die mit einer Anzeige verbunden sind, sodass der Benutzer den Eindruck hat, Elemente auf dem Bildschirm direkt zu manipulieren.
Touchpads sind Berührungsgeräte, die nicht mit einer Anzeige wie einem Digitalisiertablett verbunden sind. Touchpads werden typischerweise zum Zeigen oder zur absoluten indirekten Positionierung oder gestenbasierten Steuerung einer Benutzerschnittstelle verwendet.
Touch-Geräte können Tasten haben, deren Funktionen denen von Maustasten ähneln.
Touch-Geräte können manchmal mit einer Vielzahl unterschiedlicher Werkzeuge wie Fingern oder einem Stift manipuliert werden, abhängig von der zugrunde liegenden Touch-Sensor-Technologie.
Touch-Geräte werden manchmal verwendet, um virtuelle Tasten zu implementieren. Beispielsweise erstreckt sich bei einigen Android-Geräten der Touchscreen-Sensorbereich über den Rand des Displays hinaus und dient als Teil eines berührungsempfindlichen Tastenfelds einem doppelten Zweck.
Aufgrund der großen Vielfalt an Touch-Geräten stützt sich Android auf eine große Anzahl von Konfigurationseigenschaften, um die Eigenschaften und das gewünschte Verhalten jedes Geräts zu beschreiben.
Tippen Sie auf Geräteklassifizierung
Ein Eingabegerät wird als Multi-Touch- Gerät klassifiziert, wenn beide der folgenden Bedingungen erfüllt sind:
Das Eingabegerät meldet das Vorhandensein der absoluten Achsen
ABS_MT_POSITION_X
undABS_MT_POSITION_Y
.Das Eingabegerät besitzt keine Gamepad-Tasten. Diese Bedingung löst 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 einzustufen. 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
und das Vorhandensein desBTN_TOUCH
.
Sobald ein Eingabegerät als Berührungsgerät klassifiziert wurde, wird das Vorhandensein virtueller Tasten bestimmt, indem versucht wird, die virtuelle Tastenabbildungsdatei für das Gerät zu laden. Wenn eine virtuelle Tastenbelegung verfügbar ist, wird auch die Tastenbelegungsdatei für das Gerät geladen.
Informationen zum Speicherort und Format von Virtual Key Map-Dateien finden Sie im folgenden Abschnitt.
Als nächstes lädt das System die Konfigurationsdatei für das Eingabegerät für das Berührungsgerät.
Alle integrierten Touch-Geräte sollten Konfigurationsdateien für Eingabegeräte haben. Wenn keine Konfigurationsdatei für Eingabegeräte vorhanden ist, wählt das System eine Standardkonfiguration, die für typische Mehrzweck-Touch-Peripheriegeräte wie externe USB- oder Bluetooth-HID-Touchscreens oder -Touchpads geeignet ist. Diese Standardeinstellungen sind nicht für integrierte Touchscreens ausgelegt und führen höchstwahrscheinlich zu einem fehlerhaften Verhalten.
Nachdem die Konfiguration des Eingabegeräts geladen wurde, klassifiziert das System das Eingabegerät als Touchscreen , Touchpad oder Zeigegerät .
Ein Berührungsbildschirmgerät wird zur direkten Manipulation von Objekten auf dem Bildschirm verwendet. Da der Benutzer den Bildschirm direkt berührt, benötigt das System keine zusätzlichen Angebote, um die manipulierten Objekte anzuzeigen.
Ein Touchpad -Gerät wird verwendet, um einer Anwendung absolute Positionsinformationen über Berührungen auf einem gegebenen Sensorbereich bereitzustellen. Es kann für Digitizer-Tablets nützlich sein.
Ein Zeigergerät wird zur indirekten Manipulation von Objekten auf dem Bildschirm unter Verwendung eines Cursors verwendet. Finger werden als Multi-Touch-Zeigergesten interpretiert. Andere Werkzeuge, wie z. B. Stifte, werden anhand absoluter Positionen interpretiert.
Weitere Informationen finden Sie unter Indirekte Multi-Touch-Zeigergesten .
Die folgenden Regeln werden verwendet, um das Eingabegerät als Touchscreen , Touchpad oder Zeigegerät zu klassifizieren.
Wenn die Eigenschaft
touch.deviceType
festgelegt ist, wird der Gerätetyp wie angegeben festgelegt.Wenn das Eingabegerät das Vorhandensein der
INPUT_PROP_DIRECT
meldet (über dasEVIOCGPROP
ioctl), wird der Gerätetyp auf Touchscreen gesetzt. Diese Bedingung setzt voraus, dass Touch-Geräte mit direkter Eingabe an ein Display angeschlossen sind, das ebenfalls angeschlossen ist.Wenn das Eingabegerät das Vorhandensein der
INPUT_PROP_POINTER
(über dasEVIOCGPROP
-ioctl) meldet, wird der Gerätetyp auf pointer gesetzt.Wenn das Eingabegerät das Vorhandensein der relativen Achsen
REL_X
oderREL_Y
, dann wird der Gerätetyp auf Touchpad eingestellt. Diese Bedingung löst eine Mehrdeutigkeit für Eingabegeräte, die sowohl aus einer Maus als auch aus 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 Zeiger gesetzt. Diese Voreinstellung stellt sicher, dass Touchpads, denen kein anderer spezieller Zweck zugewiesen wurde, zur Steuerung des Zeigers dienen.
Tasten
Schaltflächen sind optionale Steuerelemente, die von Anwendungen verwendet werden können, um zusätzliche Funktionen auszuführen. Tasten auf Touch-Geräten verhalten sich ähnlich wie Maustasten und werden hauptsächlich mit Touch-Geräten vom Zeigertyp oder mit 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
: zugeordnet zuMotionEvent.BUTTON_BACK
. Durch Drücken dieser Schaltfläche wird auch ein Tastendruck mit demKeyEvent.KEYCODE_BACK
.BTN_FORWARD
undBTN_EXTRA
: zugeordnet zuMotionEvent.BUTTON_FORWARD
. Das Drücken dieser Schaltfläche synthetisiert auch einen Tastendruck mit demKeyEvent.KEYCODE_FORWARD
.BTN_STYLUS
: zugeordnet zuMotionEvent.BUTTON_SECONDARY
.BTN_STYLUS2
: zugeordnet zuMotionEvent.BUTTON_TERTIARY
.
Werkzeuge und Werkzeugtypen
Ein Werkzeug ist ein Finger, Stift oder ein anderes Gerät, das verwendet wird, um mit dem Berührungsgerät zu interagieren. Einige Touch-Geräte können zwischen verschiedenen Arten von Werkzeugen unterscheiden.
An anderer Stelle in Android, wie in der MotionEvent
API, wird ein Tool oft als Zeiger bezeichnet.
Die folgenden Werkzeugtypen werden unterstützt:
BTN_TOOL_FINGER
undMT_TOOL_FINGER
: zugeordnet zuMotionEvent.TOOL_TYPE_FINGER
.BTN_TOOL_PEN
undMT_TOOL_PEN
: zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_RUBBER
: zugeordnet zuMotionEvent.TOOL_TYPE_ERASER
.BTN_TOOL_BRUSH
: zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_PENCIL
: zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_AIRBRUSH
: zugeordnet zuMotionEvent.TOOL_TYPE_STYLUS
.BTN_TOOL_MOUSE
: zugeordnet zuMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_LENS
: zugeordnet zuMotionEvent.TOOL_TYPE_MOUSE
.BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
undBTN_TOOL_QUADTAP
: zugeordnet zuMotionEvent.TOOL_TYPE_FINGER
.
Schwebende vs. berührende Werkzeuge
Werkzeuge können entweder mit dem Touch-Gerät in Kontakt sein oder sich in Reichweite befinden und darüber schweben. Nicht alle Touch-Geräte sind in der Lage, das Vorhandensein eines Werkzeugs zu erkennen, das über dem Touch-Gerät schwebt. Diejenigen, die dies tun, wie z. B. HF-basierte Eingabestift-Digitizer, können oft erkennen, wenn sich das Werkzeug innerhalb einer begrenzten Reichweite des Digitizers befindet.
Die InputReader
Komponente achtet darauf, berührende Werkzeuge von schwebenden Werkzeugen zu unterscheiden. Ebenso werden berührende Werkzeuge und schwebende Werkzeuge auf unterschiedliche Weise an Anwendungen gemeldet.
Berührende Werkzeuge werden Anwendungen als Berührungsereignisse mit MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
und MotionEvent.ACTION_POINTER_UP
.
Schwebende Werkzeuge werden Anwendungen als generische Bewegungsereignisse mit MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
und MotionEvent.ACTION_HOVER_EXIT
.
Berühren Sie Gerätetreiberanforderungen
Touch-Gerätetreiber sollten nur Achsen und Tastencodes für die Achsen und Tasten registrieren, die sie tatsächlich unterstützen. Das Registrieren überzähliger Achsen oder Schlüsselcodes kann den Geräteklassifizierungsalgorithmus verwirren oder dazu führen, dass das System die Fähigkeiten des Geräts falsch erkennt.
Wenn das Gerät beispielsweise den
BTN_TOUCH
meldet, geht das System davon aus, dassBTN_TOUCH
immer verwendet wird, um anzuzeigen, ob das Werkzeug tatsächlich den Bildschirm berührt. Daher sollteBTN_TOUCH
nicht verwendet werden, um anzuzeigen, dass sich das Werkzeug lediglich im Bereich 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 physischen Druck, der auf die Spitze des Werkzeugs ausgeübt wird, 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 physischen Druck, der auf die Spitze des Werkzeugs ausgeübt wird, 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. Diese Achse sollte nicht verwendet werden, wenn die Abmessungen des Werkzeugs selbst unbekannt sind.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 ganze Zahl, die verwendet wird, um jedes Tool unabhängig zu identifizieren und zu verfolgen, 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 bewegen.ABS_MT_SLOT
: (optional) Meldet die Steckplatz-ID des Tools, wenn das Linux-Multi-Touch-Protokoll 'B' verwendet wird. Weitere Einzelheiten finden Sie in der Dokumentation zum Linux-Multi-Touch-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 das Multi-Touch-Protokoll definiert sind, werden nur die Multi-Touch-Achsen verwendet und die Single-Touch-Achsen werden ignoriert.
Die Minimal- und Maximalwerte der
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
undABS_MT_POSITION_Y
Achsen definieren die Grenzen des aktiven Bereichs des Geräts in gerätespezifischen Flächeneinheiten. Bei einem Touchscreen beschreibt die aktive Fläche den Teil des Touchgeräts, der das Display tatsächlich 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 kann Berührungen außerhalb des gemeldeten aktiven Bereichs melden.
Berührungen, die außerhalb des aktiven Bereichs initiiert werden, werden nicht an Anwendungen ü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 Anwendungen übermittelt. Wenn folglich eine Berührung innerhalb der Grenzen einer Anwendung beginnt und sich dann aus dem aktiven Bereich herausbewegt, kann die Anwendung Berührungsereignisse mit Anzeigekoordinaten empfangen, die negativ sind oder außerhalb der Grenzen der Anzeige liegen. Dies ist das erwartete Verhalten.
Ein Berührungsgerät sollte niemals Berührungskoordinaten an die Grenzen des aktiven Bereichs klemmen. Wenn eine Berührung den aktiven Bereich verlässt, sollte sie als außerhalb des aktiven Bereichs liegend gemeldet werden, oder sie sollte überhaupt nicht gemeldet werden.
Wenn beispielsweise der Finger des Benutzers nahe der oberen linken Ecke des Berührungsbildschirms berührt, kann er eine Koordinate von (minX, minY) melden. Wenn sich der Finger weiter außerhalb des aktiven Bereichs bewegt, sollte der Touchscreen entweder beginnen, Koordinaten mit Komponenten kleiner als minX und minY zu melden, wie z. B. (minX – 2, minY – 3), oder er sollte ganz aufhören, die Berührung zu melden. Mit anderen Worten, der Touchscreen sollte nicht melden (minX, minY), wenn der Finger des Benutzers wirklich außerhalb des aktiven Bereichs berührt.
Das Festklemmen von Berührungskoordinaten an der Anzeigekante erzeugt eine künstliche harte Grenze um die Kante des Bildschirms herum, die das System daran hindert, Bewegungen, die in die Grenzen des Anzeigebereichs eintreten oder diese verlassen, reibungslos zu verfolgen.
Die von
ABS_PRESSURE
oderABS_MT_PRESSURE
gemeldeten Werte müssen, falls sie überhaupt gemeldet werden, nicht null sein, wenn das Werkzeug das Gerät berührt, und ansonsten null, um anzuzeigen, dass das Werkzeug schwebt.Das Melden von Druckinformationen ist optional , wird jedoch dringend empfohlen. Anwendungen 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 nicht null sein, wenn das Werkzeug das Gerät berührt, und ansonsten null, aber dies ist nicht erforderlich. Beispielsweise kann das Berührungsgerät in der Lage sein, die Größe von Fingerberührungskontakten zu messen, aber nicht von Stiftberührungskontakten.Informationen zur Berichtsgröße sind optional , werden jedoch dringend empfohlen. Anwendungen können Druckinformationen verwenden, um größenabhängige Zeichen- und andere Effekte zu implementieren.
Die von
ABS_DISTANCE
oderABS_MT_DISTANCE
gemeldeten Werte sollten sich Null nähern, wenn das Werkzeug das Gerät berührt. Der Abstand kann auch bei direktem Kontakt mit dem Werkzeug ungleich Null bleiben. Die genauen gemeldeten Werte hängen von der Art und Weise ab, in der die Hardware die Distanz misst.Das Melden von Entfernungsinformationen ist optional , wird jedoch für Eingabestiftgerä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 wird als Hinweis darauf genommen, dass das Werkzeug geneigt gehalten wird.Es wird davon ausgegangen, dass die Neigungswinkel entlang der X- und Y-Achse in Grad von der Senkrechten angegeben werden. Der Mittelpunkt (perfekt senkrecht) ist gegeben durch
(max + min) / 2
für jede Achse. Werte kleiner als der Mittelpunkt stehen für eine Neigung nach oben oder nach links, Werte größer als der Mittelpunkt für eine Neigung nach unten oder rechts.Der
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 dem kompatibel ist, was zur Beschreibung von Fingerberührungen verwendet wird.Das Melden von Neigungsinformationen ist optional , wird jedoch für Eingabestiftgeräte empfohlen.
Wenn der Werkzeugtyp von
ABS_MT_TOOL_TYPE
gemeldet wird, ersetzt er alle vonBTN_TOOL_*
gemeldeten Werkzeugtypinformationen. Wenn überhaupt keine Werkzeugtypinformationen verfügbar sind, wird der Werkzeugtyp standardmäßig aufMotionEvent.TOOL_TYPE_FINGER
.Ein Werkzeug wird basierend auf den folgenden Bedingungen als aktiv bestimmt:
Bei Verwendung des Single-Touch-Protokolls ist das Tool aktiv, wenn
BTN_TOUCH
oderBTN_TOOL_*
1 ist.Diese Bedingung impliziert, dass der
InputReader
zumindest einige Informationen über die Art des Werkzeugs haben muss, entweder ob es berührt, oder zumindest seinen Werkzeugtyp. Wenn keine Informationen verfügbar sind, wird angenommen, 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 letzten Synchronisierungsbericht erscheint. Wenn das Tool nicht mehr in Synchronisierungsberichten angezeigt wird, existiert es nicht mehr.
Bei Verwendung des Multi-Touch-Protokolls 'B' ist das Tool aktiv, solange es einen aktiven Steckplatz hat. Wenn der Steckplatz gelöscht wird, hört das Werkzeug auf zu existieren.
Ein Werkzeug wird basierend auf den folgenden Bedingungen als schwebend bestimmt:
Wenn das Werkzeug
BTN_TOOL_MOUSE
oderBTN_TOOL_LENS
ist, schwebt das Werkzeug nicht, selbst wenn eine der folgenden Bedingungen zutrifft.Wenn das Werkzeug aktiv ist und der Fahrer Druckinformationen meldet und der gemeldete Druck Null ist, dann schwebt das Werkzeug.
Wenn das Werkzeug aktiv ist und der Treiber den
BTN_TOUCH
BTN_TOUCH unterstützt undBTN_TOUCH
einen Wert von Null hat, dann schwebt das Werkzeug.
Der
InputReader
unterstützt sowohl das Multi-Touch-Protokoll 'A' als auch 'B'. Neue Treiber sollten das 'B'-Protokoll verwenden, aber beide funktionieren.Ab Android Ice Cream Sandwich 4.0 müssen Touchscreen-Treiber möglicherweise geändert werden, um der Linux-Eingabeprotokollspezifikation zu entsprechen.
Folgende Änderungen können erforderlich sein:
Wenn ein Tool inaktiv wird (Finger geht nach oben), sollte es in nachfolgenden Multi-Touch-Synchronisierungsberichten nicht mehr erscheinen. Wenn alle Tools inaktiv werden (alle Finger gehen nach oben), sollte der Treiber ein leeres Synchronisierungsberichtspaket 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 Versionen von Android 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ätetreiber benötigen keine Android-spezifischen Anpassungen mehr. Durch die Verwendung des Standard-Linux-Eingabeprotokolls kann Android eine größere Auswahl an Touch-Peripheriegeräten unterstützen, z. B. externe HID-Multitouch-Touchscreens, die unveränderte Treiber verwenden.
Tippen Sie auf Gerätebetrieb
Das Folgende ist eine kurze Zusammenfassung der Bedienung von Touch-Geräten auf Android.
Der
EventHub
liest Rohereignisse aus demevdev
-Treiber.Der
InputReader
die Rohereignisse und aktualisiert den internen Zustand über die Position und andere Merkmale jedes Werkzeugs. Es verfolgt auch Schaltflächenzustände.Wenn die BACK- oder FORWARD-Tasten gedrückt oder losgelassen wurden, benachrichtigt der
InputReader
denInputDispatcher
über das Tastenereignis.Der
InputReader
bestimmt, ob ein virtueller Tastendruck aufgetreten ist. Wenn dies der Fall ist, benachrichtigt er denInputDispatcher
über das Schlüsselereignis.Der
InputReader
bestimmt, ob die Berührung innerhalb der Grenzen der Anzeige initiiert wurde. Wenn dies der Fall ist, benachrichtigt er denInputDispatcher
über das Touch-Ereignis.Wenn es keine berührenden Werkzeuge, aber mindestens ein schwebendes Werkzeug gibt, benachrichtigt der
InputReader
denInputDispatcher
über das Hover-Ereignis.Wenn der Touch-Gerätetyp pointer ist, führt der
InputReader
eine Zeigergestenerkennung durch, bewegt den Zeiger und die Punkte entsprechend und benachrichtigt denInputDispatcher
über das Zeigerereignis.Der
InputDispatcher
verwendet dieWindowManagerPolicy
, um zu bestimmen, ob die Ereignisse abgesetzt und das Gerät geweckt werden sollen. Anschließend liefert derInputDispatcher
die Ereignisse an die entsprechenden Anwendungen.
Tippen Sie auf Gerätekonfiguration
Das Verhalten von Touch-Geräten wird durch die Achsen, Tasten, Eingabeeigenschaften, die Konfiguration des Eingabegeräts, die virtuelle Tastenbelegung und das Tastenlayout des Geräts bestimmt.
Weitere Einzelheiten 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 in gerätespezifischen Einheiten melden.
Beispielsweise messen viele Touch-Geräte die Berührungskontaktfläche anhand einer internen gerätespezifischen Skala, wie z. B. die Gesamtzahl der Sensorknoten, die durch die Berührung ausgelöst wurden. Dieser Rohgrößenwert wäre für Anwendungen nicht aussagekräftig, da sie die physische Größe und andere Eigenschaften der Sensorknoten des Berührungsgerä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 decodieren, umzuwandeln und in eine einfachere Standarddarstellung zu normalisieren, die Anwendungen verstehen können.
Dokumentationskonventionen
Zu Dokumentationszwecken verwenden wir die folgenden Konventionen, um die vom System während des Kalibrierungsprozesses verwendeten Werte zu beschreiben.
Rohachsenwerte
Die folgenden Ausdrücke bezeichnen die vom Touch-Gerätetreiber als EV_ABS
Ereignisse gemeldeten Rohwerte.
-
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 Achse
ABS_PRESSURE
oderABS_MT_PRESSURE
oder 0, falls nicht verfügbar. -
raw.touchMajor
- Der Wert der Achse
ABS_MT_TOUCH_MAJOR
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 Achse
ABS_MT_WIDTH_MINOR
oderraw.toolMajor
, falls nicht verfügbar. -
raw.orientation
- Der Wert der Achse
ABS_MT_ORIENTATION
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.
Rohachsenbereiche
Die folgenden Ausdrücke bezeichnen die Grenzen von Rohwerten. Sie werden durch Aufrufen 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, äquivalent zu
raw.x.range + 1
. -
raw.height
- Die inklusive Höhe des Berührungsbereichs, entspricht
raw.y.range + 1
.
Ausgangsbereiche
Die folgenden Ausdrücke bezeichnen die Eigenschaften des Ausgabekoordinatensystems. Das System verwendet eine lineare Interpolation, um Berührungspositionsinformationen von den Oberflächeneinheiten, die von dem Berührungsgerät verwendet werden, in die Ausgabeeinheiten zu übersetzen, die Anwendungen wie Anzeigepixeln gemeldet werden.
-
output.width
- Die Ausgabebreite. Bei Touchscreens (die einem Display zugeordnet sind) ist dies die Displaybreite in Pixel. Für 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 (die einem Display zugeordnet sind) ist dies die Displayhöhe in Pixel. Für Touchpads (die keinem Display zugeordnet sind) ist die Ausgabehöhe gleich
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 zusammen mit den Feldern beschrieben, die sie zum Kalibrieren verwenden.
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 einer Anzeige zugeordnet ist.Wenn der Wert
touchPad
ist, ist das Touchgerät ein Touchpad, das keiner Anzeige zugeordnet ist.Wenn der Wert
pointer
ist, ist das Touch-Gerät ein Touchpad, das keiner Anzeige zugeordnet ist, und seine Bewegungen werden für indirekte Multi-Touch-Zeigergesten verwendet.Wenn der Wert
default
ist, erkennt das System automatisch den Gerätetyp gemäß dem Klassifizierungsalgorithmus.
Weitere Informationen dazu, wie der Gerätetyp das Verhalten des Touch-Geräts beeinflusst, finden Sie im Abschnitt „ Klassifizierung “.
Vor Honeycomb wurde davon ausgegangen, dass alle Touch-Geräte Touchscreens sind.
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 Touchgerät gemeldeten Berührungspositionen immer dann gedreht, wenn sich die Ausrichtung der Anzeige ändert.Wenn der Wert
0
ist, sind die vom Touchgerät gemeldeten Berührungspositionen immun gegen Änderungen der Anzeigeausrichtung.
Der Standardwert ist 1
, wenn das Gerät ein Touchscreen ist, andernfalls 0
.
Das System unterscheidet zwischen internen und externen Touchscreens und Displays. Ein orientierungsbewusster interner Touchscreen wird basierend auf der Orientierung der internen Anzeige gedreht. Ein orientierungsbewusster externer Berührungsbildschirm wird basierend auf der Orientierung der externen Anzeige gedreht.
Orientierungsbewusstsein 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 so neu zugeordnet, dass eine Berührung in der oberen linken Ecke des absoluten Koordinatensystems des Touchscreens als Berührung in der oberen linken Ecke gemeldet wird Ecke des gedrehten Koordinatensystems des Displays. Dies geschieht, damit Berührungen mit demselben Koordinatensystem gemeldet werden, das Anwendungen verwenden, um ihre visuellen Elemente zu zeichnen.
Vor Honeycomb wurde davon ausgegangen, dass alle Touch-Geräte orientierungsbewusst sind.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
| default
Gibt den Präsentationsmodus für Zeigergesten an. Diese Konfigurationseigenschaft ist nur relevant, wenn das Touch-Gerät vom Typ pointer ist.
Wenn der Wert
pointer
ist, werden die Touchpad-Gesten über einen Cursor ähnlich einem Mauszeiger dargestellt.Wenn der Wert
spots
ist, werden die Touchpad-Gesten durch einen Anker dargestellt, der den Schwerpunkt der Geste darstellt, und durch einen Satz kreisförmiger Punkte, die die Position einzelner Finger darstellen.
Der Standardwert ist pointer
, wenn die INPUT_PROP_SEMI_MT
festgelegt ist, oder ansonsten spots
.
X
und Y
-Felder
Die Felder X und Y liefern Positionsinformationen für die Mitte des Kontaktbereichs.
Berechnung
Die Berechnung ist einfach: Positionsinformationen vom Touch-Treiber werden linear in das Ausgabekoordinatensystem interpoliert.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
TouchMajor
, TouchMinor
, ToolMajor
, Size
, ToolMinor
Die Felder TouchMajor
und TouchMinor
beschreiben die ungefähren Abmessungen des Kontaktbereichs in Ausgabeeinheiten (Pixel).
Die Felder ToolMajor
und ToolMinor
beschreiben die ungefähren Abmessungen des Werkzeugs selbst in Ausgabeeinheiten (Pixel).
Das Feld Size
beschreibt die normalisierte Größe der Berührung relativ zur größtmöglichen Berührung, die das Berührungsgerä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 (Sensorfläche ist gesättigt).
Wenn sowohl die ungefähre Länge als auch die Breite gemessen werden können, gibt das TouchMajor
-Feld die längere Abmessung und das TouchMinor
-Feld die kürzere Abmessung des Kontaktbereichs an. Wenn nur der ungefähre Durchmesser des Kontaktbereichs gemessen werden kann, sind die Felder TouchMajor
und TouchMinor
gleich.
Ebenso spezifiziert das ToolMajor
-Feld die längere Dimension und das ToolMinor
-Feld spezifiziert die kürzere Dimension der Querschnittsfläche des Werkzeugs.
Wenn die Berührungsgröße nicht verfügbar ist, aber die Werkzeuggröße verfügbar ist, wird die Werkzeuggröße gleich der Berührungsgröße gesetzt. Umgekehrt, wenn die Werkzeuggröße nicht verfügbar ist, aber die Berührungsgröße verfügbar ist, dann wird die Berührungsgröße gleich der Werkzeuggröße gesetzt.
Berührungsgeräte messen oder melden die Berührungsgröße und Werkzeuggröße auf verschiedene Weise. Die aktuelle Implementierung unterstützt drei verschiedene Arten von Messungen: Durchmesser, Fläche und geometrische Begrenzungsbox in Oberflächeneinheiten.
touch.size.calibration
Definition: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Gibt die Art der Messung an, die vom Berührungstreiber verwendet wird, um die Berührungsgröße und die 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, sodass sie auf dieselbe Weise skaliert wird.Wenn der Wert
diameter
ist, wird davon ausgegangen, dass die Größe proportional zum Durchmesser (Breite) der Berührung oder des Werkzeugs ist.Wenn der Wert
area
ist, 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 dieraw.touchMajor
oderraw.toolMajor
Achse verfügbar ist, andernfalls verwendet es dienone
-Kalibrierung.
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 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 vor der Verwendung durch die Anzahl der Kontakte 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, sodass sie eine Größenmessung melden, die ihre Gesamtfläche oder -breite darstellt. Diese Eigenschaft sollte nur für solche Geräte auf 1
gesetzt werden. Setzen Sie diesen Wert im Zweifelsfall auf 0
.
Berechnung
Die Berechnung der 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
Pressure
Das Feld Pressure
beschreibt den ungefähren physikalischen Druck, der auf das Touch-Gerät ausgeübt wird, als normalisierten Wert zwischen 0,0 (keine Berührung) und 1,0 (volle Kraft).
Ein Nulldruck zeigt an, dass das Werkzeug schwebt.
touch.pressure.calibration
Definition: touch.pressure.calibration
= none
| physical
| amplitude
| default
Gibt die Art der Messung an, die vom Berührungstreiber verwendet wird, um den Druck zu melden.
Wenn der Wert
none
ist, ist der Druck unbekannt, also wird er beim Berühren auf 1,0 und beim Schweben auf 0,0 gesetzt.Wenn der Wert
physical
ist, wird angenommen, dass die Druckachse die tatsächliche physikalische Intensität des auf das Berührungsfeld ausgeübten Drucks misst.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Calculation
The calculation of the Pressure
field depends on the specified calibration parameters.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Orientation
and Tilt
Fields
The Orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI
or PI
.
The Tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
If the value is
none
, the orientation is unknown so it is set to 0.If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calculation
The calculation of the Orientation
and Tilt
fields depends on the specified calibration parameters and available input.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
Distance
Field
The Distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Calculation
The calculation of the Distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Example
# 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 will 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
Compatibility Notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers may also need to be updated.
Virtual Key Map Files
Touch devices are often used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Syntax
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
The same virtual key map file can also be written on multiple lines.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
and height of 55
.
Example
Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect Multi-touch Pointer Gestures
In pointer mode, the system interprets the following gestures:
Single finger tap: click.
Single finger motion: move the pointer.
Single finger motion plus button presses: drag the pointer.
Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
Multiple finger motion: freeform gesture.
Palm rejection
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the edge of the display the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by TouchMajor
and TouchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =
max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1