android系统触摸屏虚拟按键.docx

上传人:b****3 文档编号:2987422 上传时间:2022-11-16 格式:DOCX 页数:25 大小:27.36KB
下载 相关 举报
android系统触摸屏虚拟按键.docx_第1页
第1页 / 共25页
android系统触摸屏虚拟按键.docx_第2页
第2页 / 共25页
android系统触摸屏虚拟按键.docx_第3页
第3页 / 共25页
android系统触摸屏虚拟按键.docx_第4页
第4页 / 共25页
android系统触摸屏虚拟按键.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

android系统触摸屏虚拟按键.docx

《android系统触摸屏虚拟按键.docx》由会员分享,可在线阅读,更多相关《android系统触摸屏虚拟按键.docx(25页珍藏版)》请在冰豆网上搜索。

android系统触摸屏虚拟按键.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1