Pliki układu klawiszy (pliki .kl
) mapują kody klawiszy i osi Linuxa na kody klawiszy i osi Androida oraz określają powiązane flagi zasad.
Pliki układu klawiszy związane z poszczególnymi urządzeniami to:
- Wymagany w przypadku wewnętrznych (wbudowanych) urządzeń wejściowych z klawiszami, w tym klawiszy specjalnych, takich jak klawisze głośności, zasilania i sterowania multimediami w słuchawkach.
- Opcjonalny w przypadku innych urządzeń wejściowych, ale zalecany w przypadku klawiatur i joysticków do specjalnych zastosowań.
Jeśli nie ma pliku z układem klawiszy dla danego urządzenia, system wybierze domyślny.
Lokalizacja
Pliki układu klawiszy są zlokalizowane według identyfikatora dostawcy USB, identyfikatora produktu (i opcjonalnie wersji) lub nazwy urządzenia wejściowego. W kolejności sprawdzane są te ścieżki:
/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
Podczas tworzenia ścieżki pliku zawierającej nazwę urządzenia wszystkie znaki w nazwie urządzenia inne niż „0–9”, „a–z”, „A–Z”, „–” lub „_” są zastępowane przez „_”.
Plik z ogólnym układem klawiszy
System udostępnia specjalny wbudowany plik z generycznym układem klucza o nazwie Generic.kl
. Ten układ klawiszy jest przeznaczony do obsługi różnych standardowych klawiatur zewnętrznych i joysticków. Nie modyfikuj ogólnego układu klucza!
Składnia
Plik układu klucza to zwykły plik tekstowy zawierający deklaracje kluczy lub osi oraz flagi.
Deklaracje kluczy
Deklaracje kluczy składają się ze słowa kluczowego key
, a następnie numeru kodu klucza Linuxa i nazwy kodu klucza Androida lub użycia słowa kluczowego, a następnie użycia HID i nazwy kodu klucza Androida. Użycie HID jest reprezentowane jako 32-bitowa liczba całkowita, w której 16 bitów o większych wartościach reprezentuje stronę użycia HID, a 16 bitów o mniejszych wartościach reprezentuje identyfikator użycia HID. Po każdej deklaracji może następować opcjonalny zestaw flag zasad oddzielonych spacjami.
key 1 ESCAPE key 114 VOLUME_DOWN key 16 Q VIRTUAL key usage 0x0c006F BRIGHTNESS_UP
Rozpoznawane są te flagi zasad:
FUNCTION
: klawisz powinien być interpretowany tak, jak gdyby był też naciśnięty klawisz FUNKCJA.GESTURE
: klucz wygenerowany przez gest użytkownika, taki jak dotknięcie ekranu dotykowego dłonią.VIRTUAL
: przycisk jest wirtualnym przyciskiem dotykowym (przycisk pojemnościowy) obok głównego ekranu dotykowego. W efekcie włączona jest specjalna logika debouncingu (patrz poniżej).
Deklaracje osi
Deklaracje osi składają się ze słowa kluczowego axis
, a następnie numeru kodu osi Linuxa i kwalifikatorów, które kontrolują zachowanie osi, w tym co najmniej 1 nazwę kodu osi Androida.
Osie podstawowe
Podstawowa oś po prostu mapuje kod osi Linuxa na nazwę kodu osi Androida. Poniższa deklaracja mapuje ABS_X
(wskazany przez 0x00
) na AXIS_X
(wskazany przez X
).
axis 0x00 X
W powyższym przykładzie, jeśli wartość ABS_X
to 5
, to AXIS_X
ma wartość 5
.
Dzielenie osi
Osie podzielone mapują kod osi Linuxa na 2 nazwy kodu osi Androida, tak aby wartości poniżej lub powyżej progu były mapowane na 2 różne osie. Takie mapowanie jest przydatne, gdy pojedyncza fizyczna oś raportowana przez urządzenie koduje 2 różne, wzajemnie wykluczające się osie logiczne.
W deklaracji poniżej wartości osi ABS_Y
(oznaczone przez 0x01
) są mapowane na AXIS_GAS
, gdy są mniejsze niż 0x7f
, lub na AXIS_BRAKE
, gdy są większe niż 0x7f
.
axis 0x01 split 0x7f GAS BRAKE
W powyższym przykładzie, jeśli wartość ABS_Y
to 0x7d
, to AXIS_GAS
ma wartość 2
(0x7f - 0x7d
), a AXIS_BRAKE
ma wartość 0
. Jeśli natomiast wartość ABS_Y
to 0x83
, to AXIS_GAS
ma wartość 0
, a AXIS_BRAKE
– wartość 4
(0x83 - 0x7f
). Jeśli natomiast wartość ABS_Y
jest równa wartości podziału 0x7f
, to zarówno AXIS_GAS
, jak i AXIS_BRAKE
mają wartość 0
.
odwrócone osie,
Odwrócona oś odwraca znak wartości osi. Poniższa deklaracja mapuje wartość ABS_RZ
(oznaczoną jako 0x05
) na wartość AXIS_BRAKE
(oznaczoną jako BRAKE
), a następnie odwraca wynik, negując go.
axis 0x05 invert BRAKE
W powyższym przykładzie, jeśli wartość ABS_RZ
to 2
, to AXIS_BRAKE
ma wartość -2
.
Opcja wyśrodkowania
Urządzenie sterujące może zgłaszać zdarzenia wejścia nawet wtedy, gdy nie jest używane, z powodu hałasu. Ten szum pochodzi zwykle z lewego lub prawego drążka i powoduje, że sterownik raportuje wartość pozycji zbliżoną do 0. Wartość „center flat” określa poziom szumu, jaki można się spodziewać w przypadku spoczynku kontrolera.
Protokół wejściowy Linuxa umożliwia sterownikom urządzeń wejściowych określenie wartości środkowej osi drążka, ale nie wszystkie sterowniki to robią, a niektóre z nich podają nieprawidłowe wartości. Aby rozwiązać ten problem, po deklaracji osi może wystąpić opcja flat
, która określa szerokość regionu wokół środkowej pozycji osi, która powinna być traktowana jako wyśrodkowana.
Jeśli na przykład sterownik urządzenia podaje wartości AXIS_X
w zakresie od 0 do 100, system wejściowy Androida mapuje 0 na -1, a 100 na 1.
Środek zakresu będzie wynosił 50 w nieskalowanych współrzędnych i 0 w skalowanych współrzędnych.
Jeśli wartość płaska jest równa 10, deweloperzy powinni założyć, że każda wartość AXIS_X
mieści się w zakresie od -0,1 do 0,1 (od 40 do 60 w nieprzeskalowanych współrzędnych) jest szumem, i traktować te wartości pochodzące z joysticka jako zero.
Uwaga: plik układu klawiszy określa wartość dla przestrzeni współrzędnych sterownika, ale wartość zwracana przez android.view.InputDevice.MotionRange#getFlat() jest w przestrzeni współrzędnych Androida.
axis 0x03 Z flat 4096
W powyższym przykładzie wartość środkowej płaszczyzny jest ustawiona na 4096
.
Komentarze
Wiersze komentarzy zaczynają się od # i trwają do końca wiersza:
# A comment!
Puste wiersze są ignorowane.
Przykłady
Klawiatura
# 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...
Systemowe elementy sterujące
# 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
Przyciski pojemnościowe
# 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
Sterowanie multimediami za pomocą gniazda słuchawek
# 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
Wirtualne klawisze
System wprowadzania danych udostępnia specjalne funkcje do implementowania wirtualnych przycisków w tych zastosowaniach:
- Jeśli wirtualne przyciski ekranowe są wyświetlane graficznie na ekranie (np. w przypadku Galaxy Nexus), są one implementowane przez komponent paska nawigacyjnego w pakiecie interfejsu System UI. Ponieważ wirtualne klawisze graficzne są implementowane na wysokim poziomie w systemie, nie są one powiązane z plikami układu klawiszy, więc te informacje nie mają zastosowania.
- Jeśli wirtualne przyciski są implementowane jako rozszerzony obszar dotykowy, który jest częścią głównego ekranu dotykowego (np. na Nexusie One), system wejściowy używa pliku mapy wirtualnych klawiszy do przekształcania współrzędnych X/Y w kody klawiszy Linuxa, a następnie używa pliku rozkładu klawiszy, aby przekształcać kody klawiszy Linuxa w kody klawiszy Androida (szczegółowe informacje o plikach mapy wirtualnych klawiszy znajdziesz w artykule Urządzenia dotykowe). Plik z rozkładem klawiszy dla urządzenia z ekranem dotykowym musi określać odpowiednie mapowanie klawiszy i zawierać flagę
VIRTUAL
dla każdego klawisza. - Jeśli wirtualne klawisze są implementowane jako przyciski pojemnościowe oddzielne od głównego ekranu dotykowego (jak w Nexusie S), sterownik urządzenia jądra lub oprogramowanie układowe odpowiada za przekształcanie dotyku w kody klawiszy Linuxa, które system wejściowy przekształca następnie w kody klawiszy Androida za pomocą pliku układu klawiszy.
Plik układu klawiszy dla urządzenia z przyciskami pojemnościowymi musi określać odpowiednie mapowanie klawiszy i zawierać flagę
VIRTUAL
dla każdego klawisza.
Gdy wirtualne przyciski znajdują się na ekranie dotykowym lub w jego bezpośrednim sąsiedztwie, użytkownicy mogą przypadkowo nacisnąć przycisk, gdy dotkną ekranu w pobliżu dołu lub przesuną po nim palcem od góry do dołu bądź odwrotnie. Aby temu zapobiec, system wejściowy stosuje niewielkie odszumianie, dzięki któremu naciśnięcia wirtualnych przycisków są ignorowane przez krótki czas po ostatnim dotknięciu ekranu dotykowego (to opóźnienie nazywa się czasem bezczynności wirtualnego przycisku).
Aby włączyć debouncing wirtualnego przycisku:
- Prześlij plik z rozkładem klawiszy dla ekranu dotykowego lub urządzenia wejściowego z przyciskami pojemnościowymi z flagą
VIRTUAL
ustawioną dla każdego klawisza.key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
- Ustaw wartość klucza wirtualnego „quiet time” w nakładce zasobu dla zasobu framework
config.xml
.<!-- 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>
Weryfikacja
Plik układu klawiszy należy zweryfikować za pomocą narzędzia Sprawdzanie map klawiszy.