Android 虚拟按键上报

概述

 本文主要讲述触摸屏上可能用到的虚拟按键menuhomereturn,底层驱动的实现和相关实现原理,其中和上层有联系的只是概述。

两种实现方式

 对于触摸按键的发送可以分为两种方法:一是android提供的 virtualkey's 架构方法,一种是直接报告key event的方法。

报告keyevent方法

在驱动中添加所支持的按键类型,报告支持事件类型

__set_bit(EV_SYN, input_dev->evbit);  //同步事件

__set_bit(EV_KEY, input_dev->evbit);  //按键事件

报告支持的按键

__set_bit(KEY_HOME, input_dev->keybit);  // home按键

__set_bit(KEY_BACK, input_dev->keybit);  // back按键

__set_bit(KEY_MENU, input_dev->keybit);  // menu按键

触摸屏上的三个按键对应的坐标

(KEY_BACK) 120:1400

(KEY_HOME) 360:1400

(KEY_MENU) 500:1400

keyevent的报告方法很简单只要报告相应的 key 和设备同步sync就可以了

static void ft5x0x_report_value(struct ft5x0x_ts_data *data)
{
	struct ts_event *event = &data->event;
	int i;
	for (i = 0; i < event->touch_point; i++)
	{
		if (event->au16_y[i]==1400)
		{
			if(event->au8_touch_event[i]== 0 || event->au8_touch_event[i] == 2)
			{
				switch(event->au16_x[i])
				{
				case 120:
					input_report_key(data->input_dev, KEY_BACK, 1);
					break;
				case 360: 
					input_report_key(data->input_dev, KEY_HOME, 1);
					break;
				case 500: 
					input_report_key(data->input_dev, KEY_MENU, 1);
					break;	
				default: break;
				}
			}
			else
			{
				switch(event->au16_x[i])
				{
				case 120:
					input_report_key(data->input_dev, KEY_BACK, 0);
					break;
				case 360: 
					input_report_key(data->input_dev, KEY_HOME, 0);
					break;
				case 500: 
					input_report_key(data->input_dev, KEY_MENU, 0);
					break;	
				default: break;
				}
			}
			input_sync(data->input_dev);
			return;
		}
}

       首先看最外围的for循环,可以看出:上报次数就是触摸屏检测到的点数,当然不会超出触摸屏最大支持的点数。并且每次上报完毕,都会发送一个同步事件 input_sync(),来表示此时上报结束。

       里面的if (event->au16_y[i]==1400) 是在判断触摸点的y轴坐标,一般来说虚拟按键的位置都在一排上,因此必定会有一个轴的坐标是相同的,这里明显三个虚拟按键的y轴坐标相同。

       这个判断if(event->au8_touch_event[i]== 0 || event->au8_touch_event[i] =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值