android 能够将不同的低层 scancode 转化成上层使用的统一的 keycode (以下分析为 android 2.2 froyo 的)。下面说的几个相关的源代码文件都在 framework/base/libs/ui 下。
EventHub? .cpp
先看看下面这段代码:// 在 open_device 函数里 if ((device->classes&CLASS_KEYBOARD) != 0) { char devname[PROPERTY_VALUE_MAX]; char keylayoutFilename[300]; const char* root = getenv("ANDROID_ROOT"); property_get("persist.sys.keylayout", devname, "qwerty"); snprintf(keylayoutFilename, sizeof(keylayoutFilename), "%s/usr/keylayout/%s.kl", root, devname); bool defaultKeymap = access(keylayoutFilename, R_OK); if (defaultKeymap) { strcpy(devname, "qwerty"); snprintf(keylayoutFilename, sizeof(keylayoutFilename), "%s/usr/keylayout/%s.kl", root, devname); } LOGI("keylayout = %s, Filename = %s", devname, keylayoutFilename); device->layoutMap->load(keylayoutFilename);

本文分析了Android如何将底层scancode转换为统一的keycode,主要涉及EventHub.cpp、kl文件和KeycodeLabels.h。在KeyLayoutMap.cpp中,Android解析kl文件并将其内容存储在Vector结构中。每个kl文件条目包括BEGIN、SCANCODE、KEYCODE和FLAG四部分。通过KeycodeLabels.h中的数组,将TOKEN转换为对应的keycode值,从而实现按键映射的自定义。
最低0.47元/天 解锁文章
2717

被折叠的 条评论
为什么被折叠?



