Pliki mapy znaków klawiszy

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.