资源描述:
《底层按键程序-android版》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、底层按键程序-Android版一、Android中按键为什么需要进行转换?与用户交互的输入设备(触摸屏,键盘等)是获取用户意图的來源。由于硬件本身的物理特性及由各大硬件厂商的标准不一,这将导致我们从设备上获取到的键值存在一定的差异性,为了让系统能够正确处理用户的操作,我们就必须将从输入设备上获取到的键值正确转换为Android系统定义的键值以便正确处理。二、Android中按键输入转换过程扫描键码Scancode是由Linux的input驱动定义的整形类型,扫描键码根据读取的kl配置文档内容的转化后,形成按键的
2、标签KeycodeLaybeL按键的标签在经过数组KEYCODES的转换后形成keycodeo应用程序对keycode进行处理。Android默认提供的按键布局文件主要包括qwerty.kl和AVRCP.kl(/system/usr/keylayout/目录下)。Qwerty.kl为全键盘的布局文件,是系统中默认使用的布局文件,AVRCP.kl用于多媒体控制。三、Linux中按键定义的数据结构3.1Linux中input_event结构体(定义按键在linux/input.h中)structinput_even
3、t{structtimevaltime;//按键时间—u16type;//类型,在下面有定义—ul6code;//要模拟成什么按键—s32value;//是按下还是释放};1>Code事件的代码•如果事件的类型代码是EV_KEY?该代码code为设备键盘代码.代码值0-127为键盘上的按键代码,0x110-0x116为鼠标上按键代码,其中0xll0(BTN_LEFT)为鼠标左键,Oxlll(BTN_RIGHT)为鼠标右键,0xll2(BTN_MIDDLE)为鼠标中键.如果事件的类型代码是EV_REL,code值
4、表示轨迹的类型•如指示鼠标的X轴方向REL_X(代码为0x00)才旨示鼠标的Y轴方向REL_Y(代码为0x0。指示鼠标中轮子方向REl__WHEEL(代码为0x08).其它代码含义请参看include/linux/input.h文件.2、Type/*Eventtypes参考值*/#defineEV_SYN0x00#defineEV_KEY0x01〃按键常用的用红色标记出来#defineEV_REL0x02〃相对坐标(轨迹球)#defineEV_ABS0x03〃绝对坐标(鼠标)#defineEV_MSC0x04〃
5、其他#defineEVSW0x05#defineEV_LEDOxll//LED#defineEV_SND0x12〃声音#defineEV_REP0xl4//repeat#defineEV_FF0x15#defineEV_PWR0x16#defineEV_FF_STATUS0x17#defineEV_MAXOxlf#defineEV_CNT(EV_MAX+1)3、Value事件的值•如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_REL,value的正数值和负数值分别
6、代表两个不同方向的值.3.2AndroidRawEvent结构体Android中将从底层获取到的按键按照一定规则处理后,用如下结构描述:/*AraweventasretrievedfromtheEventHub.*/structRawEvent{nsecs_twhen;〃时间int32_tdeviceld;〃设备IDint32_ttype;//Keyboard>TouchScreen、TraceBallint32_tscanCode;〃扫描键码int32_tkeyCode;〃按键码int32_tvalue;ui
7、nt32_tflags;};类型,四、Linux层获取event的原理对eventX进行read/write来抓取event的各种信息;1>打开event设备eventO_fd=open(a/dev/input/eventOz,,O_RDWR);2>read设备rd=read(eventO_fd,&eventO,sizeof(structinput__event)*64);3、判断事件类型如果,(event[i].type==3&&event[i].code==0),为鼠标位置的x坐标值
8、;(event[i].type==3&&event[i].code==1),为鼠标位置的y坐标值;女口果,(event[i].type==1&&event[i].value==1),为按下key;(event[i].type==1&&event[i].value==0),为松开key;如果,(event[i].type==其它事件(如轨迹