文件格式:
键字符映射文件以二进制减少加载时间的形式存储于设备中,键字符映射文件有如下特征:
注释:以#开始为注释
空行:所有的空行被忽略
列定义:当一个事件来临的时候按下组合键。这个事通常是MODIFIER_SHIFT,MODIFIER_CTRL,MODIFIER_ALT的组合。
O no modifiers
S MODIFIER_SHIFT
C MODIFIER_CONTROL
L MODIFIER_CAPS_LOCK
A MODIFIER_ALT
键值定义:键值定义遵循如下规则:
键 扫描码 字符[....]
扫描码和字符通常是一个十进制的值或者是UTF8字符,可以通过strtol的解析。
键字符文件的示例:
下面这个文件来自于Android/src/device/product/generic/tuttle2.kcm,代表了一个完整的键字符文件。
以type开始的语句描述了你所要描述键盘的类型,大体分为三种
1:NUMERIC,12键的数字键盘
2:Q14:键盘包括所有的字符,但是可以一键多个字符。
3:QWERTY键盘包括了所有可能的字符和数字,类似于全键盘。
下面是一个QWERTY全键盘的定义示例,因为android主要用于手机,手机一般是全键。
# Copyright 2007 The Android Open Source Project
[type=QWERTY]
# keycode base caps fn caps_fn number display_label
A 'a' 'A' '%' 0x00 '%' 'A'
B 'b' 'B' '=' 0x00 '=' 'B'
C 'c' 'C' '8' 0x00E7 '8' 'C'
D 'd' 'D' '5' 0x00 '5' 'D'
E 'e' 'E' '2' 0x0301 '2' 'E'
F 'f' 'F' '6' 0x00A5 '6' 'F'
G 'g' 'G' '-' '_' '-' 'G'
H 'h' 'H' '[' '{' '[' 'H'
I 'i' 'I' '$' 0x0302 '$' 'I'
J 'j' 'J' ']' '}' ']' 'J'
K 'k' 'K' '"' '~' '"' 'K'
L 'l' 'L' ''' '`' ''' 'L'
M 'm' 'M' '>' 0x00 '>' 'M'
N 'n' 'N' '<' 0x0303 '<' 'N'
O 'o' 'O' '(' 0x00 '(' 'O'
P 'p' 'P' ')' 0x00 ')' 'P'
Q 'q' 'Q' '*' 0x0300 '*' 'Q'
R 'r' 'R' '3' 0x20AC '3' 'R'
S 's' 'S' '4' 0x00DF '4' 'S'
T 't' 'T' '+' 0x00A3 '+' 'T'
U 'u' 'U' '&' 0x0308 '&' 'U'
V 'v' 'V' '9' '^' '9' 'V'
W 'w' 'W' '1' 0x00 '1' 'W'
X 'x' 'X' '7' 0xEF00 '7' 'X'
Y 'y' 'Y' '!' 0x00A1 '!' 'Y'
Z 'z' 'Z' '#' 0x00 '#' 'Z'
COMMA ',' ';' ';' '|' ',' ','
PERIOD '.' ':' ':' 0x2026 '.' '.'
AT '@' '0' '0' 0x2022 '0' '@'
SLASH '/' '?' '?' '/' '/' '/'
SPACE 0x20 0x20 0x9 0x9 0x20 0x20
NEWLINE 0xa 0xa 0xa 0xa 0xa 0xa
# on pc keyboards
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 '+' '+' '+' '+' '+' '+'
这里第一列KeyCode就是我们通过.kl文件的ScanCode转换过来的了。
KeyCode 提供给系统的KeyCode
display 键盘上显示的字符(丝印)
number 一般不需要
base 不使用组合键默认显示的字符
caps Shift + 按键 显示的字符
fn Alt + 按键 显示的字符
caps_fn Shift +Alt+按键 显示的字符
其中base,caps,fn,caps_fn都可以通过Unicode码制来表示。例如你可以写
'A',也可以写0x41.
一般键盘中会有很多的组合键,可能会碰见各种奇怪的字符,这里我列举以下字符,他们的Unicode可以通过
复制你所需要的字符,然后可以查询到字符对应的Unicode码制。
资源二进制格式
上面所描述的一段通过makekcharmap工具转换成下面的格式,用户可以通过mmap这个文件,用于进程之间共享大概4K数据,可以节省加载时间。
Offset Size (bytes) Description
0x00-0x0b The ascii value "keycharmap1" including the null character
0x0c-0x0f padding
0x10-0x13 The number of entries in the modifiers table (COLS)
0x14-0x17 The number of entries in the characters table (ROWS)
0x18-0x1f padding
4*COLS Modifiers table. The modifier mask values that each of the columns in the characters table correspond to.
padding to the next 16 byte boundary
4*COLS*ROWS Characters table. The modifier mask values that each of the columns correspond to.
完善你自己的键盘事件驱动(略)