Tastenlayoutdateien ( .kl
Dateien) ordnen Linux-Tastencodes und Achsencodes Android-Tastencodes und Achsencodes zu und geben zugehörige Richtlinienflags an. Gerätespezifische Tastenlayoutdateien sind:
- Erforderlich für interne (eingebaute) Eingabegeräte mit Tasten, einschließlich Sondertasten wie Lautstärke-, Ein-/Aus-Taste und Headset-Medientasten.
- Optional für andere Eingabegeräte, jedoch empfohlen für Spezialtastaturen und Joysticks.
Wenn keine gerätespezifische Tastenlayoutdatei verfügbar ist, wählt das System stattdessen einen Standard aus.
Standort
Schlüssellayoutdateien werden nach USB-Hersteller, Produkt- (und optional Versions-)ID oder nach Eingabegerätenamen lokalisiert. Die folgenden Pfade werden der Reihe nach konsultiert:
-
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/odm/usr/keylayout/DEVICE_NAME.kl
-
/vendor/usr/keylayout/DEVICE_NAME.kl
-
/system/usr/keylayout/DEVICE_NAME.kl
-
/data/system/devices/keylayout/DEVICE_NAME.kl
-
/odm/usr/keylayout/Generic.kl
-
/vendor/usr/keylayout/Generic.kl
-
/system/usr/keylayout/Generic.kl
-
/data/system/devices/keylayout/Generic.kl
Beim Erstellen eines Dateipfads, der den Gerätenamen enthält, werden alle Zeichen im Gerätenamen außer „0“ – „9“, „a“ – „z“, „A“ – „Z“, „-“ oder „_“ angezeigt. werden durch „_“ ersetzt.
Generische Tastenlayoutdatei
Das System stellt eine spezielle integrierte generische Tastenlayoutdatei namens Generic.kl
bereit. Dieses Tastenlayout soll eine Vielzahl standardmäßiger externer Tastaturen und Joysticks unterstützen. Ändern Sie nicht das allgemeine Tastenlayout!
Syntax
Eine Schlüssellayoutdatei ist eine reine Textdatei, die aus Schlüssel- oder Achsendeklarationen und Flags besteht.
Schlüsselerklärungen
Schlüsseldeklarationen bestehen aus dem Schlüsselwort key
, gefolgt von einer Linux-Schlüsselcodenummer und einem Android-Schlüsselcodenamen, oder aus der Schlüsselwortverwendung, gefolgt von einer HID-Verwendung und einem Android-Schlüsselcodenamen. Die HID-Nutzung wird als 32-Bit-Ganzzahl dargestellt, wobei die oberen 16 Bits die HID-Nutzungsseite und die niedrigen 16 Bits die HID-Nutzungs-ID darstellen. Auf jede Deklaration kann ein optionaler Satz von durch Leerzeichen getrennten Richtlinienflags folgen.
key 1 ESCAPE key 114 VOLUME_DOWN key 16 Q VIRTUAL key usage 0x0c006F BRIGHTNESS_UP
Die folgenden Richtlinienflags werden erkannt:
-
FUNCTION
: Die Taste sollte so interpretiert werden, als ob auch die FUNCTION-Taste gedrückt würde. -
GESTURE
: Die Taste, die durch eine Benutzergeste generiert wird, z. B. durch Handbewegung auf dem Touchscreen. -
VIRTUAL
: Die Taste ist ein virtueller Softkey (kapazitive Taste) neben dem Haupt-Touchscreen. Dadurch wird eine spezielle Entprellungslogik aktiviert (siehe unten).
Achsendeklarationen
Achsendeklarationen bestehen jeweils aus dem Schlüsselwort axis
, gefolgt von einer Linux-Achsencodenummer und Qualifizierern, die das Verhalten der Achse steuern, einschließlich mindestens einem Android-Achsencodenamen.
Grundlegende Achsen
Eine Basisachse ordnet einfach einen Linux-Achsencode einem Android-Achsencodenamen zu. Die folgende Deklaration ordnet ABS_X
(angezeigt durch 0x00
) auf AXIS_X
(angezeigt durch X
) zu.
axis 0x00 X
Wenn im obigen Beispiel der Wert von ABS_X
5
ist, wird AXIS_X
auf 5
gesetzt.
Geteilte Achsen
Eine geteilte Achse ordnet einen Linux-Achsencode zwei Android-Achsencodenamen zu, sodass Werte, die kleiner oder größer als ein Schwellenwert sind, bei der Zuordnung auf zwei verschiedene Achsen aufgeteilt werden. Diese Zuordnung ist nützlich, wenn eine einzelne vom Gerät gemeldete physische Achse zwei verschiedene, sich gegenseitig ausschließende logische Achsen codiert.
Die folgende Deklaration ordnet Werte der ABS_Y
Achse (angezeigt durch 0x01
) auf AXIS_GAS
zu, wenn sie kleiner als 0x7f
sind, oder auf AXIS_BRAKE
, wenn sie größer als 0x7f
sind.
axis 0x01 split 0x7f GAS BRAKE
Wenn im obigen Beispiel der Wert von ABS_Y
0x7d
ist, wird AXIS_GAS
auf 2
( 0x7f - 0x7d
) und AXIS_BRAKE
auf 0
gesetzt. Wenn umgekehrt der Wert von ABS_Y
0x83
ist, wird AXIS_GAS
auf 0
und AXIS_BRAKE
auf 4
( 0x83 - 0x7f
) gesetzt. Wenn schließlich der Wert von ABS_Y
dem Split-Wert von 0x7f
entspricht, werden sowohl AXIS_GAS
als auch AXIS_BRAKE
auf 0
gesetzt.
Invertierte Achsen
Eine invertierte Achse kehrt das Vorzeichen des Achsenwerts um. Die folgende Deklaration ordnet ABS_RZ
(angezeigt durch 0x05
) auf AXIS_BRAKE
(angezeigt durch BRAKE
) zu und invertiert die Ausgabe durch Negierung.
axis 0x05 invert BRAKE
Wenn im obigen Beispiel der Wert von ABS_RZ
2
ist, wird AXIS_BRAKE
auf -2
gesetzt.
Option mit flacher Mitte
Ein Joystick-Gerät kann aufgrund von Geräuschen Eingabeereignisse melden, auch wenn der Joystick nicht verwendet wird. Dieses Geräusch kommt normalerweise vom linken und/oder rechten Steuerknüppel und führt dazu, dass der Fahrer einen Positionswert nahe 0 meldet. Der Wert „Mitte flach“ gibt die Geräuschmenge an, die vom Controller im Ruhezustand zu erwarten ist.
Das Linux-Eingabeprotokoll bietet Eingabegerätetreibern die Möglichkeit, den Mittenflachwert von Joystick-Achsen anzugeben, aber nicht alle Treiber melden dies und einige von ihnen geben falsche Werte an. Um dieses Problem zu lösen, kann auf eine Achsendeklaration eine flat
Option folgen, die die Breite des Bereichs um die Mittelposition der Achse angibt, der als zentriert betrachtet werden soll.
Wenn ein Gerätetreiber beispielsweise Werte für AXIS_X
zwischen 0 und 100 meldet, wird 0 durch das Android-Eingabesystem auf -1 und 100 auf 1 abgebildet. Der Mittelpunkt des Bereichs liegt in den unskalierten Koordinaten bei 50 und in den skalierten Koordinaten bei 0. Wenn ein Pauschalwert gleich 10 ist, sollten die Entwickler davon ausgehen, dass jeder AXIS_X
Wert, der zwischen -0,1 und 0,1 (zwischen 40 und 60 in unskalierten Koordinaten) gemeldet wird, Rauschen ist, und die vom Joystick kommenden Werte als Null behandeln.
Hinweis : Während die Tastenlayoutdatei den Wert für den Treiberkoordinatenraum angibt, liegt der von android.view.InputDevice.MotionRange#getFlat() gemeldete Wert im Android-Koordinatenraum.
axis 0x03 Z flat 4096
Im obigen Beispiel ist der mittlere flache Wert auf 4096
eingestellt.
Kommentare
Kommentarzeilen beginnen mit # und werden bis zum Ende der Zeile fortgesetzt:
# A comment!
Leerzeilen werden ignoriert.
Beispiele
Tastatur
# This is an example of a key layout file for a keyboard. key 1 ESCAPE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0 key 12 MINUS key 13 EQUALS key 14 DEL # etc...
Systemkontrollen
# This is an example of a key layout file for basic system controls, # such as volume and power keys which are typically implemented as GPIO pins # the device decodes into key presses. key 114 VOLUME_DOWN key 115 VOLUME_UP key 116 POWER
Kapazitive Tasten
# This is an example of a key layout file for a touch device with capacitive buttons. key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
Mediensteuerung für Headset-Buchse
# This is an example of a key layout file for headset mounted media controls. # A typical headset jack interface might have special control wires or detect known # resistive loads as corresponding to media functions or volume controls. # This file assumes that the driver decodes these signals and reports media # controls as key presses. key 163 MEDIA_NEXT key 165 MEDIA_PREVIOUS key 226 HEADSETHOOK
Joystick
# This is an example of a key layout file for a joystick. # These are the buttons that the joystick supports, represented as keys. key 304 BUTTON_A key 305 BUTTON_B key 307 BUTTON_X key 308 BUTTON_Y key 310 BUTTON_L1 key 311 BUTTON_R1 key 314 BUTTON_SELECT key 315 BUTTON_START key 316 BUTTON_MODE key 317 BUTTON_THUMBL key 318 BUTTON_THUMBR # Left and right stick. # The reported value for flat is 128 in a range of -32767 to 32768, which is absurd. # This confuses applications that rely on the flat value because the joystick # actually settles in a flat range of +/- 4096 or so. We override it here. axis 0x00 X flat 4096 axis 0x01 Y flat 4096 axis 0x03 Z flat 4096 axis 0x04 RZ flat 4096 # Triggers. axis 0x02 LTRIGGER axis 0x05 RTRIGGER # Hat. axis 0x10 HAT_X axis 0x11 HAT_Y
Virtuelle Softkeys
Das Eingabesystem bietet spezielle Funktionen zur Implementierung virtueller Softkeys in folgenden Anwendungsfällen:
- Wenn die virtuellen Softkeys grafisch auf dem Bildschirm angezeigt werden (z. B. beim Galaxy Nexus), werden sie von der Navigationsleistenkomponente im System-UI-Paket implementiert. Da grafische virtuelle Softkeys auf einer hohen Ebene im System implementiert sind, sind Tastenlayoutdateien nicht beteiligt und die folgenden Informationen gelten nicht.
- Wenn die virtuellen Softkeys als erweiterter berührbarer Bereich implementiert sind, der Teil des Haupt-Touchscreens ist (z. B. beim Nexus One), verwendet das Eingabesystem eine virtuelle Tastenzuordnungsdatei, um X/Y-Berührungskoordinaten in Linux-Tastencodes zu übersetzen. Anschließend wird die Tastenlayoutdatei verwendet, um Linux-Tastencodes in Android-Tastencodes zu übersetzen (Einzelheiten zu virtuellen Tastenzuordnungsdateien finden Sie unter Touch-Geräte ). Die Tastenlayoutdatei für das Touchscreen-Eingabegerät muss die entsprechende Tastenzuordnung angeben und die
VIRTUAL
Flagge für jede Taste enthalten. - Wenn die virtuellen Softkeys als vom Haupt-Touchscreen getrennte kapazitive Tasten implementiert sind (z. B. beim Nexus S), ist der Kernel-Gerätetreiber oder die Firmware dafür verantwortlich, Berührungen in Linux-Tastencodes zu übersetzen, die das Eingabesystem dann in Android-Tastencodes übersetzt unter Verwendung der Tastenlayoutdatei. Die Tastenlayoutdatei für das kapazitive Tasteneingabegerät muss die entsprechende Tastenzuordnung angeben und die
VIRTUAL
Flagge für jede Taste enthalten.
Wenn sich virtuelle Softkeys innerhalb oder in unmittelbarer physischer Nähe des Touchscreens befinden, kann es für Benutzer leicht passieren, dass sie versehentlich eine Taste drücken, wenn sie den unteren Rand des Bildschirms berühren oder mit dem Finger von oben nach unten oder von unten nach unten gleiten. oben auf dem Bildschirm. Um dies zu verhindern, wendet das Eingabesystem eine kleine Entprellung an, sodass das Drücken virtueller Softkeys für einen kurzen Zeitraum nach der letzten Berührung des Touchscreens ignoriert wird (diese Verzögerung wird als Ruhezeit der virtuellen Taste bezeichnet).
So aktivieren Sie die Entprellung virtueller Softkeys:
- Stellen Sie eine Tastenlayoutdatei für den Touchscreen oder das kapazitive Tasteneingabegerät bereit, wobei für jede Taste das
VIRTUAL
Flag gesetzt ist.key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
- Legen Sie den Wert der Ruhezeit des virtuellen Schlüssels in einem Ressourcen-Overlay für die Framework-Ressource
config.xml
fest.<!-- Specifies the amount of time to disable virtual keys after the screen is touched to filter out accidental virtual key presses due to swiping gestures or taps near the edge of the display. May be 0 to disable the feature. It is recommended that this value be no more than 250 ms. This feature should be disabled for most devices. --> <integer name="config_virtualKeyQuietTimeMillis">250</integer>
Validierung
Sie sollten Ihre Tastenlayoutdateien mit dem Tool „Keymaps validieren“ validieren.