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来回切换来实现小写字母、大写字母、数字符号三种输入,就像输入法软件盘一样实现三种输入模式。
一、什么是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 '+' '+' '+' '+' '+' '+'