觸控訊息總體派發過程

2021-10-08 16:20:23 字數 1729 閱讀 2799

和按鍵派發類似,當訊息獲取模組通過pipe將訊息傳遞到客戶端, inputqueue中的next()函式內部

調 用 nativepollonce()函式中會讀取該訊息。如果有訊息,則 回 調viewroot內部的mlnputhandler物件

的 dispatchmotion()函式,該函式僅僅是發起乙個dispatch_pointer非同步訊息,訊息的處理函式是

deliverpointerevent()。執行完該函式後,調 用 finishinputevent()向訊息獲取模組傳送乙個回執,以便其

進行下一次訊息派發,真正完成回執的**是native c++編寫的

private void deliverpointerevent(motionevent event) 

boolean handled;

if (mview != null && madded)

if(config.lo**)

/***3、 將螢幕座標轉換到檢視座標。觸控訊息本身的座標位置是相對於螢幕左上角,對 於 800x480

* 畫素的螢幕,檢視可以認為是沒有邊界的,它內部處理訊息時所需要的座標是相對於檢視本身的,如圖

* 13-5所示。轉換的方法很簡單,變 量 mcurscrolly記錄了該檢視在螢幕座標中的y 軸滾動,這裡請注

* 意 ,對於根檢視而言,沒 有x 軸的滾動,因為根檢視的寬度已經被設定為螢幕本身的寬度。

*/if (mcurscrolly != 0)

if (measure_latency)

/*** 4調 用 mview.dispatchtouchevent( )將訊息派發給根檢視,該函式內部會繼而將訊息派發到整個

* view樹 。根檢視有兩種情況,對 於 activity包含的視窗,根檢視就是phonewindow中 的decorview;

* 對於非應用視窗,根檢視只是乙個普通的viewgroup

*/handled = mview.dispatchtouchevent(event);

if (measure_latency)

/*** 如果以上根檢視及其所有子檢視都沒有消耗該訊息,最後處理螢幕邊界偏移。螢幕邊界偏移在

* 程式中用英文edge slop表示,它的作用是當使用者正好觸控到螢幕邊界時,系統自動對原始訊息進行一

* 定的偏移,然後在新的偏移後的位置上尋找是否有匹配的檢視,如果有則將訊息派發到該檢視。為什麼

* 要 有 「螢幕偏移」 呢?因為對於觸控螢幕而言,尤其是電容觸控螢幕,人類手指尖有一定的大小,當觸控到

* 邊界時,力量會被自動吸附到螢幕邊界,所以,此處根據上下左右不同的邊界物件訊息原始位置進行一

* 定的偏移。

*/if (!handled && isdown) else if ((edgeflags & motionevent.edge_right) != 0)

} else if ((edgeflags & motionevent.edge_bottom) != 0) else if ((edgeflags & motionevent.edge_right) != 0)

} else if ((edgeflags & motionevent.edge_left) != 0) else if ((edgeflags & motionevent.edge_right) != 0)

if (edgeflags != 0 && mview instanceof viewgroup) }}

}}

關於windows訊息的派發

while getmessage msg,null,0,0 從訊息佇列中取訊息 對於以上結構,寫過windows程式的都應該熟悉,其中dispatch函式負責 訊息,那麼如果就dispatch這句話注釋掉,是不是windows視窗就收不到訊息了,非也,經研究發現,對於一般的滑鼠鍵盤操作,注釋掉dis...

Rabbitmq訊息中心 訊息中心總體方案

一 訊息中心簡介 為了將各個應用系統之間進行業務解耦,對業務的透明化處理及技術架構的統一管理,方便對各應用的整體把控,保證系統的穩定性,也方便各應用的訊息中介軟體的快速搭建,因此搭建訊息中心,提供整體的解決方案。相對於傳統應用間定時或事件驅動獲取資料的方式,使用訊息中心讓各應用感知其他應用的變動,採...

總體把握Android中的觸控事件處理

先看幾個函式 提到android的觸控事件處理,不少人都會立刻想到某些令人頭疼的函式,這裡列舉一下,刺激一下你的小神經 override public boolean ontouchevent motionevent event override public boolean dispatchtou...