編輯:關於android開發
---恢復內容開始---
一、是什麼
我們首先要了解什麼是事件分發,通俗的講就是,當一個觸摸事件發生的時候,從一個窗口到一個視圖,再到一個視圖,直至被消費的過程。
二、做什麼
在深入學習android的過程中,我們往往不知道為什麼要去學習這些理論,它們枯燥,難懂,甚至在我們處於初級階段進行開發時完全用不到這些理論。
所以我們要學會一些技術,要知道它能做些什麼。
比較簡單的,在做開發時,如何處理滑動沖突的問題。
三、事件分發機制的分析。
首先在這裡,這一節不過多的分析事件分發的源碼了,在下一節分析,有興趣的可以去看一看郭霖的博客,對源碼分析講的非常清楚,在這裡我主要講解一些我自己對它的理解。
我們先在這裡認識三個方法
dispatchTouchEvent(MotionEvent ev) //用來進行事件的分發
onInterceptTouchEvent(MotionEvent ev) //在dispatchTouchEvent()中調用,用來判斷是否攔截某個事件
onTouchEvent(MotionEvent ev) //在dispatchTouchEvent()中調用,用來處理點擊事件
//偽代碼分析,便於理解
public boolean dispatchTouchEvent(MotionEvent ev){
boolean consume = false;
if(onInterceptTouchEvent(ev)){
consume = onTouchEvent(ev);
} else{
consum = child.dispatchTouchEvent(ev);
}
return consum;
}
首先我們將事件分發機制按兩個主角分開講,一個是ViewGroup,一個是View。
對於ViewGroup而言
當一個點擊事件產生後,dispatchTouchEvent()方法調用。如果onInterceptTouchEvent()方法返回true表示事件被攔截,返回false則該事件會交給子View繼續執行上述步驟,直至事件被處理。
對於View而言
處理事件,設置onTouchEventListener(),onTouch()回調,返回false,onTouchEvent()會被調用,若此時設置了setOnClickListener(),則onClick()方法會被調用。返回true,onTouchEvent()不會被調用,此時設置了setOnClickListener(),則onClick()方法並不會被調用。這便是View的分發機制
簡單來說上面兩部分構成了事件分發機制,由於並沒有分析源碼,所以看起來很簡單,畫出流程圖來說是這樣的
學習了這一節後,想必對android事件分發有了大致的了解,但可能還會有疑問,比如onClick方法為什麼有時候設置了也不會被調用,等等問題,我會在接下來分析源碼。
補充:1、點擊事件產生後,遵循如下順序 Activity->Window->View
2、當所有View都不處理事件時(onTouchEvent()返回false),事件會交還給Activity處理
3、onTouch和onTouchEvent,都是在dispatchTouchEvent()中調用,onTouch優先於onTouchEvent執行。如果在onTouch方法中通過返回true將事件消費掉,onTouchEvent將不會再執行。另外需要注意的是,onTouch能夠得到執行需要兩個前提條件,第一mOnTouchListener的值不能為空,第二當前點擊的控件必須是enable的。因此如果你有一個控件是非enable的,那麼給它注冊onTouch事件將永遠得不到執行。對於這一類控件,如果我們想要監聽它的touch事件,就必須通過在該控件中重寫onTouchEvent方法來實現。
Android事件分發機制實例驗證 我的程序是在MainActivity中有一個自定義的MyLayout布局,MyLayout布局下面有一個自定義的MyB
在整理前幾篇文章的時候有朋友提出寫一下ListView的性能優化方面的東西,這個問題也是我在面試過程中被別人問到的…..今天就借此機會
android onCreate中獲取view寬高為0的多種解決方法 這個問題大家肯定遇到過不止一次,其實很簡單,解決它也很容易,但是咱們追求的畢竟不是解決它,而是找
Android 關於“NetworkOnMainThreadException”,networkonmainthread網絡收集的原因如下,以及解決辦法: 我補充總結一