android触摸屏坐标手工校准/调整成功 |
[ 2009-7-28 14:25:00 | By: pajoke ] |
1.简述 android 的坐标转换处理: This implementation is a linear transformation using 7 parameters (a, b, c, d, e, f and s) to transform the device coordinates (Xd, Yd) into screen coordinates (Xs, Ys) using the following equations:
s*Xs = a*Xd + b*Yd + c s*Ys = d*Xd + e*Yd + f
Xs,Ys:LCD坐标 Xd,Yd:触摸屏坐标
在编译好了的ANDROID根文件系统的system/etc/pointercal这个文件内,存放着7个数, 这7个数就是对应上面公式的a,b,c,d,e,f,s 比如我原来的:(如果表格没对齐,请拷到记事本里面看) +----+-----+--------+------+--+--------+----+ | a | b | c | d |e | f | s | +----+-----+--------+------+--+--------+----+ |-411|37818|-3636780|-51325|39|47065584|6553| +----+-----+--------+------+--+--------+----+
2.处理说明: “system/etc/pointercal”这个文件是被java程序读取使用的,文件目录: f rameworks/base/services/java/com/android/server/InputDevice.java ---注:我用的是koolu的源码(),官方的源码请自行搜索。 该文件的第32行定义了:static final String CALIBRATION_FILE = "/system/etc/pointercal"; 这个CALIBRATION_FILE变量在第237行被使用于打开该文件: FileInputStream is = new FileInputStream(CALIBRATION_FILE); 后面的代码就是从这个文件里读取那7个数据,用于上层函数的坐标转换。 所以只要根据该公式通过手工计算出那7个值,就可以准确的进行触摸操作了。
3.计算 计算前需要取得4个触摸屏的坐标,我们取LCD 4个对角的坐标,因为只有这4个坐标知道确切的LCD坐标。 要取坐标必须打开内核中触摸屏的调试代码,启动后在console上使用dmesg命令来跟踪取得。 我是在一个角上用笔点一下,再用dmesg调出记录,然后记录下来。如下是我的320x240屏记录的结果: 坐标轴里小括号()里面的是调试信息给的触摸屏坐标,中括号[]里的是对应的LCD坐标。
x坐标 /|\ |(X:870, Y:140) (X:870, Y:890) | [320,0] [320,240] | | | +-------------------------------> y坐标 (X:120, Y:140) (X:120, Y:890) [0,0] [0,240]
*LCD 分辨率:320 x 240 ,也是LCD坐标的最大值 x y
设定s=65536 将那4个坐标代入那个公式,可以得出8个方程组
0 = a*120 + b*140 + c 0 = d*120 + e*140 + f 0 = a*120 + b*890 + c 65536*240 = d*120 + e*890 + f 65536*320 = a*870 + b*140 + c 0 = d*870 + e*140 + f 65536*320 = a*870 + b*890 + c 65536*240 = d*870 + e*890 + f 解方程组后就可得: a = 0 b = 20971 c = -2935940 d = 27962 e = 0 f = -3355440 s = 65535 然后用工具打开andriod的“system/etc/pointercal”文件,把这几个数输进去,用空格分开, 注意不要改文件结尾的两个字节0x00 0x0A,我是用Ghex工具打开的,在右边窗口中进行输入,在编辑里可以切换插入和覆盖模式。 此时启动试试。
//////////////////////////// 我的屏到这个步骤后触摸操作的左右变成了上下,上下变成了左右操作, 处理方法:把a,b,c值和d,e,f值分别对调。 再启动试试。。 还是不行,左右是正确的,上下是反的。 处理方法: 把Y坐标再反向的公式: Ys‘ = 320 - Ys = 320 - (a*Xd + b*Yd + c)/s 重新计算a,b,c的值,就OK了。
现在我点击计算器的按钮等操作都很准了,指哪打哪。
前面发的那个视频里的坐标是在内核里调的坐标,不是很准。
这是手工调的方法,如果要用程序校准的话可以用tslib,有时间再玩下。
| |