版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
android实现触摸屏校准1.触摸校准算法a触摸屏校准通用方法。.(XL,YL是显示屏坐标,XT,YT是触摸屏坐标,)XL=XT*A+YT*B+CYL=YT*D+YT*E+Fb由于具体计算是希望是整数运算,所以实际中保存的ABCDEF为整数,而增加一个参数DivXL=(XT*A+YT*B+C)/DivYL=(YT*D+YT*E+F)/DivC.TSLIB把以上的7个参数ABCDEFDiv保存在pointercal文件中。不校准的数据:A=1,B=0,C=0,D=0,E=1,F=0,Div=1ABCDEFDiv-41137818-3636780-513253947065584655362.Android事件处理机制android事件的传入是从EventHub开始的,EventHub是事件的抽象结构,维护着系统设备的运行情况(设备文件放在/dev/input里),设备类型包括Keyboard、TouchScreen、TraceBall。它在系统启动的时候会通过open_device方法将系统提供的输入设备都增加到这个抽象结构中,并维护一个所有输入设备的文件描述符,如果输入设备是键盘的话还会读取/system/usr/keylayout/目录下对应键盘设备的映射文件(修改./development/emulator/keymaps/qwerty.kl来改变键值的映射关系),另外getEvent方法是对EventHub中的设备文件描述符使用poll操作等侍驱动层事件的发生,如果发生的事件是键盘事件,则调用Map函数按照映射文件转换成相应的键值并将扫描码和键码返回给KeyInputQueue.frameworks/base/services/jni/com_android_server_KeyInputQueue.cpp根据事件的类型以及事件值进行判断处理,从而确定这个事件对应的设备状态是否发生了改变并相应的改变对这个设备的描述结构InputDevice。C.Windowmanager会创建一个线程(InputDispatcherThread),在这个线程里从事件队列中读取发生的事件 (QueuedEventev=mQueue.getEvent()),并
根据读取到事件类型的不同分成三类(KEYBOARD、TOUCHSCREEN、TRACKBALL),分别进行处理,例如键盘事件会调用dispatchKey((KeyEvent)ev.event,0,0)以将事件通过Binder发送给具有焦点的窗口应用程序,然后调用mQueue.recycleEvent(ev)继续等侍键盘事件的发生;如果是触摸屏事件则调用dispatchPointer(ev,(MotionEvent)ev.event,0,0),这里会根据事件的种类(UP、DOWN、MOVE、OUT_SIDE等)进行判断并处理,比如Cancel或将事件发送到具有权限的指定的窗口中去;移植方案a Android本身并不带触摸屏校准。Android获取到的数据就是驱动■上报的原始数据。b.方案一:移植TSLIB,通过TSLIB产生pointercal校准参数文件。C.方案一:从Android框架层获取OnTouch事件产生pointercal校准参数文件d方案一:数据的校准在驱动中完成。即把pointercal的参数数据通过某种方式(sysfs)传递给驱动程序进行校准。e方案二:驱动上报原始点,原始点在框架层拦截后进行校验处理。TSLIB移植过程修改源码以适应android的文件结构。设定Android.mk编译选项,生成库即应用。etc/ts.confmodule_rawinputsrc/ts_config.c#defineTS_CONF"/system/etc/ts.conf”src/ts_load_module.cchar*plugin_directory="/system/lib/ts/plugins/";iv.tests/fbutils.civ.5.v.vi.vii.框架内获取参数文件5.v.vi.vii.框架内获取参数文件char*defaultfbdevice="/dev/graphics/fb0”;COPYts.conf到/system/etc/ts.confinit.rc.mkdir/data/etc/pointercal通过ts_calibrate产生pointercal数据文件。a.制作APK应用,仿效ts_calibrate米点并计算出各参数,产生pointercal6.框架内实现触摸屏校准在InputDevive.java中拦截触摸屏原始数据进行pointercal参数校验后再分发7.驱动内实现触摸屏校准 一a.在init.rc中添加event,在触摸屏加载后把pointercal参数输送给驱动。8.结果-效果实现细节:扩展init-proper_serivce系统支持的属性权限,对自定义的特殊系统属性进行权限开放。使用自定义系统属性在init.rc中onproperty事件中处理pointercal的读写权限。使用自定义系统属性触摸屏校准程序.apk和InputDevice.java中的输入事件的同步。(在触摸屏校准期间inputDevice在输入事件中不能采用算法。校准程序完成有inputDevice重新启用校准算法)模拟器中至今无法进入device.absX/Y!=null的代码,需要了解以下inputDevice被调用的步骤。触摸屏的时间流程:驱动层:module_param_array(abs_y,int,NULL,0);MODULE_PARM_DESC(abs_y,"TouchscreenabsoluteYmin,max,fuzz');staticintabs_p[3]=(0,150,4};module_param_array(abs_p,int,NULL,0);MODULE_PARM_DESC(abs_p,"TouchscreenabsolutePressuremin,max,fuzz");/**对设备进行初始化设置*/set_bit(EV_ABS,wm->input_dev->evbit);set_bit(ABS_X,wm->input_dev->absbit);set_bit(ABS_Y,wm->input_dev->absbit);set_bit(ABS_PRESSURE,wm->input_dev->absbit);input_set_abs_params(wm->input_dev,ABS_X,abs_x[0],abs_x[1],abs_x[2],0);input_set_abs_params(wm->input_dev,ABS_Y,abs_y[0],abs_y[1],abs_y[2],0);input_set_abs_params(wm->input_dev,ABS_PRESSURE,abs_p[0],abs_p[1],abs_p[2],0);/**事件发生时,提供原始点*/input_report_abs(wm->input_dev,ABS_X,data.x&0xfff);input_report_abs(wm->input_dev,ABS_Y,data.y&0xfff);input_report_abs(wm->input_dev,ABS_PRESSURE,data.p&0xfff);/**提供给驱动外查询input_dev的接口structinput_absinfoinfo;ioctl(fd,EVIOCGABS(axis),&info)srcfile:evDev.c*/if((_IOC_NR(cmd)&~ABS_MAX)==_IOC_NR(EVIOCGABS(0)))(t=_IOC_NR(cmd)&ABS_MAX;abs.value=dev->abs[t];abs.minimum=dev->absmin[t];abs.maximum=dev->absmax[t];abs.fuzz=dev->absfuzz[t];abs.flat=dev->absflat[t];Android底层驱动EventHub.cppstaticconstchar*device_path="/dev/input";openPlatformInput(void)scan_dir(device_path);open_device(devname);fd=open(deviceName,O_RDWR);/*对外接口,getEvent,inotify监控device_path目录,使用poll机制轮询inotify和各个输入设备的可用状态。解析事件或输入信息,放入各个传出参数中。*/boolEventHub::getEvent(int32_t*outDeviceId,int32_t*outType,int32_t*outScancode,int32_t*outKeycode,uint32_t*outFlags,int32_t*outValue,nsecs_t*outWhen)JNI部分:com_android_server_KeyInputQueue.cpp.提供接口staticJNINativeMethodgInputMethods[]=(/*name,signature,funcPtr*/("readEvent”,〃(Landroid/view/RawInputEvent;)Z〃,(void*)android_server_KeyInputQueue_readEvent),("getDeviceClasses","(I)I",(void*)android_server_KeyInputQueue_getDeviceClasses),("getDeviceName",〃(I)Ljava/lang/String;〃,(void*)android_server_KeyInputQueue_getDeviceName),("getAbsoluteInfo",”(IILcom/android/server/InputDevice$AbsoluteInfo;)Z”,(void*)android_server_KeyInputQueue_getAbsoluteInfo),("getSwitchState","(I)I",(void*)android_server_KeyInputQueue_getSwitchState),("getSwitchState","(II)I",(void*)android_server_KeyInputQueue_getSwitchStateDevice),("getScancodeState”,〃⑴I”,(void*)android_server_KeyInputQueue_getScancodeState),("getScancodeState”,"(II)I",(void*)android_server_KeyInputQueue_getScancodeStateDevice),("getKeycodeState”,"(I)I",(void*)android_server_KeyInputQueue_getKeycodeState),("getKeycodeState”,"(II)I",(void*)android_server_KeyInputQueue_getKeycodeStateDevice),{"hasKeys",〃([I[Z)Z〃,(void*)android_server_KeyInputQueue_hasKeys),};javaservice部分:KeyInputQueue.java.循环查询输入设备信息或目录状态并处理ThreadmThread=newThread("InputDeviceReader")(publicvoidrun()(android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);try(RawInputEventev=newRawInputEvent();while(true)(InputDevicedi;//block,doesn'treleasethemonitorreadEvent(ev);booleansend=false;booleanconfigChanged=false;〃检测到新设备后if(ev.type==RawInputEvent.EV_DEVICE_ADDED)(synchronized(mFirst)(di=newInputDevice(ev.deviceId);mDevices.put(ev.deviceId,di);configChanged=true;}}//对触摸屏设备InputDevice.AbsoluteInfoabsX;InputDevice.AbsoluteInfoabsY;InputDevice.AbsoluteInfoabsPressure;InputDevice.AbsoluteInfoabsSize;if((classes&RawInputEvent.CLASS_TOUCHSCREEN)!=0)(absX=loadAbsoluteInfo(deviceId,RawInputEvent.ABS_X,〃X〃);absY=loadAbsoluteInfo(deviceId,RawInputEvent.ABS_Y,"Y");absPressure=loadAbsoluteInfo(deviceId,RawInputEvent.ABS_PRESSURE,"Pressure");absSize=loadAbsoluteInfo(deviceId,RawInputEvent.ABS_TOOL_WIDTH,"Size");}else(absX=null;absY=null;absPressure=null;absSize=null;}returnnewInputDevice(deviceId,classes,name,absX,absY,absPressure,absSize);我们对触摸屏的数据修订是在InputDevice.java中基于absX,absY,absPressure!=null的状态下的,当绝对原始点数据从驱动报上来之后,传递到InputDevice.java经过我们的校准后再dispatch出去到windowManager->activity。这样就是起到了校准效果。需要注意的补助说明EventHub中有使用IOCTL对触摸屏的EVIOCGABS(axis)进行了采样,取出内容structinput_absinfoinfo;structinput_absinfo(__s32value;__s32minimum;__s32maximum;__s32fuzz;__s32flat;__s32resolution;};#defineEVIOCGABS(abs) _IOR('E',0x40+abs,structinput_absinfo) /*getabsvalue/limits*/取出的是触摸屏的最大值,最小值等,这些值在com_android_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度新能源技术股份合作开发合同3篇
- 2025年度离婚协议中未成年人监护权及抚养权争议调解书6篇
- 二零二五年供用电合同担保与电力设施建设合作协议3篇
- 淘宝小白运营课程设计
- 2025版绿色食品认证家禽养殖订购协议
- 2025年度新型城镇化项目验收委托合同3篇
- 二零二五年度多功能办公用品定制加工合作协议3篇
- 二零二五年度影视剧临时演员表演权益合同3篇
- 机械操作工安全技术操作规程(3篇)
- 2025年建筑施工企业安全生产许可证制度(2篇)
- 上海某建筑基础及上部结构加固工程施工方案砖木结构 砖混结构
- 停车场施工施工组织设计方案
- GB/T 21385-2008金属密封球阀
- GB/T 18994-2003电子工业用气体高纯氯
- 超分子化学简介课件
- 文言文阅读训练:《三国志-武帝纪》(附答案解析与译文)
- (完整版)招聘面试方案设计与研究毕业论文设计
- 调休单、加班申请单
- 肉制品生产企业名录296家
- 规划设计收费标准
- 山区道路安全驾驶教案
评论
0/150
提交评论