事件分發(fā)機(jī)制
image.png
簡略版:
- 在dispatchTouchEvent 和 onTouchEvent返回true則消費(fèi)事件嚷掠,停止傳遞
- 維持super則走全流程(1)->(5)吗坚,6舷胜、7在view不消費(fèi)事件時才會返回到
- dispatchTouchEvent和onTouchEvent 若return false則跳到上一層的onTouchEvent
- viewGroup的onInterceptTouchEvent若return true則跳過下層至自己的onTouchEvent
- View的dispatchTouchEvent默認(rèn)實現(xiàn)(super)就是把事件分發(fā)給自己的onTouchEvent
Activity:dispatchTouchEvent(1)莫瞬、onTouchEvent(7)
ViewGroup:dispatchTouchEvent(2)帅韧、onInterceptTouchEvent(3)、onTouchEvent(6)
View:dispatchTouchEvent(4)炫掐、onTouchEvent(5)
對于在onTouchEvent消費(fèi)事件的情況:在哪個View的onTouchEvent 返回true仓蛆,那么ACTION_MOVE和ACTION_UP的事件從上往下傳到這個View后就不再往下傳遞了,而直接傳給自己的onTouchEvent 并結(jié)束本次事件傳遞過程谅摄。
對于ACTION_MOVE徒河、ACTION_UP總結(jié):ACTION_DOWN事件在哪個控件消費(fèi)了(return true), 那么ACTION_MOVE和ACTION_UP就會從上往下(通過dispatchTouchEvent)做事件分發(fā)往下傳送漠,就只會傳到這個控件顽照,不會繼續(xù)往下傳,如果ACTION_DOWN事件是在dispatchTouchEvent消費(fèi),那么事件到此為止停止傳遞代兵,如果ACTION_DOWN事件是在onTouchEvent消費(fèi)的尼酿,那么會把ACTION_MOVE或ACTION_UP事件傳給該控件的onTouchEvent處理并結(jié)束傳遞。
太長版:
- 如果我們沒有對控件里面的方法進(jìn)行重寫或更改返回值植影,而直接用super調(diào)用父類的默認(rèn)實現(xiàn)裳擎,那么整個事件流向應(yīng)該是從Activity---->ViewGroup--->View 從上往下調(diào)用dispatchTouchEvent方法,一直到葉子節(jié)點(diǎn)(View)的時候思币,再由View--->ViewGroup--->Activity從下往上調(diào)用onTouchEvent方法鹿响。
- dispatchTouchEvent 和 onTouchEvent 一旦return true,事件就停止傳遞了(到達(dá)終點(diǎn))(沒有誰能再收到這個事件)」榷觯看下圖中只要return true事件就沒再繼續(xù)傳下去了惶我,對于return true我們經(jīng)常說事件被消費(fèi)了,消費(fèi)了的意思就是事件走到這里就是終點(diǎn)博投,不會往下傳绸贡,沒有誰能再收到這個事件了。
- dispatchTouchEvent 和 onTouchEvent return false的時候事件都回傳給父控件的onTouchEvent處理
- dispatchTouchEvent毅哗、onTouchEvent听怕、onInterceptTouchEvent
ViewGroup 和View的這些方法的默認(rèn)實現(xiàn)就是會讓整個事件安裝U型完整走完,所以 return super.xxxxxx() 就會讓事件依照U型的方向的完整走完整個事件流動路徑)虑绵,中間不做任何改動尿瞭,不回溯、不終止蒸殿,每個環(huán)節(jié)都走到筷厘。