更多請關注 MemoMindide
事件通過主要的三層,分別是Activity、Layout(多個)、Viewspa
三者都擁有dispatchTouchEvent和onTouchEvent方法。設計
dispatchTouchEvent是用來控制事件分發的(隧道方式傳遞)。從源碼的角度看,其邏輯控制等起主導做用;從使用角度看,在diapatchTouchEvent中用邏輯判斷、設置Event的action是個好的方法,而改變其return值會讓事件丟失。orm
onTouchEvent是用來處理、消費事件的。return true標誌着事件已被消費;return false標誌着事件未被消費,往Layout/Activity方向傳遞。
blog
Layout除了擁有這兩個方法,還獨有onInterceptTouchEvent方法。事件
onInterceptTouchEvent是在事件由Layout分發到View以前的一個攔截機制。由於只經過Layout的dispatchTouchEvent操控只能讓事件丟失。
ci
若是onInterceptTouchEvent return true,代表攔截事件,事件就不會繼續分發而是跳到Layout的onTouchEvent方法中去處理;return false則事件繼續分發。開發
在衆多分析事件機制的文章中,很難看到與onTouch、onClick關聯起來的解釋。開始時我也拿捏很差onTouch和onTouchEvent的關係。get
事實上,onTouch是在onTouchEvent以前執行的。若是onTouch return true,表示事件已經被消費,不會調用onTouchEvent了。源碼
而onClick呢,則是在onTouchEvent的ACTION_DOWN和ACTION_UP都執行完以後,纔會觸發onClick。也就是說,在此以前任意位置return了true,onClick都不會被調用。
至此,我產生了一個疑問:Android爲何要這麼設計事件傳遞機制?
① onInterceptTouchEvent:是Layout特有的,是給予Layout對於Event的獨立把控權,而不是傻傻的等待事件再冒泡傳遞迴onTouchEvent。
② onTouch:區分於onTouchEvent,給開發者不破壞基礎事件傳遞邏輯(好比 Button的onTouchEvent默認的Super.onTouchEvent()裏面是有邏輯判斷來決定return值)的狀況下對事件有本身的把控操縱權。