前幾篇文章我們從源碼的層面分析了事件分發機制...不過感受有些時候仍是須要記一些筆記般的內容,簡單快捷的回憶對應的內容。佈局
佈局嵌套層級:ViewGroupA中嵌套ViewGroupB,而後ViewGroupB嵌套ViewGroupC,ViewGroupC中包含ViewD。學習
基於此,我們分狀況記錄一些狀況:spa
1、C的onInterceptTouchEvent()返回true,onTouchEvent()返回false3d
現象: DOWN走到C的onTouchEvent()
,而後逐層回調父View的onTouchEvent()
,而且後續MOVE、UP將再也不回調。 code
解讀: DOWN一路下來,由於沒有任何onTouchEvent()
返回true,那麼意味着這條分發鏈上沒有任何View消費事件,也就意味着mFirstTouchTarget
爲null,所以後續的MOVE、UP事件就不會再從新分發。cdn
2、C的onInterceptTouchEvent()返回false,onTouchEvent()返回trueblog
現象: DOWN一直傳到D,而後調D的onTouchEvent()
,C的onTouchEvent()
。找到消費事件的C,後續事件正常按ABC的順序調用事件
解讀: 由於不存在任何View攔截,因此事件會一直傳遞至D。而後逐層倒序回調onTouchEvent()
來肯定是否有子View消費。而此時咱們的C返回了true,因此着mFirstTouchTarget
不爲null,後續事件就交由C去消費。開發
3、C的dispatchTouchEvent()直接返回true,且不主動調用superget
現象: 正常回調AB、但永遠只會回調C的dispatchTouchEvent()
解讀: 父View經過子View的dispatchTouchEvent()
的返回值來決定分發權。一旦返回true,意味着找到了消費此事件的View。由於咱們直接返回了true,因此這個對於父View來講mFirstTouchTarget
已經確認。後續事件直接分發到此View。
可是由於咱們咱們直接true,且不掉super那意味着onTouchEvent()
沒有時機執行...
固然可能會有小夥伴說,還有一些狀況呢?但其實萬變不離其宗,你都會唱、跳、RAP了還差打籃球嗎?j你太美就哦了。