`
sony-soft
  • 浏览: 1007938 次
文章分类
社区版块
存档分类
最新评论

android虚拟按键

 
阅读更多

android标准键盘是有 HOME,MENU,BACK,SEARCH等,但是同时要保持工业设计。nexus one没有用普通按键用触摸屏实现,

显示屏是800X480,但是在电容触摸屏是8xx*480的就是比800要大的地方就变成了虚拟按键,模拟了android标准按键。

1方案

要实现虚拟按键,在android里面是靠两层协助实现,底层要把虚拟按键在比显示屏多出的地方规定好虚拟按键的位置大小以及键值等,给上层

一文件接口。上层java层启动一个服务来读取这一区域的按键响应,这样就是大体的架构。具体实现如下:

1.1 底层虚拟按键功能实现方案

简而言之,就是在内核中把虚拟按键的所有信息通过sys文件系统的方式给上层,sys文件系统的路径是约定好的所以代码如下实现。给出信息的

协议格式是一段连续的字符串,每个按键有六项分别用冒号分割,按键按键之间也是用冒号分割,六项按顺序分别是:

键类型:键值:按键区域中心x坐标:按键区域中心y坐标:按键区域宽:按键区域高

arch/arm/mach-msm/board-mahimahi.c

static ssize_t mahimahi_virtual_keys_show(struct kobject *kobj,
			       struct kobj_attribute *attr, char *buf)
{
	if (system_rev > 2) {
		/* center: x: back: 55, menu: 172, home: 298, search 412, y: 835 */
		return sprintf(buf,
			__stringify(EV_KEY) ":" __stringify(KEY_BACK)  ":55:835:90:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU)   ":172:835:125:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME)   ":298:835:115:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":412:835:95:55"
		   "/n");
	} else {
		/* center: x: home: 55, menu: 185, back: 305, search 425, y: 835 */
		return sprintf(buf,
			__stringify(EV_KEY) ":" __stringify(KEY_HOME)  ":55:835:70:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU)   ":185:835:100:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK)   ":305:835:70:55"
		   ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":425:835:70:55"
		   "/n");
	}
}

static struct kobj_attribute mahimahi_virtual_keys_attr = {
	.attr = {
		.name = "virtualkeys.synaptics-rmi-touchscreen",
		.mode = S_IRUGO,
	},
	.show = &mahimahi_virtual_keys_show,
};

static struct attribute *mahimahi_properties_attrs[] = {
	&mahimahi_virtual_keys_attr.attr,
	NULL
};

static struct attribute_group mahimahi_properties_attr_group = {
	.attrs = mahimahi_properties_attrs,
};

struct kobject *properties_kobj;

properties_kobj = kobject_create_and_add("board_properties", NULL);
if (properties_kobj)
	ret = sysfs_create_group(properties_kobj,
					 &mahimahi_properties_attr_group);
if (!properties_kobj || ret)
	pr_err("failed to create board_properties/n");

在Android系统中,触摸屏设备发送的是RawInputEvent(原始输入事件),而按键发送的是KeyEvent(按键事件)。KeyEvent直接发送给应用程序层,RawInputEvent在Android的Java框架中被转换成MotionEvent发送给应用程序层。

在Android系统中虚拟按键的实现方法是:在某种情况下,将RawInputEvent转换成KeyEvent。

frameworks/base/services/Java/com/android/server目录中的InputDevice.Java文件负责处理虚拟按键的主要文件。

虚拟按键的处理相对简单,需要根据以下文件对虚拟按键的内容进行配置:

  1. /sys/board_properties/virtualkeys.{devicename}

在InputDevice.Java文件中通过readVirtualKeys,对进行消息的转化。根据配置文件将RawInputEvent转换成按键相关的内容。

virtualkeys.{devicename}是虚拟按键的适配文件,需要在目标文件系统的/sys/board_ properties/目录中。

虚拟按键配置文件的格式如下所示:

  1. 0x1:扫描码:X:Y:W:H:0x1:……

例如,在MSM的mahimahi平台上查看虚拟按键的配置文件如下所示:

  1. #cat/sys/board_properties/virtualkeys.synaptics-rmi-touchscreen
  2. 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个按键。

另外一个系统的虚拟按键的配置文件如下所示:

  1. $cat/sys/board_properties/virtualkeys.qtouch-touchscreen
  2. 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个按键。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics