Schlüssellayoutdateien

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:

  1. 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.
  2. 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.
  3. 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:

  1. 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
    
  2. 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.