File peta karakter kunci (file .kcm
) bertanggung jawab untuk memetakan kombinasi
kode kunci Android dengan pengubah ke karakter Unicode.
File tata letak tombol khusus perangkat diperlukan untuk semua perangkat input internal (bawaan) yang memiliki tombol, meskipun hanya untuk memberi tahu sistem bahwa perangkat hanya untuk tujuan khusus (bukan keyboard lengkap).
File tata letak tombol khusus perangkat bersifat opsional untuk keyboard eksternal, dan sering kali tidak diperlukan sama sekali. Sistem ini menyediakan peta karakter kunci generik yang cocok untuk banyak keyboard eksternal.
Jika tidak ada file tata letak tombol khusus perangkat yang tersedia, sistem akan memilih default.
Lokasi
File peta karakter tombol ditemukan berdasarkan vendor USB, ID produk (dan versi opsional), atau nama perangkat input.
Jalur berikut akan dikonsultasikan secara berurutan.
/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
Saat membuat jalur file yang berisi nama perangkat, semua karakter dalam nama perangkat selain '0'-'9', 'a'-'z', 'A'-'Z', '-', atau '_' akan diganti dengan '_'.
File peta karakter kunci umum
Sistem menyediakan file peta karakter kunci bawaan khusus yang disebut Generic.kcm
.
Peta karakter kunci ini dimaksudkan untuk mendukung berbagai keyboard eksternal
standar.
Jangan ubah peta karakter kunci umum.
File peta karakter tombol virtual
Sistem menyediakan file peta karakter kunci bawaan khusus yang disebut Virtual.kcm
yang digunakan oleh perangkat keyboard virtual.
Perangkat keyboard virtual adalah perangkat input sintetis yang ID-nya adalah -1
(lihat KeyCharacterMap.VIRTUAL_KEYBOARD
). Perangkat ini ada di semua perangkat Android
mulai dari Android Honeycomb 3.0. Tujuan perangkat keyboard virtual
adalah menyediakan perangkat input bawaan yang diketahui dan dapat digunakan untuk memasukkan
ketukan tombol ke aplikasi oleh IME atau oleh instrumentasi pengujian, bahkan
untuk perangkat yang tidak memiliki keyboard bawaan.
Keyboard virtual diasumsikan memiliki tata letak QWERTY lengkap yang sama di semua perangkat. Hal ini memungkinkan aplikasi memasukkan ketukan tombol menggunakan perangkat keyboard virtual dan selalu mendapatkan hasil yang sama.
Jangan ubah peta karakter tombol virtual.
Sintaksis
File peta karakter tombol adalah file teks biasa yang terdiri dari deklarasi jenis keyboard dan kumpulan deklarasi tombol.
Deklarasi jenis keyboard
Deklarasi jenis keyboard menjelaskan perilaku keyboard secara keseluruhan. File peta karakter harus berisi deklarasi jenis keyboard. Untuk kejelasan, file ini sering ditempatkan di bagian atas file.
type FULL
Jenis keyboard berikut dikenali:
-
NUMERIC
: Keyboard numerik (12 tombol).Keyboard numerik mendukung entri teks menggunakan pendekatan multi-ketuk. Anda mungkin perlu mengetuk tombol beberapa kali untuk menghasilkan huruf atau simbol yang diinginkan.
Jenis keyboard ini umumnya dirancang untuk mengetik dengan ibu jari.
Sesuai dengan
KeyCharacterMap.NUMERIC
. -
PREDICTIVE
: Keyboard dengan semua huruf, tetapi dengan lebih dari satu huruf per tombol.Jenis keyboard ini umumnya dirancang untuk mengetik dengan ibu jari.
Sesuai dengan
KeyCharacterMap.PREDICTIVE
. -
ALPHA
: Keyboard dengan semua huruf, dan mungkin beberapa angka.Keyboard alfabet mendukung entri teks secara langsung, tetapi mungkin memiliki tata letak yang ringkas dengan faktor bentuk kecil. Berbeda dengan keyboard
FULL
, beberapa simbol mungkin hanya dapat diakses menggunakan pemilih karakter virtual khusus. Selain itu, untuk meningkatkan kecepatan dan akurasi pengetikan, framework ini menyediakan fitur khusus untuk keyboard alfabet seperti kapitalisasi otomatis dan tombol SHIFT dan ALT yang diaktifkan / dikunci.Jenis keyboard ini umumnya dirancang untuk mengetik dengan ibu jari.
-
FULL
: Keyboard gaya PC lengkap.Keyboard penuh berfungsi seperti keyboard PC. Semua simbol diakses langsung dengan menekan tombol pada keyboard tanpa dukungan atau kemampuan di layar seperti kapitalisasi otomatis.
Jenis keyboard ini umumnya dirancang untuk mengetik dengan dua tangan.
-
SPECIAL_FUNCTION
: Keyboard yang hanya digunakan untuk menjalankan fungsi kontrol sistem, bukan untuk mengetik.Keyboard fungsi khusus hanya terdiri dari tombol non-pencetakan seperti HOME dan POWER yang sebenarnya tidak digunakan untuk mengetik.
Peta karakter kunci Generic.kcm
dan Virtual.kcm
adalah keyboard FULL
.
Pernyataan kunci
Setiap deklarasi kunci terdiri dari kata kunci key
, diikuti dengan nama kode kunci Android, kurung kurawal buka, kumpulan properti dan perilaku, serta kurung kurawal tutup.
key A { label: 'A' base: 'a' shift, capslock: 'A' ctrl, alt, meta: none }
Properti
Setiap properti kunci menetapkan pemetaan dari kunci ke perilaku. Agar file peta karakter kunci lebih ringkas, beberapa properti dapat dipetakan ke perilaku yang sama dengan memisahkannya dengan koma.
Pada contoh di atas, properti label
diberi perilaku 'A'
.
Demikian pula, properti ctrl
, alt
, dan meta
secara bersamaan ditetapkan
perilaku none
.
Properti berikut dikenali:
-
label
: Menentukan label yang dicetak secara fisik pada kunci, jika terdiri dari satu karakter. Ini adalah nilai yang ditampilkan oleh metodeKeyCharacterMap.getDisplayLabel
. -
number
: Menentukan perilaku (karakter yang harus diketik) saat tampilan teks numerik memiliki fokus, seperti saat pengguna mengetik nomor telepon.Keyboard ringkas sering menggabungkan beberapa simbol menjadi satu tombol, sehingga tombol yang sama mungkin digunakan untuk mengetik
'1'
dan'a'
atau'#'
dan'q'
. Untuk kunci ini, propertinumber
harus ditetapkan untuk menunjukkan simbol yang harus diketik dalam konteks numerik, jika ada.Beberapa simbol "numerik" standar adalah angka
'0'
hingga'9'
,'#'
,'+'
,'('
,')'
,','
, dan'.'
. -
base
: Menentukan perilaku (karakter yang harus diketik) saat tidak ada pengubah yang ditekan. -
<modifier> atau <modifier1>
+
<modifier2>+
...: Menentukan perilaku (karakter yang harus diketik) saat tombol ditekan dan semua pengubah yang ditentukan aktif.Misalnya, properti pengubah
shift
menentukan perilaku yang berlaku saat pengubah LEFT SHIFT atau RIGHT SHIFT ditekan.Demikian pula, properti pengubah
rshift+ralt
menentukan perilaku yang berlaku saat pengubah RIGHT SHIFT dan RIGHT ALT ditekan secara bersamaan.
Pengubah berikut dikenali dalam properti pengubah:
shift
: Berlaku saat pengubah LEFT SHIFT atau RIGHT SHIFT ditekan.lshift
: Berlaku saat pengubah SHIFT KIRI ditekan.rshift
: Berlaku saat pengubah RIGHT SHIFT ditekan.alt
: Berlaku saat pengubah LEFT ALT atau RIGHT ALT ditekan.lalt
: Berlaku saat pengubah ALT KIRI ditekan.ralt
: Berlaku saat pengubah ALT KANAN ditekan.ctrl
: Berlaku saat pengubah LEFT CONTROL atau RIGHT CONTROL ditekan.lctrl
: Berlaku saat pengubah LEFT CONTROL ditekan.rctrl
: Berlaku saat pengubah KANAN KONTROL ditekan.meta
: Berlaku saat pengubah META KIRI atau META KANAN ditekan.lmeta
: Berlaku saat pengubah META KIRI ditekan.rmeta
: Berlaku saat pengubah META KANAN ditekan.sym
: Berlaku saat pengubah SYMBOL ditekan.fn
: Berlaku saat pengubah FUNCTION ditekan.capslock
: Berlaku saat pengubah CAPS LOCK terkunci.numlock
: Berlaku saat pengubah NUM LOCK dikunci.scrolllock
: Berlaku saat pengubah SCROLL LOCK terkunci.
Urutan properti yang tercantum bersifat signifikan. Saat memetakan kunci ke perilaku, sistem akan memindai semua properti yang relevan secara berurutan dan menampilkan perilaku terakhir yang berlaku yang ditemukan.
Akibatnya, properti yang ditentukan nanti akan menggantikan properti yang ditentukan sebelumnya untuk kunci tertentu.
Perilaku
Setiap properti dipetakan ke perilaku. Perilaku yang paling umum adalah mengetik karakter, tetapi ada perilaku lainnya.
Perilaku berikut dikenali:
-
none
: Jangan mengetik karakter.Perilaku ini adalah default jika tidak ada karakter yang ditentukan. Menentukan
none
bersifat opsional, tetapi akan meningkatkan kejelasan. -
'X'
: Mengetik literal karakter yang ditentukan.Perilaku ini menyebabkan karakter yang ditentukan dimasukkan ke dalam tampilan teks yang difokuskan. Literal karakter dapat berupa karakter ASCII, atau salah satu urutan escape berikut:
'\\'
: Ketik karakter garis miring terbalik.'\n'
: Mengetik karakter baris baru (gunakan ini untuk ENTER / RETURN).'\t'
: Ketik karakter TAB.'\''
: Ketik karakter apostrof.'\"'
: Ketik karakter tanda kutip.'\uXXXX'
: Ketik karakter Unicode yang titik kodenya diberikan dalam hex oleh XXXX.
-
fallback
<Android key code name>: Melakukan tindakan default jika kunci tidak ditangani oleh aplikasi.Perilaku ini menyebabkan sistem menyimulasikan penekanan tombol yang berbeda saat aplikasi tidak menangani kunci yang ditentukan secara native. Fungsi ini digunakan untuk mendukung perilaku default untuk tombol baru yang tidak diketahui cara penanganannya oleh semua aplikasi, seperti tombol ESCAPE atau keypad numerik (saat numlock tidak ditekan).
Saat perilaku penggantian dilakukan, aplikasi akan menerima dua penekanan tombol: satu untuk tombol asli dan satu lagi untuk tombol penggantian yang dipilih. Jika aplikasi menangani kunci asli selama tombol ditekan, peristiwa kunci penggantian akan dibatalkan (
KeyEvent.isCanceled
akan menampilkantrue
).
Sistem ini mencadangkan dua karakter Unicode untuk menjalankan fungsi khusus:
-
'\uef00'
: Saat perilaku ini dilakukan, tampilan teks akan menggunakan dan menghapus empat karakter sebelum kursor, menafsirkannya sebagai digit heksadesimal, dan menyisipkan titik kode Unicode yang sesuai. -
'\uef01'
: Saat perilaku ini dilakukan, tampilan teks akan menampilkan dialog pemilih karakter yang berisi simbol-simbol acak.
Sistem mengenali karakter Unicode berikut sebagai menggabungkan karakter tombol mati diakritik:
'\u0300'
: Aksen nontirus.'\u0301'
: Aksen akut.'\u0302'
: Aksen sirkumfleks.'\u0303'
: Aksen tanda petik.'\u0308'
: Aksen umlaut.
Saat tombol mati diketik, diikuti dengan karakter lain, tombol mati dan karakter berikutnya akan digabungkan. Misalnya, saat pengguna mengetik tombol mati aksen grave diikuti dengan huruf 'a', hasilnya adalah 'à'.
Lihat KeyCharacterMap.getDeadChar
untuk mengetahui informasi selengkapnya tentang penanganan tombol mati.
Komentar
Baris komentar dimulai dengan '#' dan berlanjut ke akhir baris. Seperti ini:
# A comment!
Baris kosong akan diabaikan.
Cara kombinasi tombol dipetakan ke perilaku
Saat pengguna menekan tombol, sistem akan mencari perilaku yang terkait dengan kombinasi penekanan tombol tersebut dan pengubah yang saat ini ditekan.
SHIFT + A
Misalkan pengguna menekan A dan SHIFT secara bersamaan. Sistem pertama-tama akan menemukan
kumpulan properti dan perilaku yang terkait dengan KEYCODE_A
.
key A { label: 'A' base: 'a' shift, capslock: 'A' ctrl, alt, meta: none }
Sistem memindai properti dari yang pertama hingga terakhir dan dari kiri ke kanan, mengabaikan
properti label
dan number
, yang bersifat khusus.
Properti pertama yang ditemukan adalah base
. Properti base
selalu berlaku untuk
kunci, apa pun pengubah yang ditekan. Ini pada dasarnya menentukan perilaku
default untuk kunci, kecuali jika diganti oleh properti berikut.
Karena properti base
berlaku untuk penekanan tombol ini, sistem akan mencatat
fakta bahwa perilakunya adalah 'a'
(ketik karakter a
).
Sistem kemudian akan terus memindai properti berikutnya jika ada properti yang lebih spesifik daripada base
dan menggantinya. Fungsi ini menemukan shift
yang
juga berlaku untuk penekanan tombol SHIFT + A. Jadi, sistem memutuskan untuk mengabaikan
perilaku properti base
dan memilih perilaku yang terkait dengan
properti shift
, yaitu 'A'
(ketik karakter A
).
Kemudian, aplikasi akan terus memindai tabel, tetapi tidak ada properti lain yang berlaku untuk penekanan tombol ini (CAPS LOCK tidak terkunci, tombol CONTROL tidak ditekan, tombol ALT tidak ditekan, dan tombol META tidak ditekan).
Jadi, perilaku yang dihasilkan untuk kombinasi tombol SHIFT + A adalah 'A'
.
CONTROL + A
Sekarang, pertimbangkan apa yang akan terjadi jika pengguna menekan A dan CONTROL secara bersamaan.
Seperti sebelumnya, sistem akan memindai tabel properti. Fungsi ini akan melihat bahwa properti base
diterapkan, tetapi juga akan terus memindai hingga akhirnya mencapai properti control
. Seperti yang terjadi, properti control
muncul setelah base
sehingga perilakunya menggantikan perilaku base
.
Jadi, perilaku yang dihasilkan untuk kombinasi tombol CONTROL + A adalah none
.
ESCAPE
Sekarang, anggap pengguna menekan ESCAPE.
key ESCAPE { base: fallback BACK alt, meta: fallback HOME ctrl: fallback MENU }
Kali ini sistem mendapatkan perilaku fallback BACK
, perilaku penggantian.
Karena tidak ada literal karakter yang muncul, tidak ada karakter yang akan diketik.
Saat memproses kunci, sistem akan mengirimkan KEYCODE_ESCAPE
terlebih dahulu ke
aplikasi. Jika aplikasi tidak menanganinya, sistem akan mencoba
lagi, tetapi kali ini akan mengirimkan KEYCODE_BACK
ke aplikasi seperti
yang diminta oleh perilaku penggantian.
Jadi, aplikasi yang mengenali dan mendukung KEYCODE_ESCAPE
memiliki
kesempatan untuk menanganinya apa adanya, tetapi aplikasi lain yang tidak dapat
melakukan tindakan penggantian dengan memperlakukan kunci seolah-olah itu adalah KEYCODE_BACK
.
NUMPAD_0 dengan atau tanpa NUM LOCK
Tombol keypad numerik memiliki interpretasi yang sangat berbeda, bergantung pada apakah tombol NUM LOCK terkunci.
Deklarasi kunci berikut memastikan bahwa KEYCODE_NUMPAD_0
mengetik 0
saat NUM LOCK ditekan. Jika NUM LOCK tidak ditekan, kunci akan dikirim
ke aplikasi seperti biasa, dan jika tidak ditangani, kunci penggantian
KEYCODE_INSERT
akan dikirim.
key NUMPAD_0 { label, number: '0' base: fallback INSERT numlock: '0' ctrl, alt, meta: none }
Seperti yang dapat kita lihat, deklarasi kunci penggantian sangat meningkatkan kompatibilitas dengan aplikasi lama yang tidak mengenali atau mendukung langsung semua tombol yang ada di keyboard gaya PC lengkap.
Contoh
Keyboard lengkap
# 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 }
Keyboard alfanumerik
# 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' }
Game pad
# 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 }
Catatan kompatibilitas
Sebelum Android Honeycomb 3.0, peta karakter kunci Android ditentukan
menggunakan sintaksis yang sangat berbeda dan dikompilasi ke dalam format file biner
(.kcm.bin
) pada waktu build.
Meskipun format baru menggunakan ekstensi .kcm
yang sama, sintaksisnya cukup
berbeda (dan jauh lebih canggih).
Mulai Android Honeycomb 3.0, semua file peta karakter kunci Android harus menggunakan
sintaksis baru dan format file teks biasa yang dijelaskan dalam dokumen ini.
Sintaksis lama tidak didukung dan file .kcm.bin
lama tidak dikenali
oleh sistem.
Catatan bahasa
Android saat ini tidak mendukung keyboard multibahasa. Selain itu, peta karakter tombol generik bawaan mengasumsikan tata letak keyboard bahasa Inggris Amerika Serikat.
OEM dianjurkan untuk menyediakan peta karakter tombol kustom untuk keyboard mereka jika dirancang untuk bahasa lain.
Versi Android mendatang mungkin memberikan dukungan yang lebih baik untuk keyboard multibahasa atau tata letak keyboard yang dapat dipilih pengguna.
Validasi
Pastikan untuk memvalidasi file peta karakter kunci menggunakan alat Validate Keymaps.