文章目錄
1 前言
首先,說一段廢話。CSDN註冊有一段時間了,但是一直沒有在上面發表部落格,之前發布在其他部落格上的文章,由於密碼忘記了,所以也無法找回了。好,開始進入正題。
本人也是初學者,並且入行不久。所以應該更適合初學的人學習。
2 通觀全域
我們將Android分為三個部分,kernel、framework、app三個部分。由於軟體都是跑在硬體的基礎之上的,所以硬體上觸控螢幕需要支援多點觸摸。理論上軟體是可以支援最多256個手指的觸摸,但是硬體的限制,即便是你想上報多於硬體個數的手指的情況下,我們在上層也只能忽略。對於framework,google本身是支援多點觸摸的,但是由於專利問題,可能有很多hide的API。但是由於Android是開放平台,所以我們還是可以在此基礎上進行自主開發的。
本人之前的學習是在2.3上進行的,由於公司工作任務的原因中間有段停滯的時間。現在重新來看,發現EventHub.cpp和InputReader.cpp變化很大,拿比對軟體一看“祖國江山一片紅”,當時心裡還是有點發慌的,誰讓咱是幹這行的,很快調整心態進入戰鬥狀態。
既然對以上有了一個大致的瞭解,所以我們已經通觀全域,剩下的任務就是各個擊破了。cpu都多核了,我們也不能落後,來多線程操作吧。看核心知識累了就去讀framework的代碼,是在讀噁心了就去看應用應該怎樣實現。
3 具體講解3.1 KERNEL
對於觸控螢幕的驅動我們簡單的劃分為兩個主要的部分,一個是註冊,另一個是上報。
3.1.1 註冊
單點觸摸資訊是以ABS承載並按一定順序發送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多點觸摸資訊則是以ABS_MT承載並按一定順序發送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然後通過調用input_mt_sync()產生一個 SYN_MT_REPORT event來標記一個點的結束,告訴接收方接收當前手指的資訊並準備接收其它手指的觸控資訊。最後調用 input_sync()函數上報觸摸資訊開始動作並告訴接收方開始接收下一系列多點觸摸資訊。
3.1.2 上報
協議定義了一系列ABS_MT事件,這些事件被分為幾大類,允許只應用其中的一部份,多點觸摸最小的事件集中包
括 ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此來實現多點觸摸。如果裝置支援ABS_MT_WIDTH_MAJOR這個事件,那麼此事件可以提供手指觸摸接觸面積大小。觸摸方向等資訊可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供觸摸裝置的類別,如手或是筆或是其它。最後有些裝置可能會支援 ABS_MT_TRACKING_ID,用來支援硬體跟蹤多點資訊,即該點屬於哪一條線等。
3.2 framework
在Android 4.0中,Event Input地位提高了.在Adroid2.3.5中,它在frameworks/base/libs/ui之下,在Android4.0中,它在frameworks/base/services/input之下,看到沒有,它有了自己的地位,就像在Kernel中一樣,有自己門戶了。
在此檔案夾下,目前主要研究兩個檔案,一個是EventHub.cpp,另一個是InputReader.cpp兩個檔案。EventHub.cpp主要是完成裝置的掃描和識別。而InputReader.cpp完成對裝置上報的未經處理資料的處理工作。
而具體的對於APP開發人員來講主要的資料是通過MotionEvent,java擷取。而MotionEvent.java是通過JNI機制與底層進行通訊的。
frameworks/base/core/java/android/view/MotionEvent.java---jni-->frameworks/base/core/jni/android_view_MotionEvent.cpp
本部分可參考部落格:http://blog.csdn.net/myarrow/article/details/7091061
3.3 app
此部分本人還沒有實現,參考代碼TouchExample.java & TouchExampleActivity.java
由於實驗還沒有進行,所以很多的研究還不是很深入,本人將後續添加實驗過程的真實筆記,本人有手寫的習慣,神州們可以隨時打假!