2024年3月9日发(作者:)
android实现触摸屏校准
1. 触摸校准算法
a.
触摸屏校准通用方法。
(XL, YL是显示屏坐标,XT, YT是触摸屏坐标,)
XL = XT*A+YT*B+C
YL = YT*D+YT*E+F
b.
由于具体计算是希望是整数运算,所以实际中保存的ABCDEF
为整数,而增加一个参数Div
XL = (XT*A+YT*B+C) / Div
YL = (YT*D+YT*E+F) / Div
c. TSLIB
把以上的
7
个参数
ABCDEF Div
保存在
pointercal
文件中。
不校准的数据: A=1, B=0, C=0, D=0, E=1, F=0, Div=1
A
-411
B
37818
C
-3636780
D
-51325
E
39
F
47065584
Div
65536
2.
Android 事件处理机制
a.
android 事件的传入是从EventHub开始的,EventHub是 事件的抽象结构,
维护着系统设备的运行情况(设备文件放在/dev/input里),设备类型包括
Keyboard、TouchScreen、TraceBall。它在系统启动的时候会通过 open_device
方法将系统提供的输入设备都增加到这个抽象结构中,并维护一个所有输入
设备的文件描述符,如果输入设备是键盘的话还会读取 /system/usr/keylayout/
目录下对应键盘设备的映射文件(修
改./development/emulator/keymaps/来改变键值的映射关系),另外
getEvent方法是对EventHub中的设备文件描述符使用poll操作等侍驱动层事
件的发生,如果发生的事件是键盘事件,则调用Map函数按照映射文件转换
成相应的键值并将扫描码和键码返回给KeyInputQueue.
b.
frameworks/base/services/jni/com_android_server_
根据事件的类型以及事件值进行判断处理,从而确定这个事件对应的设备状态是否发生了改变并
相应的改变对这个设备的描述结构InputDevice。
c.
Windowmanager会创建一个线程(InputDispatcherThread),在这个线程里从
事件队列中读取发生的事件 (QueuedEvent ev = nt()),并
根据读取到事件类型的不同分成三类(KEYBOARD、TOUCHSCREEN、
TRACKBALL),分别进 行处理,例如键盘事件会调用
dispatchKey((KeyEvent), 0, 0)以将事件通过Binder发送给具有焦点的
窗口应用程序,然后调用 eEvent(ev)继续等侍键盘事件的发生;
如果是触摸屏事件则调用dispatchPointer(ev, (MotionEvent), 0, 0),这
里会根据事件的种类(UP、DOWN、MOVE、OUT_SIDE等)进行判断并处
理,比如Cancel或将事件发送到具有权限的指定的窗口中 去;
3. 移植方案
a.
b.
c.
d.
e.
Android本身并不带触摸屏校准。Android获取到的数据就是驱动
上报的原始数据。
方案一
:
移植
TSLIB
,通过
TSLIB
产生
pointercal
校准参数文件。
方案二
:
从
Android
框架层获取
OnTouch
事件产生
pointercal
校准参
数文件
方案一
:
数据的校准在驱动中完成。 即把
pointercal
的参数数据通
过某种方式
(sysfs)
传递给驱动程序进行校准。
方案二
:
驱动上报原始点,原始点在框架层拦截后进行校验处理。
4. TSLIB移植过程
a. 修改源码以适应android的文件结构。
b. 设定 编译选项,生成库即应用。
i. etc/ module_raw input
ii. src/ts_config.c #define TS_CONF "/system/etc/"
iii. src/ts_load_module.c
char *plugin_directory="/system/lib/ts/plugins/";
iv. tests/fbutils.c
char *defaultfbdevice = "/dev/graphics/fb0";
v. COPY 到 /system/etc/
vi. . mkdir /data/etc/pointercal
vii.
通过
ts_calibrate
产生
pointercal
数据文件。
5. 框架内获取参数文件
a. 制作APK 应用,仿效ts_calibrate
采点并计算出各参数
,产生 pointercal
6. 框架内
实现触摸屏校准
a.
b.
在
中 拦截触摸屏原始数据
进行
pointercal
参数校验后再分发
7. 驱动内实现触摸屏校准
a. 在 中添加event,在触摸屏加载后把 pointercal
参数输送给驱动。
8. 结果-效果
实现细节:
1. 扩展init - proper_serivce 系统支持的属性权限,对自定义的特殊系统属性进行权限开放。
2. 使用自定义系统属性在 中 on property 事件中处理 pointercal的读写权限。


发布评论