Android Mutlitouch Input Architecture
現在的任務是要在Android 上面啟用 Mutlitouch的功能,首先找了一下網路上的做法,要改Synaptics的Driver,因為G1是使用Snaptics的觸控版,在別人patch過的很明顯可以看到Driver可以拿到兩個座標,可是Android所定義的 MotionEvent只能傳遞X, Y, Pressure, Size,Size的定義是觸控版手指頭上面壓下去之後的圈圈大小,這個值可能沒甚麼用,人家就拿來給Mutlitouch應用了。 先說明修改過之後 User看到的是甚麼,如果收到的Size <=1 的話,那麼就是代表是 Single Touch,否則 X, Y 就是兩個點的中心點,Size的左 16 bit 則是 abs(x1-x2), 右 16 bit則是 abs(y1-y2),這樣在User Level就可以得到旋轉跟放大縮小。 目前只有iPhone的SDK是可以直接把點座標全部傳給User Level去,這樣如果要作多人遊戲的話,才可以使用座標,特地看了一下Windows 7 的SDK,看起來在 .Net 新增的 NameSpace: Windows7.Mutlitouch 也是沒有傳遞多點座標,只有Rotate 跟 Zoom 的事件,我沒有實際寫程式試試,可能有辦法取得座標也不一定。 透過Synaptics 的source 發現他是使用 input_report_abs(ts->input_dev, ABS_X, x); 來傳遞值的,所以就找ABS_X是在哪裡定義的,在linux/include/linux/input.h 下面有定所有輸入的值為何,可以看到絕對值系列還有一個ABS_RX,原本是給搖桿用的,但透過這個值,我們應該可以傳遞兩個座標了。 Driver回報上去之後,User Level要怎麼接收呢?我以為是某一個類似scanf的函式,找到就OK了,freedom問file descriptor 是甚麼?我才想到把file operations串起來的就是要透過file descriptor,試了一下G1,發現他的TouchPanel 是 /dev/input/event2,所以我就在Android Source裡面搜尋 /dev/input,發現了 EventHub.cpp 這個檔案,在此檔案...