android觸控螢幕座標手工校準/調整成功

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.