android系统触摸屏虚拟按键.docx
- 文档编号:2987422
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:25
- 大小:27.36KB
android系统触摸屏虚拟按键.docx
《android系统触摸屏虚拟按键.docx》由会员分享,可在线阅读,更多相关《android系统触摸屏虚拟按键.docx(25页珍藏版)》请在冰豆网上搜索。
android系统触摸屏虚拟按键
虚拟按键(Virtual Key)是Eclair版本开始增加的新特性。
Virtual Key的功能是利用触摸屏,模拟按键发生的事件,这样就可以利用触摸屏的边缘,实现一些可以自定义的按键效果。
在Android系统中,触摸屏设备发送的是RawInputEvent(原始输入事件),而按键发送的是KeyEvent(按键事件)。
KeyEvent直接发送给应用程序层,RawInputEvent在Android的Java框架中被转换成MotionEvent发送给应用程序层。
在Android系统中虚拟按键的实现方法是:
在某种情况下,将RawInputEvent转换成KeyEvent。
frameworks/base/services/Java/com/android/server目录中的InputDevice.Java文件负责处理虚拟按键的主要文件。
虚拟按键的处理相对简单,需要根据以下文件对虚拟按键的内容进行配置:
/sys/board_properties/virtualkeys.{devicename}
在InputDevice.Java文件中通过readVirtualKeys,对进行消息的转化。
根据配置文件将RawInputEvent转换成按键相关的内容。
virtualkeys.{devicename}是虚拟按键的适配文件,需要在目标文件系统的/sys/board_ properties/目录中。
虚拟按键配置文件的格式如下所示:
0x1:
扫描码:
X:
Y:
W:
H:
0x1:
……
例如,在MSM的mahimahi平台上查看虚拟按键的配置文件如下所示:
# cat /sys/board_properties/virtualkeys.synaptics-rmi-touchscreen
0x01:
158:
55:
835:
90:
55:
0x01:
139:
172:
835:
125:
55:
0x01:
102:
298:
835:
115:
55:
0x01:
217:
412:
835:
95:
55
由此可见,其中定义了4个区域的虚拟按键,它们的Y坐标相同,可见4个按键的矩形区域位于水平的一排。
其转换的扫描码分别为158,139,102,217,分别对应于BACK(返回),MENU(菜单),HOME(主界面),SEARCH(搜索)这4个按键。
另外一个系统的虚拟按键的配置文件如下所示:
$ cat /sys/board_properties/virtualkeys.qtouch-touchscreen
0x01:
139:
90:
936:
116:
104:
0x01:
102:
252:
936:
116:
104:
0x01:
158:
402:
936:
116:
104
其转换的扫描码分别为:
139,102,158,分别对应于MENU(菜单),HOME(主界面),BACK(返回)这3个按键。
提示:
使用虚拟按键转换成为的是按键的扫描码,不是按键码,因此依然需要经过按键布局文件的转化才能得到按键码。
(二)如果按照韩超和梁泉的《Android系统级深入开发——移植与调试》的第八章描述虚拟按键的实现过程如下:
1.硬件分析
我所使用的触摸屏分辨率是1158*768,可视区域大小是1024*768(这也是LCD屏的大小),在触摸屏两侧总有5个按键。
2.触摸屏按键驱动的修改
既然可视区域在触摸屏中间部位,因此需要在触摸屏驱动中修改input_set_abs_params()函数中的参数
1.input_set_abs_params(input_dev, ABS_MT_POSITION_X, 61, 1085, 0, 0);
2.input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, SCREEN_MAX_Y, 0, 0);
其中61是可视区域左侧x轴左边坐标,1085是右侧的。
3.Android框架层
Android上层通过读取触摸屏坐标并经过转算后来识别定义好的虚拟按键,代码位于frameworks/base/services/java/com/android/server/KeyInputQueue.java中:
staticclassVirtualkey{}是负责按键定位的方法;
privatevoidreadVirtualKeys(StringdeviceName)负责读取sys文件,这是最重要的代码,也是与底层sys文件系统沟通的桥梁,它会读取/sys/board_properties/virtualkeys.{deviceName}文件,deviceName一定要与触摸屏设备名称一致,不然会找不到指定的sys文件。
4.sys文件系统
前面讲到了readVirtualKeys会读取sys文件,这个sys文件就是定义虚拟按键的坐标以及键值,它的协议格式是一段字符串,每个按键有六项分别用冒号分割,按键按键之间也是用冒号分割,标准格式是:
键类型:
键值:
按键区域中心x坐标:
按键区域中心y坐标:
按键区域宽:
按键区域高
加载触摸屏以及创建sys文件的代码:
[cpp] viewplaincopy
1. 13px;">#ifdef VIRTUAL_KEYS 2. 3.static ssize_t virtual_keys_show(struct kobject *kobj, 4. 5. struct kobj_attribute *attr, char *buf) 6. 7.{ 8. 9. if (1) { 10. 11. 12. 13. return sprintf(buf, 14. 15. __stringify(EV_KEY) ": " __stringify(KEY_VOLUMEUP) ": 1030: 370: 30: 30" 16. 17. ": " __stringify(EV_KEY) ": " __stringify(KEY_VOLUMEDOWN) ": 1030: 470: 30: 30" 18. 19. ": " __stringify(EV_KEY) ": " __stringify(KEY_BACK) ": 1030: 18: 30: 30" 20. 21. ": " __stringify(EV_KEY) ": " __stringify(KEY_HOME) ": 1030: 136: 30: 30" 22. 23. ": " __stringify(EV_KEY) ": " __stringify(KEY_MENU) ": 1030: 236: 30: 30" 24. 25. "\n"); 26. 27. } else { 28. 29. 30. 31. } 32. 33.} 34. 35. 36. 37.static struct kobj_attribute virtual_keys_attr = { 38. 39. .attr = { 40. 41. .name = "virtualkeys.xxxx", 42. 43. .mode = S_IRUGO, 44. 45. }, 46. 47. .show = &virtual_keys_show, 48. 49.}; 50. 51. 52. 53.static struct attribute *properties_attrs[] = { 54. 55. &virtual_keys_attr.attr, 56. 57. NULL 58. 59.}; 60. 61. 62. 63.static struct attribute_group properties_attr_group = { 64. 65. .attrs = properties_attrs, 66. 67.}; 68. 69. 70. 71.static void virtual_keys_init(void) 72. 73.{ 74. 75. int ret; 76. 77. struct kobject *properties_kobj; 78. 79. 80. 81. properties_kobj = kobject_create_and_add("board_properties", NULL); 82. 83. if (properties_kobj) 84. 85. ret = sysfs_create_group(properties_kobj, 86. 87. &properties_attr_group); 88. 89. if (! properties_kobj || ret) 90. 91. pr_err("failed to create board_properties\n"); 92. 93.} 94.#endif 95.
其中.name="virtualkeys.xxxx"的xxxx就是触摸屏设备名称,也就是前面说到的{deviceName},virtual_keys_init()函数可以在触摸屏probe函数中调用。
另外,我将可视区域左侧的两侧按键移到了右侧实现,因此五个按键区域中心x坐标都是一样,这部分要在触摸屏驱动增加x轴坐标调整,这部分我就不再说明。
以上步骤完成后可以使用cat/sys/board_properties/virtualkeys.{deviceName}查看虚拟按键的配置文件,并试试按下触摸屏上按键是否有反应,如果坐标不正确还要进行耐心地校准。
具体的可以去HTC网站(
(三)但是我用的是四线电阻触摸屏,用上面的方式好像没有任何反应,所以我采用最直接的方式用input_event发送按键消息,就是在触摸屏处理芯片TSC2007驱动中当读到一定范围内的触摸事件就发送按键消息:
这种方式只要修改TSC2007驱动的几个地方:
1.定义全局局部变量用于记录是否有虚拟按键按下
[cpp] viewplaincopy
1.static int backkeydown=0;
2.static int homekeydown=0;
3.static int menukeydown=0;
2..在prope函数中添加
[cpp] view
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 系统 触摸屏 虚拟 按键