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的源碼(http://git.koolu.org/),官方的源碼請自行搜尋。
該檔案的第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,有時間再玩下。
註:我用的開發板是mini2440,LCD屏是320x240
http://blog.21ic.com/user1/2537/archives/2009/61231.html