android系统触摸屏虚拟按键.pdf
《android系统触摸屏虚拟按键.pdf》由会员分享,可在线阅读,更多相关《android系统触摸屏虚拟按键.pdf(19页珍藏版)》请在三一文库上搜索。
1、虚拟按键( Virtual Key )是 Eclair 版本开始增加的新特性。Virtual Key的功能是利用触 摸屏, 模拟按键发生的事件,这样就可以利用触摸屏的边缘,实现一些可以自定义的按键效 果。 在 Android 系统中,触摸屏设备发送的是RawInputEvent (原始输入事件),而按键发送的 是 KeyEvent (按键事件)。 KeyEvent直接发送给应用程序层,RawInputEvent在 Android 的 Java 框架中被转换成MotionEvent发送给应用程序层。 在 Android 系统中虚拟按键的实现方法是:在某种情况下,将RawInputEvent转换成
2、 KeyEvent 。 frameworks/base/services/Java/com/android/server目录中的InputDevice.Java文件负责 处理虚拟按键的主要文件。 虚拟按键的处理相对简单,需要根据以下文件对虚拟按键的内容进行配置: /sys/board_properties/virtualkeys.devicename 在 InputDevice.Java文件中通过readVirtualKeys,对进行消息的转化。根据配置文件将 RawInputEvent转换成按键相关的内容。 virtualkeys.devicename是虚拟按键的适配文件,需要在目标文件系统
3、的 /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:41 2:835:95:55 由此可见,其中定义了4 个区域的虚拟按键,它们的Y 坐标相同,可
4、见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(菜单)
5、,HOME(主界面) , BACK (返回)这3 个按键。 提示: 使用虚拟按键转换成为的是按键的扫描码,不是按键码, 因此依然需要经过按键布局 文件的转化才能得到按键码。 (二) 如果按照韩超和梁泉的 Android 系统级深入开发 移植与调试 的第八章描述虚拟按键的实 现过程如下: 1.硬件分析 我所使用的触摸屏分辨率是1158*768 ,可视区域大小是1024*768 (这也是LCD 屏的大小), 在触摸屏两侧总有5 个按键。 2.触摸屏按键驱动的修改 既然可视区域在触摸屏中间部位,因此需要在触摸屏驱动中修改input_set_abs_params()函数 中的参数 1. input_s
6、et_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中: s
7、tatic class Virtualkey是负责按键定位的方法; private void readVirtualKeys(String deviceName)负责读取 sys 文件,这是最重要的代码,也是 与底层 sys 文件系统沟通的桥梁,它会读取/sys/board_properties/virtualkeys.deviceName文 件, deviceName一定要与触摸屏设备名称一致,不然会找不到指定的sys 文件。 4.sys文件系统 前面讲到了readVirtualKeys会读取 sys 文件,这个 sys 文件就是定义虚拟按键的坐标以及键值, 它的协议格式是一段字符串,每个按
8、键有六项分别用冒号分割,按键按键之间也是用冒号分割, 标准格式是: 键类型 :键值 :按键区域中心x 坐标 :按键区域中心y 坐标 :按键区域宽 :按键区域高 加载触摸屏以及创建sys 文件的代码: cppview plaincopy 1.#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
9、. 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.
10、 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.staticstruct kobj_attribute virtual_keys_attr = 38. 39. .attr = 40. 41. .name = “virtualkeys.xxxx“, 42. 43. .mode = S_IRUGO, 44. 45. , 46. 47. .show = 50. 51. 52. 53
11、.staticstruct attribute *properties_attrs = 54. 55. 60. 61. 62. 63.staticstruct attribute_group properties_attr_group = 64. 65. .attrs = properties_attrs, 66. 67.; 68. 69. 70. 71.staticvoid virtual_keys_init(void ) 72. 73. 74. 75.int ret; 76. 77.struct kobject *properties_kobj; 78. 79. 80. 81. prope
12、rties_kobj = kobject_create_and_add(“board_properties“, NULL); 82. 83.if (properties_kobj) 84. 85. ret = sysfs_create_group(properties_kobj, 86. 87. 88. 89.if (!properties_kobj | ret) 90. 91. pr_err(“failed to create board_propertiesn“); 92. 93. 94.#endif 95. 其中 .name = “virtualkeys.xxxx“的 xxxx 就是触摸
13、屏设备名称,也就是前面说到的 deviceName,virtual_keys_init()函数可以在触摸屏probe 函数中调用。另外,我将可视区域 左侧的两侧按键移到了右侧实现,因此五个按键区域中心x 坐标都是一样, 这部分要在触摸屏驱 动增加 x 轴坐标调整,这部分我就不再说明。以上步骤完成后可以使用cat /sys/board_properties/virtualkeys.deviceName查看虚拟按键的配置文件,并试试按下触摸屏 上按键是否有反应,如果坐标不正确还要进行耐心地校准。 具体的可以去HTC 网站 (http:/ HTC 手机的 linux 源码, HTC 很多款手机的BA
14、CK,MENU,HOME,SEARCH电容屏虚拟按键都是采用这种方式实 现的。 (三) 但是我用的是四线电阻触摸屏,用上面的方式好像没有任何反应,所以我采用最直接的 方式用 input_event发送按键消息,就是在触摸屏处理芯片TSC2007驱动中当读到一定范围内 的触摸事件就发送按键消息:这种方式只要修改TSC2007 驱动的几个地方: 1.定义全局局部变量用于记录是否有虚拟按键按下 cppview plaincopy 1.staticint backkeydown=0; 2.staticint homekeydown=0; 3.staticint menukeydown=0; 2在 pr
15、ope 函数中添加 cppview plaincopy 1.set_bit(EV_SYN, input_dev-evbit); 2.set_bit(KEY_HOME, input_dev-keybit); 3./set_bit(KEY_SEARCH, input_dev-keybit); 4.set_bit(KEY_BACK, input_dev-keybit); 5.set_bit(KEY_MENU, input_dev-keybit); 3.在中断处理work 里面添加按键按下消息 cppview plaincopy 1.if (tc.y=81) you can redistribute
16、it and/or modify 19. * it under the terms of the GNU General Public License version 2 as 20. * published by the Free Software Foundation. 21. */ 22. 23.#include 24.#include 25.#include 26.#include 27.#include 28.#include 29. 30.#define TS_POLL_DELAY 1 /* ms delay between samples */ 31.#define TS_POL
17、L_PERIOD 1 /* ms delay between samples */ 32. 33.#define TSC2007_MEASURE_TEMP0 (0x0 client, cmd); 96.if (data client-dev, “i2c io error: %dn“, data); 98.return data; 99. 100. 101./* The protocol and raw data format from i2c interface: 102. * S Addr Wr A Comm A S Addr Rd A DataLow A DataHigh NA P 103
18、. * Where DataLow has D11-D4, DataHigh has D3-D0 4; 106. 107. dev_dbg( 108. 109.return val; 110. 111. 112.staticvoid tsc2007_read_values(struct tsc2007 *tsc, struct ts_event *tc) 113. 114./* y- still on; turn on only y+ (and ADC) */ 115. tc-y = tsc2007_xfer(tsc, READ_Y); 116. 117./* turn y- off, x+
19、on, then leave in lowpower */ 118. tc-x = tsc2007_xfer(tsc, READ_X); 119. 120./* turn y+ off, x- on; well use formula #1 */ 121. tc-z1 = tsc2007_xfer(tsc, READ_Z1); 122. tc-z2 = tsc2007_xfer(tsc, READ_Z2); 123./printk(“x=%d,y=%dn“,tc-x,tc-y); 124./* Prepare for next touch reading - power down ADC, e
20、nable PENIRQ */ 125. tsc2007_xfer(tsc, PWRDOWN); 126. 127. 128.static u32 tsc2007_calculate_pressure(struct tsc2007 *tsc, struct ts_event *tc) 129. 130. u32 rt = 0; 131. 132./* range filtering */ 133.if (tc-x = MAX_12BIT) 134. tc-x = 0; 135. 136.if (likely(tc-x 139. rt *= tc-x; 140. rt *= tsc-x_plat
21、e_ohms; 141. rt /= tc-z1; 142. rt = (rt + 2047) 12; 143. 144. 145.return rt; 146. 147. 148.staticvoid tsc2007_send_up_event(struct tsc2007 *tsc) 149. 150.struct input_dev *input = tsc-input; 151. 152. dev_dbg( 153.if (backkeydown=1) 154. 155. backkeydown=0; 156. input_event(input, EV_KEY, KEY_BACK,
22、0); 157./printk(“back key upn“); 158. 159.if (homekeydown=1) 160. 161. homekeydown=0; 162. input_event(input, EV_KEY, KEY_HOME, 0); 163./printk(“home key upn“); 164. 165.if (menukeydown=1) 166. 167. menukeydown=0; 168. input_event(input, EV_KEY, KEY_MENU, 0); 169./printk(“menu key upn“); 170. 171. i
23、nput_report_key(input, BTN_TOUCH, 0); 172. input_report_abs(input, ABS_PRESSURE, 0); 173. input_sync(input); 174. 175. 176.staticvoid tsc2007_work(struct work_struct *work) 177. 178.struct tsc2007 *ts = 179. container_of(to_delayed_work(work), struct tsc2007, work); 180.struct ts_event tc; 181. u32
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 系统 触摸屏 虚拟 按键
链接地址:https://www.31doc.com/p-5012093.html