2024年5月11日发(作者:)
最近学习了电容触摸屏的驱动及其上层工作原理,拿出来和大家分享!
转]Android触摸屏校准程序的实现
一,校准的触摸算法如下:
触摸屏校准通用方法。
(XL, YL是显示屏坐标,XT, YT是触摸屏坐标,)
XL = XT*A+YT*B+C
YL = XT*D+YT*E+F
由于具体计算是希望是整数运算,所以实际中保存的ABCDEF为整数,而增加一个参
数Div
XL = (XT*A+YT*B+C) / Div
YL = (YT*D+YT*E+F) / Div
TSLIB把以上的7个参数 ABCDEF Div 保存在 pointercal 文件中。
不校准的数据: A=1, B=0, C=0, D=0, E=1, F=0, Div=1
A B C D E F Div
-411 37818 -3636780 -51325 39 47065584 65536
二,Android 事件处理机制
android 事件的传入是从EventHub开始的,EventHub是 事件的抽象结构,维护
着系统设备的运行情况(设备文件放在/dev/input里),设备类型包括Keyboard、
TouchScreen、 TraceBall。它在系统启动的时候会通过 open_device方法将系统提供的
输入设备都增加到这个抽象结构中,并维护一个所有输入设备的文件描述符,如果输入设
备是键盘的话还会读取 /system/usr/keylayout/目录下对应键盘设备的映射文件(修
改./development/emulator/keymaps /来改变键值的映射关系),另外
getEvent方法是对EventHub中的设备文件描述符使用poll操作等侍驱动层事件的发生,
如果发生的事件是键盘事件,则调用Map函数按照映射文件转换成相应的键值并将扫描
码和键码返回给KeyInputQueue.
frameworks/base/services/jni/com_android_server_
根据事件的类型以及事件值进行判断处理,从而确定这个事件对应的设备状态是否发
生了改变并相应的改变对这个设备的描述结构InputDevice。
Windowmanager会创建一个线程(InputDispatcherThread),在这个线程里从事
件队列中读取发生的事件 (QueuedEvent ev = nt()),并根据读取到
事件类型的不同分成三类(KEYBOARD、TOUCHSCREEN、TRACKBALL),分别进 行处
理,例如键盘事件会调用dispatchKey((KeyEvent), 0, 0)以将事件通过Binder发
送给具有焦点的窗口应用程序,然后调用 eEvent(ev)继续等侍键盘事件的
发生;如果是触摸屏事件则调用dispatchPointer(ev, (MotionEvent), 0, 0),这里
发布评论