In Schlüssellayoutdateien (.kl
-Dateien) werden Linux-Tasten- und -Achsencodes in Android-Tasten- und -Achsencodes umgewandelt und zugehörige Richtlinien-Flags angegeben.
Gerätespezifische Dateien für das Tastenlayout:
- Erforderlich für interne (eingebaute) Eingabegeräte mit Tasten, einschließlich spezieller Tasten wie Lautstärke, Ein/Aus und Medientasten für Headsets.
- Optional für andere Eingabegeräte, aber empfohlen für Tastaturen und Joysticks mit spezieller Verwendung.
Wenn keine gerätespezifische Tastenlayoutdatei verfügbar ist, wählt das System stattdessen einen Standard aus.
Standort
Dateien mit Tastaturlayouts werden anhand der ID des USB-Herstellers, des Produkts (und optional der Version) oder des Namens des Eingabegeräts gefunden. Die folgenden Pfade werden in der Reihenfolge abgefragt:
/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 mit Ausnahme von „0“ bis „9“, „a“ bis „z“, „A“ bis „Z“, „-“ oder „_“ durch „_“ ersetzt.
Datei mit generischen Tastenlayouts
Das System bietet eine spezielle integrierte Datei mit einem generischen Tastenlayout namens Generic.kl
. Dieses Tastenlayout ist für eine Vielzahl von standardmäßigen externen Tastaturen und Joysticks vorgesehen. Ändern Sie das Layout des generischen Schlüssels nicht.
Syntax
Eine Schlüssellayoutdatei ist eine Nur-Textdatei mit Schlüssel- oder Achsendeklarationen und Flags.
Wichtige Erklärungen
Schlüsseldeklarationen bestehen aus dem Keyword key
, gefolgt von einer Linux-Schlüsselcodenummer und dem Namen des Android-Schlüsselcodes oder dem Keyword „Nutzung“, gefolgt von einer HID-Nutzung und dem Namen des Android-Schlüsselcodes. Die HID-Nutzung wird als 32-Bit-Ganzzahl dargestellt, wobei die oberen 16 Bit die HID-Nutzungsseite und die unteren 16 Bit die HID-Nutzungs-ID repräsentieren. Auf jede Erklärung kann optional eine Reihe von durch Leerzeichen getrennten Richtlinien-Flags folgen.
key 1 ESCAPE key 114 VOLUME_DOWN key 16 Q VIRTUAL key usage 0x0c006F BRIGHTNESS_UP
Die folgenden Richtlinien-Flags werden erkannt:
FUNCTION
: Der Schlüssel sollte so interpretiert werden, als wäre auch die FUNCTION-Taste gedrückt.GESTURE
: Der Schlüssel, der durch eine Nutzergeste generiert wird, z. B. durch Berühren des Touchscreens mit der Handfläche.VIRTUAL
: Der Schlüssel ist eine virtuelle Softkey-Schaltfläche (kapazitive Schaltfläche) neben dem Haupt-Touchscreen. Dadurch wird eine spezielle Entprelllogik aktiviert (siehe unten).
Achsendeklarationen
Achsendeklarationen bestehen aus dem Schlüsselwort axis
gefolgt von einer Linux-Achsencodenummer und Qualifiern, die das Verhalten der Achse steuern, einschließlich mindestens eines Android-Achsencodenamens.
Grundlegende Achsen
Bei einer einfachen Achse wird einfach ein Linux-Achsencode einem Android-Achsencode zugeordnet. In der folgenden Deklaration wird ABS_X
(0x00
) zu AXIS_X
(X
) zugeordnet.
axis 0x00 X
Wenn der Wert von ABS_X
im obigen Beispiel 5
ist, wird AXIS_X
auf 5
gesetzt.
Achsen teilen
Bei einer geteilten Achse wird ein Linux-Achsencode zwei Android-Achsencodenamen zugeordnet, sodass Werte, die unter oder über einem Grenzwert liegen, 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.
In der folgenden Deklaration werden Werte der ABS_Y
-Achse (0x01
) AXIS_GAS
zugeordnet, wenn sie kleiner als 0x7f
sind, und AXIS_BRAKE
, wenn sie größer als 0x7f
sind.
axis 0x01 split 0x7f GAS BRAKE
Wenn der Wert von ABS_Y
im obigen Beispiel 0x7d
ist, wird AXIS_GAS
auf 2
(0x7f - 0x7d
) und AXIS_BRAKE
auf 0
gesetzt. Wenn der Wert von ABS_Y
dagegen 0x83
ist, wird AXIS_GAS
auf 0
und AXIS_BRAKE
auf 4
(0x83 - 0x7f
) gesetzt. Wenn der Wert von ABS_Y
dem Split-Wert von 0x7f
entspricht, werden sowohl AXIS_GAS
als auch AXIS_BRAKE
auf 0
gesetzt.
Umgekehrte Achsen
Bei einer umgekehrten Achse wird das Vorzeichen des Achsenwerts umgekehrt. In der folgenden Deklaration wird ABS_RZ
(0x05
) zu AXIS_BRAKE
(BRAKE
) zugeordnet und die Ausgabe durch Negieren umgekehrt.
axis 0x05 invert BRAKE
Wenn der Wert von ABS_RZ
im obigen Beispiel 2
ist, wird AXIS_BRAKE
auf -2
gesetzt.
Option „Zentrieren“
Ein Joystick kann aufgrund von Störungen Eingabeereignisse melden, auch wenn er nicht verwendet wird. Dieser Fehler stammt in der Regel vom linken und/oder rechten Stick und führt dazu, dass der Treiber einen Positionswert nahe 0 meldet. Der Wert „center flat“ gibt die Geräuschentwicklung des Controllers im Ruhezustand an.
Das Linux-Eingabeprotokoll bietet eine Möglichkeit für Eingabegerätetreiber, den Mittelwert der Joystickachsen anzugeben. Allerdings geben nicht alle Treiber diesen Wert an und einige liefern falsche Werte. Um dieses Problem zu beheben, kann einer Achsendeklaration eine flat
-Option folgen, mit der die Breite des Bereichs um die Mittelposition der Achse angegeben wird, der als zentriert betrachtet werden soll.
Wenn ein Gerätetreiber beispielsweise Werte für AXIS_X
zwischen 0 und 100 meldet, wird 0 vom Android-Eingabesystem auf -1 und 100 auf 1 zugeordnet.
Der Mittelpunkt des Bereichs ist in den nicht skalierten Koordinaten 50 und in den skalierten Koordinaten 0.
Wenn ein Wert für „flat“ gleich 10 ist, sollten die Entwickler davon ausgehen, dass alle AXIS_X
-Werte zwischen -0,1 und 0,1 (zwischen 40 und 60 in nicht skalierten Koordinaten) als Rauschen zu betrachten sind und diese Werte vom Joystick als Null behandelt werden.
Hinweis: In der Schlüssellayoutdatei wird der Wert für den Fahrerkoordinatenraum angegeben. Der von android.view.InputDevice.MotionRange#getFlat() gemeldete Wert ist jedoch im Android-Koordinatenraum.
axis 0x03 Z flat 4096
Im obigen Beispiel ist der Wert für die Mitte flach auf 4096
festgelegt.
Kommentare
Kommentarzeilen beginnen mit # und gehen bis zum Ende der Zeile:
# A comment!
Leere Zeilen 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...
Systemsteuerelemente
# 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 über den Headsetanschluss
# 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 für die Implementierung virtueller Softkeys in den folgenden Anwendungsfällen:
- Wenn die virtuellen Softkeys grafisch auf dem Display angezeigt werden (z. B. auf dem Galaxy Nexus), werden sie über die Navigationsleiste im System-UI-Paket implementiert. Da virtuelle Touchbedienungen auf einer hohen Schicht im System implementiert sind, kommen keine Tastenlayoutdateien zum Einsatz und die folgenden Informationen gelten nicht.
- Wenn die virtuellen Softkeys als erweiterte berührbare Region implementiert sind, die Teil des Haupt-Touchscreens ist (z. B. auf dem Nexus One), verwendet das Eingabesystem eine Datei mit einer virtuellen Tastenbelegung, um X/Y-Touch-Koordinaten in Linux-Tastencodes umzuwandeln, und dann die Datei mit dem Tastenlayout, um Linux-Tastencodes in Android-Tastencodes umzuwandeln. Weitere Informationen zu Dateien mit einer virtuellen Tastenbelegung finden Sie unter Touchbedienung. Die Datei mit dem Tastenlayout für das Eingabegerät mit Touchscreen muss die entsprechende Tastenzuordnung angeben und das Flag
VIRTUAL
für jede Taste enthalten. - Wenn die virtuellen Softkeys als kapazitive Tasten implementiert sind, die vom Haupt-Touchscreen getrennt sind (z. B. auf dem Nexus S), ist der Kernel-Gerätetreiber oder die Firmware für die Umwandlung von Berührungen in Linux-Tastencodes verantwortlich, die dann vom Eingabesystem mithilfe der Tastenlayoutdatei in Android-Tastencodes umgewandelt werden.
Die Tastenlayoutdatei für das Eingabegerät mit kapazitiven Tasten muss die entsprechende Tastenzuordnung angeben und das Flag
VIRTUAL
für jede Taste enthalten.
Wenn sich virtuelle Softkeys auf dem Touchscreen oder in unmittelbarer Nähe befinden, können Nutzer leicht versehentlich eine Taste drücken, wenn sie den Touchscreen unten berühren oder den Finger von oben nach unten oder von unten nach oben darüber bewegen. Um dies zu verhindern, wendet das Eingabesystem eine kleine Entprellung an, sodass Tastendrücke auf virtuelle Softkeys nach der letzten Berührung des Touchscreens für einen kurzen Zeitraum ignoriert werden. Diese Verzögerung wird als Ruhezeit der virtuellen Taste bezeichnet.
So aktivieren Sie die Debounce-Funktion für virtuelle Softkeys:
- Geben Sie eine Tastenlayoutdatei für das Touchscreen- oder kapazitive Eingabegerät an, wobei für jede Taste das Flag
VIRTUAL
festgelegt 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>
Zertifizierungsstufe
Sie sollten Ihre Tastenlayoutdateien mit dem Tool Validate Keymaps validieren.