Android 事件分配機制

2021-07-27 16:18:36 字數 3008 閱讀 7619

android系統中的每個view的子類都具有下面三個和touchevent處理密切相關的方法:

1)public boolean dispatchtouchevent(motionevent ev)  這個方法用來分發touchevent

2)public boolean onintercepttouchevent(motionevent ev) 這個方法用來攔截touchevent ,僅viewgroup及其子類有

3)public boolean ontouchevent(motionevent ev) 這個方法用來處理touchevent

當touchevent發生後,

1、首先activity將touchevent傳遞給最頂層的view, touchevent最先到達最頂層 view 的 dispatchtouchevent ;

2、然後由最頂層 view的 dispatchtouchevent 方法進行分發,

3、如果dispatchtouchevent返回true ,則交給這個view的ontouchevent處理;

4、如果dispatchtouchevent返回 false ,則交給這個 view 的 intercepttouchevent 方法來決定是否要攔截這個事件,

5、如果onintercepttouchevent 返回 true ,也就是攔截掉了,則交給它的 ontouchevent 來處理,

6、如果onintercepttouchevent 返回 false ,那麼就傳遞給子 view ,

7、由子 view 的 dispatchtouchevent 再來開始這個事件的分發。

8、如果事件傳遞到某一層的子 view 的 ontouchevent 上了,這個方法返回了 false ,那麼這個事件會從這個 view 往上傳遞,都是 ontouchevent 來接收。而如果傳遞到最上面的 ontouchevent 也返回 false 的話,這個事件就會「消失」,而且接收不到下一次事件。

首先觸控事件發生時(

action_down

),由系統呼叫

activity的

dispatchtouchevent

方法,分發該事件。根據觸控事件的座標,將此事件傳遞給

out的

dispatchtouchevent

處理,out

則呼叫onintercepttouchevent 

判斷事件是由自己處理,還是繼續分發給子

view

。此處由於

out不處理

touch

事件,故根據事件發生座標,將事件傳遞給

out的直接子

view

(即middle

)。middle及

center

中事件處理過程同上。但是由於

center

元件是clickable

表示其能處理touch

事件,故

center

中的onintercepttouchevent

方法將事件傳遞給

center

自己的ontouchevent

方法處理。至此,此

touch

事件已被處理,不繼續進行傳遞。

move

和 up 

事件處理流程類似,但是再

center

內的dispatchtouchevent

方法內被直接分配給

ontouchevent

處理,不需經過

onintercepttouchevent

判斷。這是由於,

android

系統中將1個

down

事件、n

個move

事件、1個up

事件整體作為一次邏輯上的觸控操作,

down

事件已經確定了處理事件的物件,則後續的

move、up

事件也確定了處理事件的物件。

總結:1. onintercepttouchevent中有個intercept,這是什麼意思呢?她叫攔截,你大概知道她作用了吧,她就是你的親親小秘書,有什麼事,先找秘書,秘書來決定這個事要不要你親自處理,既然是秘書,是不是每個人都能有呢?

當然不是,這個秘書只是viewgroup的

,所以只有繼承viewgroup的控制項才有,那些textview啊button啊什麼的,肯定是沒有的,為什麼?因為他級別不夠(繼承自view),是不能有秘書滴,

注意,如果本級領導決定去的話,那後面的通知就不經過這一級的小秘了,直接發領導。

2. 事件的傳遞順序,依次發生的是

action_down從父控制項傳向子控制項

,然後是action_move

(可能出現,也可能不出現)

,最後是action_up

,注意是按順序從父控制項傳向子控制項

,手機上action_move和action_up基本是都會出現的,是因為手機的感測器很敏感

,但是模擬器就不一樣,如果沒有滑動,是不會出現action_move的,所有的事件,action_down、action_move和action_up都首先發自根控制項(布局檔案中最外面一層)的onintercepttouchevent中,也就是說,每乙個控制項都首先會收到onintercepttouchevent事件(當然你必須有這個能力收到,原因看上面)

3. 有小秘了,有事件了,那就該有領導了,ontouchevent就是領導了,是處理具體的事件的,領導會首先收到小秘發的action_down事件,領導一看, 哇,

小秘發的來的,趕緊瞅瞅,晚上是不是有什麼活動,一看,還真有活動,又可以帶小秘一起出去high了,過癮,

告訴小秘(return true),

參加晚上的活動

,然後上級

小秘會接著把活動的具體安排(action_move和action_up)也發過來

,都由這個領導處理(

注意,具體活動是上級小秘直接通知下級領導(ontouchevent)的,這裡不再需要下級小秘過濾了

,因為小秘打扮去了,晚上要陪領導活動呢),其他領導呢,只能望洋興嘆了 。

C C 記憶體分配機制

1.c語言中的記憶體機制 在c語言中,記憶體主要分為如下5個儲存區 1 棧 stack 位於函式內的區域性變數 包括函式實參 由編譯器負責分配釋放,函式結束,棧變數失效。2 堆 heap 由程式設計師用malloc calloc realloc分配,free釋放。如果程式設計師忘記free了,則會造...

memcached記憶體分配機制

memcached slab allocator分配機制 slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題。slab allocation的原理相當簡單,就是將分配的記憶體分割成各種尺寸的塊 chunk 並把尺寸相同的塊分成組 c...

Memcache記憶體分配機制

1.page 頁 為記憶體分配的最小單位 memcached 的記憶體分配以page為單位,預設情況下乙個page是1m,可以通過 i引數在啟動時指定。如果需要申請記憶體時,memcached會劃分出乙個新的page並分配給需要的slab區域。page一旦被分配在重啟前不會被 或者重新分配 2.sl...