標籤:筆記 public type view設定 span ++ .net 處理過程 lang
原文連結 http://sparkyuan.me/ 轉載請註明出處介紹
點擊事件的事件分發就是對MotionEvent事件的分發過程。當一個MotionEvent產生了以後,系統須要把這個事件傳遞給一個詳細的View,而這個傳遞的過程就是分發的過程。
涉及到的三個方法
- dispatchTouchEvent:用來進行事件的分發,假設事件可以傳遞給當前View。那麼此方法一定會被調用,返回結果受當前View的onTouchEvent和View的dispatchTouchEvent方法的影響,表示是否當消耗當前事件
- onInterceptTouchEvent:用來推斷是否攔截某個事件,假設當前View攔截了某個事件,那麼在同一個事件序列其中,此方法不會被再次調用,返回結果表示是否攔截當前事件;
- onTouchEvent:在dispatchTouchEvent方法中調用。用來處理點擊事件,返回結果表示是否消耗當前事件,假設不消耗,則在同一個事件序列中。當前View無法再次接收到事件。
三個方法之間的關係
public boolean dispatchTouchEvent(MotionEvent ev) { boolean consume = false; if(onInterceptTouchEvent(ev)) { consume = onTouchEvent(ev); } else { consume = child.dispatchTouchEvent(ev); } return consume; }
上面的虛擬碼非常好的描寫敘述了三者之間的關係。假設當前View攔截事件,就交給自己的onTouchEvent去處理,否則就傳給子View。直到事件被終於處理。
事件分發順序
當一個點擊事件產生後。它的傳遞步驟例如以下:Activity -> Window -> View。假設View的onTouchEvent返回false,那麼它的父容器onTouchEvent將會被調用。以此類推。終於將由Activity的onTouchEvent處理。
Activity對事件的分發過程
Activity -> Window -> DecorView。
Windows是一個抽象類別。可以控制頂級View的外觀和行為策略,PhoneWindow是這個類的唯一個實現。
DecorView就是當前介面的底層容器。即setContentView所設定的View是它的一個子View。
頂級View對點擊事件的分發過程
ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent
頂級View一般都是一個ViewGroup。
攔截事件之後,假設ViewGroup設定了mOnTouchListener,則Listener裡的onTouch方法會屏蔽掉onTouchEvent。假設onTouchEvent設定了mOnClickListener。則Listener裡的onClick會被調用。假設ViewGroup沒有攔截則傳給子View直到整個事件分發完畢。
View對點擊事件的處理過程
假設View設定了mOnTouchListener,則Listener裡的onTouch方法會屏蔽掉onTouchEvent。
假設onTouchEvent設定了mOnClickListener,則Listener裡的onClick會被調用。
View沒有onInterceptTouchEvent方法,一旦有點擊事件傳遞給他。他就會處理。
註:上面僅僅是描寫敘述了事件分發過程的原理,關於原始碼的分析請參考書本的對應章節。
歡迎轉載。轉載請註明出處http://blog.csdn.net/l664675249/article/details/50738102
Android中View的事件分發機制——Android開發藝術探索筆記