Android之硬鍵盤對應----字元對應表KeyCharacterMap
預備基礎知識:
http://source.android.com/porting/keymaps_keyboard_input.html
http://blog.csdn.net/skdev/archive/2010/03/08/5355542.aspx 鍵盤對應流程,講的已經很詳細了。
http://www.kandroid.org/android_pdk/keymaps_keyboard_input.html
如何?了一鍵對應多個字元的輸出
如果你的鍵盤是全鍵盤(包括了ALT、SHIFT、CAPS_LOCK功能鍵)基本上用Android預設的鍵盤對應檔案qwerty.kcm,qwerty.kl就可以了。如果需要修改按鍵映射字元可以修改kcm 檔案, 如果不幸遇上NC的產品設計人員,拍腦袋搞出一個殘缺不全的鍵盤出來,就要動點心思改改Android framework層了。無奈,剛好這種事被我碰上了~~~~ 只有SHIFT鍵位,只好用SHIFT來回切換來實現小寫字母、大寫字母、數字記號三種輸入,就像IME軟體盤一樣實現三種輸入模式。
一、什麼是META Keys:就是ALT、SHIFT、CAPS_LOCK了。
首先,需要理解kcm檔案的意義
第一列:keycode,由kernel層發出,經*.kl鍵盤對應檔案得到keycode;
base列:META_KEY沒有被啟用時的狀態,即MetaState==0時映射的字元;
caps列:毫無疑問,是SHIFT或CAPS_LOCK被啟用時的狀態,此時MetaState==1時,映射的字元;
fn列:ALT被啟用,對應MetaState==2時映射的字元;
caps_fn列:ALT,SHIFT或CAPS_LOCK同時被啟用時映射的字元;此時MetaState==3;
number列:getNumber(mKeyCode)返回該鍵代表的數值;
./base/core/java/android/view/KeyEvent.java:871:
public char getNumber() {
return KeyCharacterMap.load(mDeviceId).getNumber(mKeyCode);
Display列:同上,由getDisplay返回;
通過這種方式,實現了一鍵對應多個字元的輸出,
Qwerty鍵盤對應語句實現位置在:frameworks/base/core/java/android/text/method/QwertyKeyListener.java檔案中
int i = event.getUnicodeChar(getMetaState(content));//getMetaState(content)分別為0,1,2,3 對應
getUnicodeChar(int meta)函數實現位於檔案frameworks/base/core/java/android/view/KeyEvent.java:
/base/core/java/android/view/KeyCharacterMap.java:139:
unsigned short KeyCharacterMap::get(int keycode, int meta)
您還需關注的檔案有MetaKeyKeyListener.java,在該檔案中人為地、暴力地改變MetaKey的狀態或傳回值。
二、 長按按鍵時,彈出帶音標的候選字元
代碼:public final int getRepeatCount() { return mRepeatCount; }
'A', ----→ĂÀÁÂÃÅÆĄ
'E', ---→ÈÉÊËĖĘĚ
'I', ---→ ÌÍÎÏ Ī
'O', ---→ÒÓÔÕÖŎŐ
'U',---→ ÙÚÛÜŰŲ
'a', ---→àáâãäåæ
'e',--→ èéêëëě
'o',---→ òóôő
'u', --→ùúûüűųūŭ
三、附表:本人做的俄文鍵盤
[type=QWERTY]
# keycode display number base caps fn caps_fn
A 'A' 0x00 'a' 'A' 0x0424 0x0444
B 'B' 0x00 'b' 'B' 0x0418 0x0438
C 'C' 0x00 'c' 'C' 0x0421 0x0441
D 'D' 0x00 'd' 'D' 0x0412 0x0432
E 'E' '3' 'e' 'E' 0x0423 0x0443
F 'F' 0x00 'f' 'F' 0x0410 0x0430
G 'G' 0x00 'g' 'G' 0x041F 0x043F
H 'H' 0x00 'h' 'H' 0x0420 0x0440
I 'I' '8' 'i' 'I' 0x0428 0x0448
J 'J' 0x00 'j' 'J' 0x041E 0x043E
K 'K' 0x00 'k' 'K' 0x041B 0x043B
L 'L' 0x00 'l' 'L' 0x0414 0x0434
M 'M' 0x00 'm' 'M' 0x042C 0x044C
N 'N' 0x00 'n' 'N' 0x0422 0x0442
O 'O' '9' 'o' 'O' 0x0429 0x0449
P 'P' '0' 'p' 'P' 0x0417 0x0437
Q 'Q' '1' 'q' 'Q' 0x0419 0x0439
R 'R' '4' 'r' 'R' 0x041A 0x043A
S 'S' 0x00 's' 'S' 0x042B 0x044B
T 'T' '5' 't' 'T' 0x0415 0x0435
U 'U' '7' 'u' 'U' 0x0413 0x0433
V 'V' 0x00 'v' 'V' 0x041C 0x043C
W 'W' '2' 'w' 'W' 0x0426 0x0446
X 'X' 0x00 'x' 'X' 0x0427 0x0447
Y 'Y' '6' 'y' 'Y' 0x041D 0x043D
Z 'Z' 0x00 'z' 'Z' 0x042F 0x044F
# on pc keyboards
COMMA ',' ',' ',' ';' ';' '|'
PERIOD '.' '.' '.' ':' ':' 0x2026
AT '@' '0' '@' '0' '0' 0x2022
SLASH '/' '/' '/' '?' '?' '/'
SPACE 0x20 0x20 0x20 0x20 0xEF01 0xEF01 //註: Android接收到字元值 0xEF01 時,彈出特別字元選擇框
ENTER 0xa 0xa 0xa 0xa 0xa 0xa
TAB 0x9 0x9 0x9 0x9 0x9 0x9
0 '0' '0' '0' ')' ')' ')'
1 '1' '1' '1' '!' '!' '!'
2 '2' '2' '2' '@' '@' '@'
3 '3' '3' '3' '#' '#' '#'
4 '4' '4' '4' '$' '$' '$'
5 '5' '5' '5' '%' '%' '%'
6 '6' '6' '6' '^' '^' '^'
7 '7' '7' '7' '&' '&' '&'
8 '8' '8' '8' '*' '*' '*'
9 '9' '9' '9' '(' '(' '('
GRAVE '`' '`' '`' '~' '`' '~'
MINUS '-' '-' '-' '_' '-' '_'
EQUALS '=' '=' '=' '+' '=' '+'
LEFT_BRACKET '[' '[' '[' '{' '[' '{'
RIGHT_BRACKET ']' ']' ']' '}' ']' '}'
BACKSLASH '/' '/' '/' '|' '/' '|'
SEMICOLON ';' ';' ';' ':' ';' ':'
APOSTROPHE ''' ''' ''' '"' ''' '"'
STAR '*' '*' '*' '*' '*' '*'
POUND '#' '#' '#' '#' '#' '#'
PLUS '+' '+' '+' '+' '+' '+'