转载:http://blog.csdn.net/louiswangbing/article/details/6610953
http://hi.chinaunix.net/?uid-21747227-action-viewspace-itemid-48301
一:
用户空间的处理
1.处理的内容和流程
触摸屏和轨迹球上报的是坐标、按下、抬起等信息,信息量比较少。按键处理的过程稍微复杂,从驱动程序到Android的Java层受到的信息,键表示方式经过了两次转化,如图8-4所示。
图8-4 Android按键输入的两次转化
键扫描码Scancode是由Linux的Input驱动框架定义的整数类型。键扫描码Scancode经过一次转化后,形成按键的标签KeycodeLabel,是一个字符串的表示形式。按键的标签KeycodeLabel经过转换后,再次形成整数型的按键码keycode。在Android应用程序层,主要使用按键码keycode来区分。
在本地框架层libui的头文件中KeycodeLabels.h,按键码为整数值的格式,其定义KeyCode(枚举值)如下所示:
1.
typedef enum
KeyCode {
2.
kKeyCodeUnknown = 0,
3.
kKeyCodeSoftLeft = 1,
4.
kKeyCodeSoftRight = 2,
5.
kKeyCodeHome = 3,
6.
kKeyCodeBack = 4,
7.
// ...... 省略中间按键码
8.
} KeyCode;
进而在定义了KeycodeLabels.h中定义了从字符串到整数的映射关系,数组KEYCODES,定义如下所示:
1. static const
KeycodeLabel KEYCODES[] = { // {字符串,整数}
2.
{ "SOFT_LEFT", 1 },
3.
{ "SOFT_RIGHT", 2 },
4.
{ "HOME", 3 },
5.
{ "BACK", 4 },
6.
{ "CALL", 5 },
7.
{ "ENDCALL", 6 },
8.
{ "0", 7 }, // ...... 数字按键
9.
{ "1", 8 },
10.
{ "2", 9 },
11.
{ "3", 10 },
12.
{ "4", 11 },
13.
{ "5", 12 },
14.
{ "6", 13 },
15.
{ "7", 14 },
16.
{ "8", 15 },
17.
{ "9", 16 },
18.
{ "STAR", 17 },
19.
// ...... 省略中间按键映射
20.
{ "MENU", 82 },
21.
// ...... 省略中间按键映射
22.
{ NULL, 0 }
23. };
数组KEYCODES表示的映射关系,左列的内容即表示按键标签KeyCodeLabel,右列的内容为按键码KeyCode(与KeyCode的数值对应)。实际上,在按键信息第二次转化的时候就是将字符串类型KeyCodeLabel转化成整数的KeyCode。
KeycodeLabel的Flags的定义如下所示:
1. static const
KeycodeLabel FLAGS[] = {
2.
{ "WAKE", 0x00000001 }, // 可以唤醒睡眠,并通知应用层
3.
{ "WAKE_DROPPED", 0x00000002 }, // 可以唤醒睡眠,不通知应用层
4.
{ "SHIFT", 0x00000004 }, // 自动附加SHIFT
5.
{ "CAPS_LOCK", 0x00000008 }, // 自动附加CAPS_LOCK
6.
{ "ALT", 0x00000010 }, // 自动附加ALT
7.
{ "ALT_GR", 0x00000020 },
8.
{ "MENU", 0x00000040 },
9.
{ "LAUNCHER", 0x00000080 },
10.
{ NULL, 0 }
11. };
KeycodeLabel表示按键的附属标识。
提示:frameworks/base/core/Java/android/view/KeyEvent.Java中定义了类android.view. KeyEvent类,其中定义整数类型的数值与KeycodeLabels.h中定义的KeyCode枚举值是对应的。
在本地框架层libui的头文件中KeyCharacterMap.h,定义了按键的字符映射关