Android 事件分配機制

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),由系統調用ActivitydispatchTouchEvent方法,分發該事件。根據觸摸事件的座標,將此事件傳遞給outdispatchTouchEvent處理,out則調用onInterceptTouchEvent 判斷事件是由自己處理,還是繼續分發給子View。此處由於out不處理Touch事件,故根據事件發生座標,將事件傳遞給out的直接子View(即middle)。MiddleCenter中事件處理過程同上。但是由於Center組件是clickable 表示其能處理Touch事件,故center中的onInterceptTouchEvent方法將事件傳遞給center自己的onTouchEvent方法處理。至此,此Touch事件已被處理,不繼續進行傳遞。Move和 up 事件處理流程類似,但是再center內的dispatchTouchEvent方法內被直接分配給onTouchEvent處理,不需經過onInterceptTouchEvent判斷。這是由於,android系統中將1down事件、nmove事件、1up事件整體作爲一次邏輯上的觸控操作,Down事件已經確定了處理事件的對象,則後續的moveup事件也確定了處理事件的對象。


總結:

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)的,這裏不再需要下級小祕過濾了,因爲小祕打扮去了,晚上要陪領導活動呢),其他領導呢,只能望洋興嘆了 。

(2)如果領導看了,發現不是出去happy的事,這心情鬱悶的,又不能跟小祕一起了,這尼瑪的,還去個毛啊!不去了!!!告訴小祕唄(return false)不處理,然後小祕就會向上級(父控件)彙報,然後就由上級領導來處理。神馬?上級領導不處理,靠,那好吧,都交給他們的祖宗(View)去,查看view源碼,你會發現,一樣的,如果接受事件,就返回true,接着處理ACTION_MOVE和ACTION_UP,沒處理,就返回false,到祖宗這一級了,如果都沒人處理,那沒辦法,這個事件就此消失了,準備處理下一個 。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章