Android從觸碰屏幕開始的事件采集,解析及分發(fā)(1)

????關于Android的事件分發(fā)機制,網(wǎng)上的文章快爛大街了, 大多數(shù)文章都是在千篇一律的講activity, viewgroup, view之間的分發(fā)機制, 對于事件的源頭卻沒有提及. 比如, 當手指觸碰屏幕的一瞬間, 手機是怎么知道手指觸碰的哪里, 是觸碰的back鍵, 還是home鍵, 還是哪個坐標點, 是點擊事件, 還是滑動事件等等, 也就是說, Android系統(tǒng)的事件采集是怎樣的. 接下來是怎么把這些采集的事件信息進行處理的, 由誰來處理, 處理完成后又是由誰最后分發(fā)給到具體的activity的?

????有人可能會說, 作為一個普通的Android應用層開發(fā)者, 不需要掌握這些也可以啊, 我不想知道事件是怎么來的, 我只知道事件是怎么分發(fā)的, 我能夠在程序中控制事件就可以了. 的確, 事實是這樣, 不了解這些不影響應用層的開發(fā), 但是如果掌握了這些, 那就太有意思了, 可以做很多有意思的事情, 比如說, 按鍵精靈類的app為什么能夠記憶你的操作, 而且還能夠自動模擬你的操作而解放你的雙手? 其實, 這類app的原理無非就是通過某個辦法來采集到你的所有的操作過程, 即事件采集, 這樣他就記憶下來了, 當需要自動模擬事件的時候, 它會把這些采集到的信息經(jīng)過處理, 轉(zhuǎn)變成可執(zhí)行信息,這樣就能夠?qū)崿F(xiàn)模擬人的雙手來進行自動模擬操作了.

????因為要想講清楚整個事件的采集,處理及分發(fā)過程, 篇幅過大, 因此準備用一個系列文章來講, 本文是系列文章的開篇, 那么先講采集.

(一) 原始事件信息

打開模擬器, 或者用usb把手機連接上電腦并打開手機上面的開發(fā)者模式, (這里為了截圖方便用了模擬器)打開cmd, 輸入adb shell getevent回車, 然后點擊模擬器或者手機后, 就會看到有N多行的/dev/input/event......輸出. 其實, 這些信息就是最原始的事件信息.

(注:嚴格來說最原始的信息肯定是由硬件捕獲到的, 這里所說的原始信息是經(jīng)過硬件處理后返回給framework層的信息)
采集信息.gif

再看一下, 我們能否通過cmd命令來控制手機來模擬操作事件呢? 重新打開cmd, 或者Ctrl + c退出剛才的命令, 重新執(zhí)行adb shell input keyevent 4 , 發(fā)現(xiàn)手機自動執(zhí)行了返回鍵

模擬返回鍵.gif

(二) 信息分析

以上簡單的演示了下采集信息和發(fā)送信息, 接下來開始解析信息.cmd重新執(zhí)行adb shell getevent -t -l, 再次點擊手機的某個app, 顯示出的信息是這樣的:


點擊app.png

前面[ 13236.364793]顯示的是時間, 是手機或模擬器開機后到命令執(zhí)行時的時間間隔, 后面顯示的是具體命令, 其中, /dev/input/event1表示的是屏幕的輸入事件, 第一個ABS_MT_TRACKING_ID 表示采集信息開始, 后一個ABS_MT_TRACKING_ID表示采集信息結束, ABS_MT_PRESSURE表示的是屏幕感受到的壓力值, SYN_REPORT 表示的是同步數(shù)據(jù), 最重要的是ABS_MT_POSITION_X和ABS_MT_POSITION_Y, 毫無疑問, 這個就是表示屏幕感受到的觸碰坐標位置. 最右邊的一列是16進制的值.

其他的信息我們可以先忽略, 最主要的是要記錄時間和坐標點, 接下來就是把采集到的坐標點轉(zhuǎn)換成10進制的坐標點, x坐標采集到的值是00005487,轉(zhuǎn)換10進制是21639, 同理, y坐標轉(zhuǎn)換前是00006b5b, 轉(zhuǎn)換后是27483, 接下來需要根據(jù)公式來獲取到真正的應用層能識別的坐標系, 具體公式為:

x = (x-xmin) * 手機像素寬 / (xmax-xmin) ;
y = (y-ymin) * 手機像素高 / (ymax-ymin);

手機像素我們可以通過代碼獲取當前手機的像素, 但是xmin和xmax, 以及ymin和ymax是什么呢?我們還是通過cmd用adb shell getevent -p命令來獲取. 執(zhí)行命令后,拉到最下方, 看到如下圖示:


獲取參數(shù).png

我們找到0035和0036的行, 即

 0035  : value 0, min 0, max 32767, fuzz 0, flat 0, resolution 0
 0036  : value 0, min 0, max 32767, fuzz 0, flat 0, resolution 0

0035所在的行就是x信息, 0036所在的行就是y信息, 每行的min值和max值對應上面公式的min和max, 所以我這里最終轉(zhuǎn)換成的x, y坐標結果如下: (我的模擬器經(jīng)過代碼獲取的寬高分辨率分別是480, 728)

x = (21639 - 0) * 480 / (32767 - 0) = 317
y = (27483 - 0) * 728 / (32767 - 0) = 610

即當點擊手機桌面屏幕的(317, 610)坐標, 就打開了這個app, 那么我們接下來驗證一下, 通過cmd來發(fā)送命令, 來模擬點擊事件, 看看模擬器或者手機是不是能打開這個app呢?
重新打開cmd, 執(zhí)行adb shell input tap 317 610命令, 結果如下:


模擬點擊app.gif

我們成功的通過命令來模擬點擊桌面應用了. 其實整個過程就是一個采集信息梅肤,處理信息键科,發(fā)送信息的過程腥光。

到這里, 其實我們就可以自己開發(fā)出來一個類似按鍵精靈類的簡單版app了, 大體思路就是在app中給一個按鈕,用來觸發(fā)信息采集, 之后用戶的一切觸碰屏幕操作都進行錄入, 再給一個結束采集的按鈕, 觸發(fā)按鈕就結束信息錄入, 并開始處理信息, 包括每個動作的屬性(是點擊, 還是滑動, 還是長按等等), 相鄰動作的時間間隔, 等等, 然后保存起來, 最后再給一個自動模擬事件的按鈕, 當觸發(fā)時, 程序開始自動讀取保存的事件信息并執(zhí)行模擬事件了.

以上, 是我們?nèi)藶榈倪M行事件采集, 處理, 發(fā)送. 那么Android系統(tǒng)內(nèi)部是怎么做的呢? 是誰負責把這個事件信息處理后轉(zhuǎn)換成為各種KeyEvent或者MotionEvent的, 以及最終是怎么傳遞到的activity中的, 請關注系列文章之后的文章枫弟。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市洽腺,隨后出現(xiàn)的幾起案子脚粟,更是在濱河造成了極大的恐慌,老刑警劉巖蘸朋,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珊楼,死亡現(xiàn)場離奇詭異,居然都是意外死亡度液,警方通過查閱死者的電腦和手機厕宗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堕担,“玉大人已慢,你說我怎么就攤上這事∨海” “怎么了佑惠?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長齐疙。 經(jīng)常有香客問我膜楷,道長,這世上最難降的妖魔是什么贞奋? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任赌厅,我火速辦了婚禮,結果婚禮上轿塔,老公的妹妹穿的比我還像新娘特愿。我一直安慰自己,他們只是感情好勾缭,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布揍障。 她就那樣靜靜地躺著,像睡著了一般俩由。 火紅的嫁衣襯著肌膚如雪毒嫡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天幻梯,我揣著相機與錄音兜畸,去河邊找鬼。 笑死礼旅,一個胖子當著我的面吹牛膳叨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痘系,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼菲嘴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汰翠?” 一聲冷哼從身側(cè)響起龄坪,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎复唤,沒想到半個月后健田,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡佛纫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年妓局,在試婚紗的時候發(fā)現(xiàn)自己被綠了总放。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡好爬,死狀恐怖局雄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情存炮,我是刑警寧澤炬搭,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站穆桂,受9級特大地震影響宫盔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜享完,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一灼芭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驼侠,春花似錦姿鸿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笋熬,卻和暖如春热某,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胳螟。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工昔馋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糖耸。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓秘遏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘉竟。 傳聞我的和親對象是個殘疾皇子邦危,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 跨進程模擬觸屏事件的作用## 有很多在一個Activity中實現(xiàn)虛擬觸摸的方法,但是無法做到跨進程虛擬觸摸舍扰。無論是...
    babybus_hentai閱讀 8,471評論 1 3
  • Android 調(diào)試橋 Android 調(diào)試橋 (adb) 是一個通用命令行工具倦蚪,其允許您與模擬器實例或連接的 A...
    guanjm閱讀 1,470評論 0 1
  • 女兒從香港回來,給下一輩的幾個小朋友帶了珍妮小熊曲奇餅干边苹,順便也有我的一盒陵且。 瞧,上圖那方型的餅干盒上个束,一身消防員...
    星韻r閱讀 744評論 1 5
  • GET: request.GET.get("your key",none)#字典形式慕购,也是js對象聊疲; requst...
    zhu733756閱讀 2,817評論 0 0
  • 今年目標:健康管理(早睡11點之前、飲食脓钾、體重) 黑色280 找到一位合作伙伴 今日青蛙:1.聽音頻售睹。2.投資交易...
    鎮(zhèn)星Aquarius閱讀 78評論 0 0