Pliki mapy klawiszy (.kcm
) odpowiadają za kombinacje mapowania
kodów klawiszy dla Androida z modyfikatorami do znaków Unicode.
Pliki układu kluczy zależne od urządzenia są wymagane dla wszystkich wewnętrznych (wbudowanych) urządzeń wejściowych z klawiszami, jeśli tylko po to, by poinformować system, że urządzenie jest tylko do celów specjalnych (nie jest pełna klawiatura).
pliki układu klawiszy dotyczące urządzenia są opcjonalne w przypadku klawiatur zewnętrznych; często są w ogóle niepotrzebne. System zapewnia ogólną mapę kluczowych znaków która sprawdza się w przypadku wielu klawiatur zewnętrznych.
Jeśli nie jest dostępny żaden plik układu kluczy dla danego urządzenia, system wybierz domyślny.
Lokalizacja
Pliki mapy znaków kluczy są wskazywane przez dostawcę urządzeń USB, usługę (i opcjonalnie wersję) identyfikatora lub nazwy urządzenia wejściowego.
Podane niżej ścieżki są brane pod uwagę w odpowiedniej kolejności.
/odm/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/vendor/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/data/system/devices/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/odm/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
/vendor/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
/system/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
/data/system/devices/keychars/Vendor_XXXX_Product_XXXX.kcm
/odm/usr/keychars/DEVICE_NAME.kcm
/vendor/usr/keychars/DEVICE_NAME.kcm
/system/usr/keychars/DEVICE_NAME.kcm
/data/system/devices/keychars/DEVICE_NAME.kcm
/odm/usr/keychars/Generic.kcm
/vendor/usr/keychars/Generic.kcm
/system/usr/keychars/Generic.kcm
/data/system/devices/keychars/Generic.kcm
/odm/usr/keychars/Virtual.kcm
/vendor/usr/keychars/Virtual.kcm
/system/usr/keychars/Virtual.kcm
/data/system/devices/keychars/Virtual.kcm
Przy tworzeniu ścieżki pliku zawierającej nazwę urządzenia wszystkie znaki w nazwie urządzenia innej niż „0”–9, „a”–„z”, „A”–„Z” i „-” lub „_” są zastąpione znakiem „_”.
Ogólny plik mapy znaków kluczy
System udostępnia specjalny, wbudowany plik mapy znaków klucza o nazwie Generic.kcm
.
Ta mapa klawiszy obsługuje różne standardowe
klawiatury.
Nie modyfikuj ogólnej mapy znaków klucza.
Plik mapy znaków klucza wirtualnego
System udostępnia specjalny, wbudowany plik mapy znaków klucza o nazwie Virtual.kcm
.
wykorzystywanych przez klawiatury wirtualne.
Klawiatura wirtualna jest syntetycznym urządzeniem wejściowym, którego identyfikator to -1.
(patrz KeyCharacterMap.VIRTUAL_KEYBOARD
). Jest on dostępny na wszystkich urządzeniach z Androidem.
zaczynając od Androida Honeycomb 3.0. Przeznaczenie klawiatury wirtualnej
jest udostępnienie znanego wbudowanego urządzenia wejściowego, które może być używane do wstrzykiwania
naciskania klawiszy w aplikacjach za pomocą IME lub narzędzi testowych,
na urządzeniach, które nie mają wbudowanej klawiatury.
Zakładamy, że klawiatura wirtualna ma pełny układ QWERTY tak samo na wszystkich urządzeniach. Umożliwia to aplikacjom wstrzyknięcie kodu naciśnięcia klawiszy na klawiaturze wirtualnej i zawsze daje te same efekty.
Nie modyfikuj wirtualnej mapy znaków klawiszy
Składnia
Plik mapy znaków klawiszy to zwykły plik tekstowy składający się z typu klawiatury i zbiór deklaracji klucza.
Deklaracja typu klawiatury
Deklaracja typu klawiatury opisuje jej ogólny sposób działania. Plik mapy znaków musi zawierać deklarację typu klawiatury. W celu uniknięcia wątpliwości: często znajduje się na początku pliku.
type FULL
Rozpoznawane są te typy klawiatur:
-
NUMERIC
: klawiatura numeryczna (12-klawiszowa).Klawiatura numeryczna umożliwia wpisywanie tekstu wielokrotnym dotknięciem. Wygenerowanie litery lub symbolu może wymagać kilkukrotnego kliknięcia klawisza.
Ten typ klawiatury jest zwykle przeznaczony do pisania kciukiem.
Odpowiada
KeyCharacterMap.NUMERIC
. -
PREDICTIVE
: klawiatura ze wszystkimi literami, ale z więcej niż jedną literą na klawisz.Ten typ klawiatury jest zwykle przeznaczony do pisania kciukiem.
Odpowiada
KeyCharacterMap.PREDICTIVE
. -
ALPHA
: klawiatura ze wszystkimi literami i może tylko niektórymi cyframi.Klawiatura alfabetyczna umożliwia bezpośrednie wprowadzanie tekstu, ale może być zwięzła o małym formacie. W przeciwieństwie do klawiatury
FULL
niektóre funkcje mogą być dostępne wyłącznie za pomocą specjalnych selektora znaków na ekranie. Aby zwiększyć szybkość i dokładność pisania, platforma zapewnia specjalne afordancje dla klawiatur alfabetycznych, takie jak automatyczne wstawianie wielkich liter; oraz przełączać / zablokować klawisze SHIFT i ALT.Ten typ klawiatury jest zwykle przeznaczony do pisania kciukiem.
-
FULL
: klawiatura w pełni przypominająca komputer PC.Pełna klawiatura działa jak klawiatura komputera. Dostęp do wszystkich symboli jest możliwy bezpośrednio naciskając klawisze na klawiaturze, które nie są obsługiwane na ekranie, automatyczne wstawianie wielkich liter.
Ten typ klawiatury jest zwykle zaprojektowany do pisania w trybie ciągłym dwoma palcami.
-
SPECIAL_FUNCTION
: klawiatura, która służy tylko do wykonywania funkcji systemowych. zamiast pisać.Specjalna klawiatura funkcyjna składa się tylko z klawiszy niedrukowalnych, takich jak EKRAN GŁÓWNY i POTĘGA, które nie są tak naprawdę używane do pisania.
Mapy znaków klawiszy Generic.kcm
i Virtual.kcm
to klawiatura typu FULL
.
Deklaracje klucza
Każda deklaracja klucza składa się ze słowa kluczowego key
, po którym następuje kod klucza dla Androida
nazwy, otwartego nawiasu klamrowego, zestawu właściwości i działań oraz nawiasu klamrowego zamykającego.
key A { label: 'A' base: 'a' shift, capslock: 'A' ctrl, alt, meta: none }
Właściwości
Każda właściwość klucza wyznacza mapowanie z klucza na działanie. Aby bardziej kompaktowe pliki mapy klawiszy, kilka właściwości można zmapować zachowanie, rozdzielając je przecinkami.
W powyższym przykładzie do właściwości label
przypisano działanie 'A'
.
Podobnie właściwości ctrl
, alt
i meta
są jednocześnie przypisane
zachowanie none
.
Rozpoznawane są te właściwości:
-
label
: określa etykietę fizycznie wydrukowaną na kluczu, jeśli składa się z jednego znaku. To jest wartość zwracana przez funkcję metodęKeyCharacterMap.getDisplayLabel
. -
number
: określa zachowanie (znak, który należy wpisywać) w przypadku użycia wartości liczbowej w widoku tekstowym, na przykład gdy użytkownik wpisuje numer telefonu.Klawiatury kompaktowe często łączą wiele symboli w jeden klawisz, na przykład tego samego klucza można użyć do wpisania
'1'
i'a'
lub'#'
i'q'
, np. W przypadku tych kluczy właściwośćnumber
powinna być ustawiona tak, aby wskazywała, który symbol powinny być wpisane w kontekście liczbowym, jeśli taki istnieje.Niektóre typowe „liczbowe” symbole to cyfry od
'0'
do'9'
,'#'
,'+'
,'('
,')'
,','
i'.'
. -
base
: określa zachowanie (znak, który należy wpisać), gdy nie ma modyfikatorów jest wciśnięty. -
<modyfikator> lub <modifier1>
+
<modifier2>+
...: określa zachowanie (znak, który powinien być wpisany) po naciśnięciu klawisza określone modyfikatory są aktywne.Na przykład właściwość modyfikatora
shift
określa działanie, które ma zastosowanie, gdy klawisz LEWY SHIFT albo modyfikator RIGHT SHIFT.Właściwość modyfikatora
rshift+ralt
określa działanie, które ma zastosowanie po naciśnięciu jednocześnie modyfikatorów RIGHT SHIFT i RIGHT ALT.
We właściwościach modyfikatorów rozpoznawane są te modyfikatory:
shift
: ta opcja ma zastosowanie po naciśnięciu klawisza LEWY SHIFT lub modyfikatora PRAWEGO SHIFT do działania.lshift
: ma zastosowanie po naciśnięciu lewego modyfikatora SHIFT.rshift
: ta opcja ma zastosowanie po naciśnięciu prawego modyfikatora SHIFT.alt
: ma zastosowanie po naciśnięciu modyfikatora LEFT ALT lub RIGHT ALT.lalt
: ma zastosowanie po naciśnięciu lewego modyfikatora ALT.ralt
: ma zastosowanie po naciśnięciu prawego modyfikatora ALT.ctrl
: ma zastosowanie po naciśnięciu modyfikatora LEFT Control lub RIGHT Control.lctrl
: ma zastosowanie po naciśnięciu modyfikatora LEWY ELEMENT STEROWANIA.rctrl
: ma zastosowanie po naciśnięciu modyfikatora RIGHT Control.meta
: ma zastosowanie po naciśnięciu modyfikatora LEFT META lub RIGHT META.lmeta
: ma zastosowanie po naciśnięciu modyfikatora LEFT META.rmeta
: ma zastosowanie po naciśnięciu modyfikatora RIGHT META.sym
: ma zastosowanie po naciśnięciu modyfikatora SYMBOL.fn
: ma zastosowanie po naciśnięciu modyfikatora FUNCTION.capslock
: ma zastosowanie, gdy modyfikator CAPS LOCK jest zablokowany.numlock
: ma zastosowanie, gdy modyfikator NUM LOCK jest zablokowany.scrolllock
: ma zastosowanie, gdy modyfikator SCROLL LOCK jest zablokowany.
Kolejność obiektów jest znacząca. Podczas mapowania klucza na: system skanuje wszystkie odpowiednie właściwości w odpowiedniej kolejności i zwraca ostatnie wykrytego niewłaściwego zachowania.
W efekcie właściwości określone później zastępują te, które są określone wcześniej dla danego klucza.
Zachowania
Każda właściwość jest powiązana z zachowaniem. Najczęstszym zachowaniem jest wpisywanie znaku Są jednak jeszcze inne,
Rozpoznawane są te zachowania:
-
none
: nie wpisuj znaku.Jest to domyślne działanie, jeśli nie określono żadnego znaku. Określanie:
none
jest opcjonalny, ale zwiększa czytelność. -
'X'
: wpisz określony literał znaków.Sprawia to, że określony znak jest wprowadzany do zaznaczonego w widoku tekstowym. Literałem znaków może być dowolny znak ASCII lub jeden ze znaków następujące sekwencje zmiany znaczenia:
'\\'
: wpisz ukośnik lewy.'\n'
: wpisz znak nowego wiersza (przy użyciu klawisza ENTER / RETURN).'\t'
: wpisz znak tabulacji.'\''
: wpisz znak apostrofu.'\"'
: wpisz znak cudzysłowu.'\uXXXX'
: wpisz znak Unicode, którego punkt kodowy jest podany w postaci szesnastkowej w formacie XXXX.
-
fallback
<nazwa kodu klucza Androida>: wykonuje działanie domyślne, jeśli klucz nie jest które są obsługiwane przez aplikację.Powoduje to, że system symuluje inne naciśnięcie klawisza, gdy aplikacja nie obsługuje natywnie podanego klucza. Jest używana do obsługi domyślnego zachowania nowych kluczy, których nie potrafią obsługiwać wszystkie aplikacje, takich jak ESCAPE, klawisze numeryczne na klawiaturze numerycznej (gdy nie jest naciśnięty klawisz numlock).
Gdy wykonywane jest działanie zastępcze, aplikacja otrzyma 2 naciśnięcia klawisza: jeden dla klucza pierwotnego, a drugi dla wybranego klucza zastępczego. Jeśli aplikacja obsługuje pierwotny klucz przy naciśnięciu klawisza, wydarzenie zostanie anulowane (
KeyEvent.isCanceled
zwróci wartośćtrue
).
System rezerwuje dwa znaki Unicode do wykonywania funkcji specjalnych:
-
'\uef00'
: po wykonaniu tego działania widok tekstu pobiera i usuwa wartości przed kursorem, zinterpretuje je jako cyfry szesnastkowe i wstawi odpowiedniego punktu kodowego Unicode. -
'\uef01'
: po wykonaniu tej czynności w widoku tekstowym wyświetli się ikona okno z selektorem znaków zawierające różne symbole.
System rozpoznaje następujące znaki Unicode jako łączące martwe znaki diakrytyczne znaki:
'\u0300'
: akcent słaby.'\u0301'
: ostry akcent.'\u0302'
: akcent przeciągły.'\u0303'
: akcent tyldy.'\u0308'
: akcent umlaut.
Po wpisaniu martwego klawisza, po którym następuje inny znak, niedziałający klawisz oraz do znaków. Na przykład gdy użytkownik wpisze wyraz słaby akcent, czyli martwy i litera „a”, wynik to „à”.
Więcej informacji o obsłudze martwych kluczy znajdziesz w KeyCharacterMap.getDeadChar
.
Komentarze
Wiersze komentarza zaczynają się od znaku „#” i kontynuuj do końca wiersza. W ten sposób:
# A comment!
Puste wiersze są ignorowane.
Jak kombinacje klawiszy są przypisywane do zachowań
Gdy użytkownik naciśnie klawisz, system sprawdza zachowanie powiązane z kluczem kombinację aktualnie wciśniętego klawisza i obecnie wciśniętych modyfikatorów.
SHIFT + A
Załóżmy, że użytkownik naciśnie jednocześnie A i SHIFT. System najpierw lokalizuje
zestaw właściwości i zachowań powiązanych z zasadą KEYCODE_A
.
key A { label: 'A' base: 'a' shift, capslock: 'A' ctrl, alt, meta: none }
System skanuje właściwości od pierwszej do ostatniej i od lewej do prawej, ignorując przy tym
label
i number
, które są wyjątkowe.
Pierwsza znaleziona właściwość to base
. Właściwość base
ma zawsze zastosowanie do
niezależnie od tego, jakie modyfikatory zostaną naciśnięte. Zasadniczo określa domyślną wartość,
dla klucza, chyba że zostanie on zastąpiony przez poniższe właściwości.
Właściwość base
ma zastosowanie do tego naciśnięcia klawisza, więc system zwraca uwagę
fakt, że jego działanie to 'a'
(wpisz znak a
).
System kontynuuje skanowanie kolejnych właściwości, aby sprawdzić, czy któreś z nich
są bardziej szczegółowe niż base
i zastąp je. Natrafia na interfejs shift
, który
Dotyczy to także klawiszy SHIFT + A. System postanawia więc zignorować
do działania usługi base
i wybiera zachowanie powiązane z
właściwość shift
, którą jest 'A'
(wpisz znak A
).
Następnie dalej skanuje tabelę, ale żadne inne właściwości nie mają do niego zastosowania. naciśnięcie klawisza (CAPS LOCK nie jest zablokowane, nie jest naciśnięty ani naciśnięty klawisz Ctrl, ani żaden naciśnięto klawisz ALT, ale nie naciśnięto klawisza META);
Kombinacja klawiszy SHIFT + A daje więc wynik 'A'
.
Ctrl + A
Zastanówmy się teraz, co by się stało, gdyby użytkownik naciśnił jednocześnie A i Ctrl.
Tak jak wcześniej, system skanował tabelę właściwości. Zauważyłaby
, która została zastosowana do właściwości base
, ale będzie kontynuowała skanowanie do
trafił do właściwości control
. Na bieżąco control
pojawia się po base
, więc jej działanie zastępuje działanie base
.
Wynika więc z tego, że kombinacja klawiszy Ctrl + A będzie działać none
.
ESCAPE
Załóżmy teraz, że użytkownik nacisnął klawisz ESCAPE.
key ESCAPE { base: fallback BACK alt, meta: fallback HOME ctrl: fallback MENU }
Tym razem system uzyskuje działanie fallback BACK
– działanie zastępcze.
Nie zostanie wyświetlony żaden literał znaków, więc nie zostanie wpisany żaden znak.
Podczas przetwarzania klucza system najpierw prześle KEYCODE_ESCAPE
do
aplikacji. Jeśli aplikacja nie będzie go obsługiwać, system podejmie próbę
ponownie, ale tym razem polecenie KEYCODE_BACK
zostanie przesłane do aplikacji jako
żądane przez działanie zastępcze.
Dlatego aplikacje, które rozpoznają i obsługują KEYCODE_ESCAPE
, mają
ale inne aplikacje, które tego nie robią,
wykonanie działania awaryjnego polegającego na traktowaniu klucza tak, jakby był to KEYCODE_BACK
.
NUMPAD_0 z NUM LOCK lub bez
Klawisze numeryczne mają bardzo różne interpretacje w zależności od tego, czy klawisz NUM LOCK jest zablokowany.
Poniższa deklaracja klucza gwarantuje, że KEYCODE_NUMPAD_0
typy 0
po naciśnięciu funkcji NUM LOCK. Kiedy nie zostanie naciśnięty NUM LOCK, klawisz zostanie dostarczony
do aplikacji w zwykły sposób. Jeśli nie jest obsługiwana,
klucz KEYCODE_INSERT
jest dostarczany.
key NUMPAD_0 { label, number: '0' base: fallback INSERT numlock: '0' ctrl, alt, meta: none }
Jak widać, deklaracje kluczy zastępczych znacznie poprawiają zgodność ze starszymi aplikacjami, które nie rozpoznają lub nie obsługują bezpośrednio wszystkich kluczy dostępnych na klawiaturze w stylu PC.
Przykłady
Pełna klawiatura
# This is an example of part of a key character map file for a full keyboard # include a few fallback behaviors for special keys that few applications # handle themselves. type FULL key C { label: 'C' base: 'c' shift, capslock: 'C' alt: '\u00e7' shift+alt: '\u00c7' ctrl, meta: none } key SPACE { label: ' ' base: ' ' ctrl: none alt, meta: fallback SEARCH } key NUMPAD_9 { label, number: '9' base: fallback PAGE_UP numlock: '9' ctrl, alt, meta: none }
Klawiatura alfanumeryczna
# This is an example of part of a key character map file for an alphanumeric # thumb keyboard. Some keys are combined, such as `A` and `2`. Here we # specify `number` labels to tell the system what to do when the user is # typing a number into a dial pad. # # Also note the special character '\uef01' mapped to ALT+SPACE. # Pressing this combination of keys invokes an on-screen character picker. type ALPHA key A { label: 'A' number: '2' base: 'a' shift, capslock: 'A' alt: '#' shift+alt, capslock+alt: none } key SPACE { label: ' ' number: ' ' base: ' ' shift: ' ' alt: '\uef01' shift+alt: '\uef01' }
Pad do gier
# This is an example of part of a key character map file for a game pad. # It defines fallback actions that enable the user to navigate the user interface # by pressing buttons. type SPECIAL_FUNCTION key BUTTON_A { base: fallback BACK } key BUTTON_X { base: fallback DPAD_CENTER } key BUTTON_START { base: fallback HOME } key BUTTON_SELECT { base: fallback MENU }
Uwaga dotycząca zgodności
Przed wprowadzeniem Androida Honeycomb 3.0 mapa znaków klucza dla Androida była określana
używając bardzo innej składni i skompilowano do formatu pliku binarnego
(.kcm.bin
) w momencie kompilacji.
Chociaż w nowym formacie używane jest to samo rozszerzenie .kcm
, składnia jest dość
inny (i o wiele bardziej wydajny).
Od wersji Honeycomb 3.0 wszystkie pliki mapy klawiszy w Androidzie muszą używać
z nową składnią i zwykłym formatem pliku tekstowego, które zostały opisane w tym dokumencie.
Stara składnia nie jest obsługiwana, a stare pliki .kcm.bin
nie są rozpoznawane
przez system.
Notatka dotycząca języka
Android nie obsługuje obecnie klawiatur wielojęzycznych. Ponadto wbudowana ogólna mapa klawiszy funkcyjnych zakłada układ klawiatury w języku angielskim (USA).
Zachęcamy producentów OEM do dostarczania niestandardowych map klawiszy znaków dla klawiatur czy są przeznaczone do obsługi innych języków.
Przyszłe wersje Androida mogą zapewniać lepszą obsługę klawiatur wielojęzycznych lub układy klawiatury wybierane przez użytkownika.
Weryfikacja
Pamiętaj, aby zweryfikować pliki mapy znaków kluczowych za pomocą Narzędzie Weryfikuj mapy klawiszy.