




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、转Android触摸屏校准程序的实现一,触摸校准算法触摸屏校准通用方法。(XL,YL是显示屏坐标,XT,YT是触摸屏坐标,)XL=XT*A+YT*B+CYL=XT*D+YT*E+F由于具体计算是希望是整数运算,所以实际中保存的ABCDEF为整数,而增加一个参数DivXL=(XT*A+YT*B+C)/DivYL=(YT*D+YT*E+F)/DivTSLIB把以上的7个参数ABCDEFDiv保存在pointercal文件中。不校准的数据:A=1,B=0,C=0,D=0,E=1,F=0,Div=1ABCDEFDiv-41137818-3636780-51325394706558465536二,And
2、roid事件处理机制android事件的传入是从EventHub开始的,EventHub是事件的抽象结构,维护着系统设备的运行情况(设备文件放在/dev/input里),设备类型包括Keyboard、TouchScreen、TraceBall。它在系统启动的时候会通过open_device方法将系统提供的输入设备都增加到这个抽象结构中,并维护一个所有输入设备的文件描述符,如果输入设备是键盘的话还会读取/system/usr/keylayout/目录下对应键盘设备的映射文件(修改./development/emulator/keymaps/qwerty.kl来改变键值的映射关系),另外getEv
3、ent方法是对EventHub中的设备文件描述符使用poll操作等侍驱动层事件的发生,如果发生的事件是键盘事件,则调用Map函数按照映射文件转换成相应的键值并将扫描码和键码返回给KeyInputQueue.frameworks/base/services/jni/com_android_server_KeyInputQueue.cpp根据事件的类型以及事件值进行判断处理,从而确定这个事件对应的设备状态是否发生了改变并相应的改变对这个设备的描述结构InputDevice。Windowmanager会创建一个线程(InputDispatcherThread),在这个线程里从事件队列中读取发生的事件
4、(QueuedEventev=mQueue.getEvent(),并根据读取到事件类型的不同分成三类(KEYBOARD.TOUCHSCREEN、TRACKBALL),分另1进行处理,例如键盘事件会调用dispatchKey(KeyEvent)ev.event,0,0)以将事件通过Binder发送给具有焦点的窗口应用程序,然后调用mQueue.recycleEvent(ev)继续等侍键盘事件的发生;如果是触摸屏事件则调用dispatchPointer(ev,(MotionEvent)ev.event,0,0),这里会根据事件的种类(UP、DOWN、MOVE、OUT_SIDE等)进行判断并处理,比
5、如Cancel或将事件发送到具有权限的指定的窗口中去;移植方案Android本身并不带触摸屏校准。Android获取到的数据就是驱动上报的原始数据。方案一:移植TSLIB,通过TSLIB产生pointercal校准参数文件。方案二:从Android框架层获取OnTouch事件产生pointercal校准参数文件方案一:数据的校准在驱动中完成。即把pointercal的参数数据通过某种方式(sysfs)传递给驱动程序进行校准。方案二:驱动上报原始点,原始点在框架层拦截后进行校验处理。TSLIB移植过程修改源码以适应android的文件结构。设定Android.mk编译选项,生成库即应用。etc/
6、ts.confmodule_rawinputsrc/ts_config.c#defineTS_CONF/system/etc/ts.confsrc/ts_load_module.cchar*plugin_directory=/system/lib/ts/plugins/;tests/fbutils.cchar*defaultfbdevice=/dev/graphics/fb0;COPYts.conf到/system/etc/ts.confinit.rc.mkdir/data/etc/pointercal通过ts_calibrate产生pointercal数据文件。框架内获取参数文件制作APK应
7、用,仿效ts_calibrate采点并计算出各参数,产生pointercal框架内实现触摸屏校准在InputDevive.java中拦截触摸屏原始数据进行pointercal参数校验后再分发驱动内实现触摸屏校准在init.rc中添加event,在触摸屏加载后把pointercal参数输送给驱动。结果-效果实现细节:扩展init-proper_serivce系统支持的属性权限,对自定义的特殊系统属性进行权限开放。使用自定义系统属性在init.rc中onproperty事件中处理pointercal的读写权限。使用自定义系统属性触摸屏校准程序.apk和InputDevice.java中的输入事件的
8、同步。(在触摸屏校准期间inputDevice在输入事件中不能采用算法。校准程序完成有inputDevice重新启用校准算法)模拟器中至今无法进入device.absX/Y!=null的代码,需要了解以下inputDevice被调用的步骤。三,触摸屏的时间流程:驱动层:/*Touchscreenabsolutevalues*Theseparametersareusedtohelptheinputlayerdiscardoutofrangereadingsandreducejitteretc.*omin,max:-indicatetheminandmaxvaluesyourtouchscreen
9、returnsofuzz:-useahighernumbertoreducejitter*ThedefaultvaluescorrespondtoMainstoneIIinQVGAmode*PleasereadDocumentation/input/input-programming.txtformoredetails.*/staticintabs_x3=350,3900,5;module_param_array(abs_x,int,NULL,0);MODULE_PARM_DESC(abs_x,TouchscreenabsoluteXmin,max,fuzz);staticintabs_y3=
10、320,3750,40;module_param_array(abs_y,int,NULL,0);MODULE_PARM_DESC(abs_y,TouchscreenabsoluteYmin,max,fuzz);staticintabs_p3=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-inpu
11、t_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_x0,abs_x1,abs_x2,0);input_set_abs_params(wm-input_dev,ABS_Y,abs_y0,abs_y1,abs_y2,0);input_set_abs_params(wm-input_dev,ABS_PRESSURE,abs_p0,abs_p1,abs_p2,0);/*事件发生时,提供
12、原始点*/input_report_abs(wm-input_dev,ABS_X,data.x&0 xfff);input_report_abs(wm-input_dev,ABS_Y,data.y&0 xfff);input_report_abs(wm-input_dev,ABS_PRESSURE,data.p&0 xfff);/*提供给驱动外查询input_dev的接口*structinput_absinfoinfo;*ioctl(fd,EVIOCGABS(axis),&info)*srcfile:evDev.c*/if(_IOC_NR(cmd)&ABS_MAX)=_IOC_NR(EVIOC
13、GABS(0)t=_IOC_NR(cmd)&ABS_MAX;abs.value=dev-abst;abs.minimum=dev-absmint;abs.maximum=dev-absmaxt;abs.fuzz=dev-absfuzzt;abs.flat=dev-absflatt;Android底层驱动EventHub.cppstaticconstchar*device_path=/dev/input;openPlatformInput(void)scan_dir(device_path);open_device(devname);fd=open(deviceName,O_RDWR);/*对外
14、接口,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.提供接口staticJNINativeMeth
15、odgInputMethods=/*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,getAbsolu
16、teInfo,(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)I,(void*)android_serv
17、er_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,(IZ)Z,(void*)android_se
18、rver_KeyInputQueue_hasKeys,;javaservice部分:KeyInputQueue.java.循环查询输入设备信息或目录状态并处理ThreadmThread=newThread(InputDeviceReader)publicvoidrun()android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);tryRawInputEventev=newRawInputEvent();while(true)InputDevicedi;/block,doesnt
19、releasethemonitorreadEvent(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
20、.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);elseabsX=null;absY=null;absPressure=null;absSize=null;return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中教师支教工作计划
- 新生产月工作总结
- 2025年中山大学774生态学院085700资源与环境考研报录数据分析报告初试+
- 新小班个人工作总结
- 2025年冷藏真空包装袋项目投资可行性研究分析报告
- 中学教师招聘-中学教师招聘考试《教育学》历试卷2
- ESA模式在初中英语课堂教学中的应用
- 2025年中国高压冷水机行业市场发展前景及发展趋势与投资战略研究报告
- 2025年修理非标准工具行业深度研究分析报告
- 单晶AlN薄膜项目商业计划书
- 岭南版六年级美术下册教学工作计划
- 门诊常见疾病护理常规课件
- 数字化时代的智慧课堂建设与应用
- 初中九年级美术期末艺术测评指标试卷及答案
- 药品经营质量管理制度样本
- 有机农业概述课件
- 生产加工型小微企业安全管理考试(含答案)
- 沙子检测报告
- 2023-2024学年部编版必修下册 1-1 《子路、曾皙、冉有、公西华侍坐》教案2
- 无线电测向幻灯教材课件
- 第1课《我们的闲暇时光》课件
评论
0/150
提交评论