Pliki układu klawiszy (pliki .kl
) mapują kody klawiszy i kody osi systemu Linux na kody klawiszy i kody osi systemu Android oraz określają powiązane flagi zasad. Pliki układu klawiszy specyficzne dla urządzenia to:
- Wymagane w przypadku wewnętrznych (wbudowanych) urządzeń wejściowych z klawiszami, w tym klawiszami specjalnymi, takimi jak klawisze głośności, zasilania i klawisze multimedialne zestawu słuchawkowego.
- Opcjonalne dla innych urządzeń wejściowych, ale zalecane dla klawiatur i joysticków specjalnego przeznaczenia.
Jeśli nie jest dostępny żaden plik układu klawiszy specyficzny dla urządzenia, system wybiera zamiast tego plik domyślny.
Lokalizacja
Pliki kluczowych układów są lokalizowane według dostawcy USB, identyfikatora produktu (i opcjonalnie wersji) lub nazwy urządzenia wejściowego. W kolejności sprawdzane są następujące ś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 konstruowania ścieżki pliku zawierającej nazwę urządzenia wszystkie znaki nazwy urządzenia inne niż „0”-„9”, „a”-„z”, „A”-„Z”, „-” lub „_” są zastępowane przez „_”.
Ogólny plik układu klucza
System udostępnia specjalny, wbudowany plik ogólnego układu klawiszy o nazwie Generic.kl
. Ten układ klawiszy jest przeznaczony do obsługi różnych standardowych zewnętrznych klawiatur i joysticków. Nie modyfikuj ogólnego układu klawiszy!
Składnia
Plik układu klucza to zwykły plik tekstowy składający się z deklaracji klucza lub osi i flag.
Kluczowe deklaracje
Deklaracje kluczy składają się ze key
kluczowego, po którym następuje numer kodowy klucza systemu Linux i nazwa kodowa klucza systemu Android, lub użycie słowa kluczowego, po którym następuje użycie HID i nazwa kodowa klucza systemu Android. Użycie HID jest reprezentowane jako 32-bitowa liczba całkowita, gdzie górne 16 bitów reprezentuje stronę użycia HID, a dolne 16 bitów reprezentuje identyfikator użycia HID. Po każdej deklaracji może nastąpić opcjonalny zestaw flag zasad rozdzielanych spacjami.
key 1 ESCAPE key 114 VOLUME_DOWN key 16 Q VIRTUAL key usage 0x0c006F BRIGHTNESS_UP
Rozpoznawane są następujące flagi zasad:
-
FUNCTION
: Klawisz należy interpretować tak, jakby naciśnięto także klawisz FUNKCJA. -
GESTURE
: Klawisz generowany przez gest użytkownika, taki jak dotknięcie ekranu dotykowego dłonią. -
VIRTUAL
: Klawisz to wirtualny klawisz programowy (przycisk pojemnościowy) znajdujący się obok głównego ekranu dotykowego. Powoduje to włączenie specjalnej logiki odrzucania (patrz poniżej).
Deklaracje osi
Każda deklaracja osi składa się ze słowa kluczowego axis
, po którym następuje numer kodu osi systemu Linux i kwalifikatory kontrolujące zachowanie osi, w tym co najmniej jedną nazwę kodową osi systemu Android.
Podstawowe osie
Oś podstawowa po prostu odwzorowuje kod osi systemu Linux na nazwę kodową osi systemu Android. Następująca deklaracja odwzorowuje ABS_X
(wskazywany przez 0x00
) na AXIS_X
(wskazywany przez X
).
axis 0x00 X
W powyższym przykładzie, jeśli wartość ABS_X
wynosi 5
, wówczas AXIS_X
jest ustawiona na 5
.
Podziel osie
Podzielona oś odwzorowuje kod osi systemu Linux na dwie nazwy kodowe osi systemu Android, tak że wartości mniejsze lub większe od progu są podczas mapowania dzielone na dwie różne osie. To mapowanie jest przydatne, gdy pojedyncza oś fizyczna zgłaszana przez urządzenie koduje dwie różne, wzajemnie wykluczające się osie logiczne.
Poniższa deklaracja odwzorowuje wartości osi ABS_Y
(wskazywane przez 0x01
) 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
wynosi 0x7d
, wówczas AXIS_GAS
jest ustawione na 2
( 0x7f - 0x7d
), a AXIS_BRAKE
jest ustawione na 0
. I odwrotnie, jeśli wartość ABS_Y
wynosi 0x83
, wówczas AXIS_GAS
jest ustawione na 0
, a AXIS_BRAKE
jest ustawione na 4
( 0x83 - 0x7f
). Wreszcie, jeśli wartość ABS_Y
jest równa wartości podzielonej 0x7f
wówczas zarówno AXIS_GAS
, jak i AXIS_BRAKE
są ustawione na 0
.
Odwrócone osie
Odwrócona oś odwraca znak wartości osi. Następująca deklaracja odwzorowuje ABS_RZ
(wskazywany przez 0x05
) na AXIS_BRAKE
(wskazywany przez BRAKE
) i odwraca wynik poprzez jego negację.
axis 0x05 invert BRAKE
W powyższym przykładzie, jeśli wartość ABS_RZ
wynosi 2
, wówczas AXIS_BRAKE
jest ustawiona na -2
.
Opcja mieszkania środkowego
Urządzenie typu joystick może raportować zdarzenia wejściowe nawet wtedy, gdy joystick nie jest używany ze względu na hałas. Hałas ten zazwyczaj pochodzi z lewego i/lub prawego drążka i powoduje, że sterownik zgłasza wartość pozycji bliską 0. Wartość „środkowe mieszkanie” określa ilość szumu, jakiego można się spodziewać po kontrolerze w stanie spoczynku.
Protokół wejściowy systemu Linux umożliwia sterownikom urządzeń wejściowych określenie środkowej płaskiej wartości osi joysticka, ale nie wszystkie sterowniki to zgłaszają, a niektóre z nich podają nieprawidłowe wartości. Aby rozwiązać ten problem, po deklaracji osi można zastosować opcję flat
, która określa szerokość obszaru wokół środkowej pozycji osi, którą należy uznać za wyśrodkowaną.
Na przykład, jeśli sterownik urządzenia zgłasza wartości dla AXIS_X
z zakresu od 0 do 100, wówczas 0 zostanie odwzorowane na -1, a 100 zostanie odwzorowane na 1 przez system wejściowy Android. Środek zakresu będzie wynosił 50 we współrzędnych nieskalowanych i 0 we współrzędnych skalowanych. Jeśli wartość płaska jest równa 10, programiści powinni założyć, że każda wartość AXIS_X
zgłoszona w przedziale od -0,1 do 0,1 (od 40 do 60 we współrzędnych nieskalowanych) jest szumem i traktować te wartości pochodzące z joysticka jako zero.
Uwaga : podczas gdy plik układu klawiszy określa wartość przestrzeni współrzędnych sterownika, wartość zgłaszana przez funkcję android.view.InputDevice.MotionRange#getFlat() znajduje się w przestrzeni współrzędnych systemu Android.
axis 0x03 Z flat 4096
W powyższym przykładzie wartość środkowej płaszczyzny jest ustawiona na 4096
.
Uwagi
Linie komentarza zaczynają się od # i trwają do końca linii:
# A comment!
Puste linie 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...
Sterowanie systemem
# 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 w gnieździe słuchawkowym
# 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
Drążek sterowy
# 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 programowe
System wejściowy zapewnia specjalne funkcje do wdrażania wirtualnych klawiszy programowalnych w następujących przypadkach użycia:
- Jeśli wirtualne klawisze programowe są wyświetlane graficznie na ekranie (np. w Galaxy Nexusie), są one implementowane przez komponent paska nawigacji w pakiecie System UI. Ponieważ graficzne wirtualne klawisze programowe są zaimplementowane w wyższym warstwie systemu, pliki układu klawiszy nie są zaangażowane i poniższe informacje nie mają zastosowania.
- Jeśli wirtualne klawisze programowe są zaimplementowane jako rozszerzony obszar dotykowy będący częścią głównego ekranu dotykowego (np. w Nexusie One), system wejściowy wykorzystuje plik mapy wirtualnych klawiszy do translacji współrzędnych dotykowych X/Y na kody klawiszy systemu Linux, następnie używa pliku układu klawiszy do przetłumaczenia kodów klawiszy systemu Linux na kody klawiszy systemu Android (więcej informacji na temat plików wirtualnych map klawiszy można znaleźć w artykule Urządzenia dotykowe ). Plik układu klawiszy dla urządzenia wejściowego z ekranem dotykowym musi określać odpowiednie mapowanie klawiszy i zawierać flagę
VIRTUAL
dla każdego klawisza. - Jeśli wirtualne klawisze programowe są zaimplementowane jako przyciski pojemnościowe oddzielne od głównego ekranu dotykowego (np. w Nexusie S), sterownik urządzenia jądra lub oprogramowanie sprzętowe jest odpowiedzialne za tłumaczenie dotknięć na kody klawiszy systemu Linux, które następnie system wejściowy tłumaczy na kody klawiszy Androida za pomocą pliku układu klucza. Plik układu klawiszy dla urządzenia wejściowego z przyciskiem pojemnościowym musi określać odpowiednie mapowanie klawiszy i zawierać flagę
VIRTUAL
dla każdego klawisza.
Gdy wirtualne klawisze programowe znajdują się na ekranie dotykowym lub w jego bliskiej odległości, użytkownicy mogą łatwo przypadkowo nacisnąć przycisk podczas dotykania dolnej części ekranu lub podczas przesuwania palca z góry na dół lub z dołu do u góry ekranu. Aby temu zapobiec, system wejściowy stosuje lekkie tłumienie, w wyniku czego naciśnięcia wirtualnych klawiszy programowych są ignorowane przez krótki okres czasu po ostatnim dotknięciu ekranu dotykowego (opóźnienie to nazywane jest czasem wyciszenia klawiszy wirtualnych ).
Aby włączyć odrzucanie wirtualnego klawisza programowego:
- Podaj plik układu klawiszy dla ekranu dotykowego lub urządzenia wejściowego z przyciskiem pojemnościowym z ustawioną flagą
VIRTUAL
dla każdego klawisza.key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
- Ustaw wartość czasu cichego klucza wirtualnego w nakładce zasobów dla zasobu
config.xml
platformy.<!-- 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>
Walidacja
Powinieneś sprawdzić pliki układu klawiszy za pomocą narzędzia Sprawdź poprawność map klawiszy .