1诚欠、在ViewGroup中漾岳,事件分為dispatchTouchEvent(事件的分發(fā)),onInterceptTouchEvent(事件的攔截)粉寞,onTouchEvent(事件的處理)尼荆。
2、在View中唧垦,事件分為dispatchTouchEvent(事件的分發(fā))捅儒,onTouchEvent(事件的處理)。
可以簡單理解為振亮,首先調用dispatchTouchEvent巧还,其內部調用onInterceptTouchEvent。?我們一般并不會對dispatchTouchEvent進行修改坊秸,只會對事件進行攔截麸祷。也就是調用onInterceptTouchEvent,修改進返回值妇斤。
part1:我們以上面的圖為例摇锋,當down、move站超、up事件觸發(fā)在MyView時荸恕,整個事件是這樣的:
結合流程圖,不難發(fā)現死相,如果我對事件既不攔截融求,也不消費,當觸發(fā)ACTION_DOWN的時候算撮,事件會經過Activity——MyViewGroupA——MyViewGroupB——MyView一層層的向下進行dispatchTouchEvent(分發(fā))—onInterceptTouchEvent(攔截)調用生宛。當到達最底層MyView后,開始觸發(fā)消費操作肮柜,因為我均不消費陷舅,ACTION_DOWN將由底層一層層向上冒,移交上層處理审洞。當抵達最上層Activity后莱睁,說明下層均不消費,之后觸發(fā)的ACTION_MOVE和ACTION_UP將不再向下層分發(fā)傳遞芒澜,直接交由Activity分發(fā)給自己進行處理仰剿。
part2:我們將MyVIewGroupB的onInterceptTouchEvent返回值改為true,其他均是super痴晦。這意味著僅僅MyViewGroupB進行事件攔截南吮,但均無消費,?當將onInterceptTouchEvent改為true時,會直接調用同層的 onTouchEvent!
當觸發(fā)ACTION_DOWN的時候誊酌,事件依然是從Activity開始一層層向下傳遞部凑,當傳遞到MyViewGroupB時露乏,因為進行了事件攔截,所以執(zhí)行完onInterceptTouchEvent后不再向下傳遞涂邀,而是直接交由MyViewGroupB的onTouchEvent進行消費處理施无。由于我們是只攔截必孤,不消費,所以事件向上傳遞兴想,交由上層處理赡勘,最終回到Activity。之后觸發(fā)的ACTION_MOVE和ACTION_UP也不再向下傳遞毙替,直接交由Activity分發(fā)給自己處理践樱。
part3:我們還是將MyViewGroupB的onInterceptTouchEvent返回super,但是將他的onTouchEvent返回true袱院。這意味著我們不攔截忽洛,但是由MyViewGroupB進行事件處理环肘。
可以看出悔雹,當觸發(fā)ACTION_DOWN的時候,事件的分發(fā)傳遞過程和1的時候一樣寂恬,從Activity開始一層層向下傳遞莱没,最終傳遞到最底層MyView酷鸦,觸發(fā)消費操作牙咏,然后MyView將消費操作移交上層處理妄壶,然后到達MyViewGroupB的onTouchEvent丁寄,并且進行了消費處理泊愧,事件處理到此不在向上移交。當觸發(fā)ACTION_MOVE和ACTION_UP操作時屑埋,事件依然需要由Activity開始向下分發(fā)傳遞痰滋,但是當傳遞到MyViewGroupB后,由于其消費了ACTION_DOWN团搞,事件將不再繼續(xù)向下分發(fā)莺丑,而是直接由MyViewGroupB分發(fā)給自己的onTouchEvent進行繼續(xù)處理墩蔓。事件處理也不再向上移交。
part4:將MyViewGroupB的onInterceptTouchEvent和onTouchEvent的返回值均改為true奸披。這意味著既攔截,又消費轻局。
當觸發(fā)ACTION_DOWN的時候仑扑,依然從Activity開始向下傳遞置鼻,當到達MyViewGroupB的是,因為在onInterceptTouchEvent進行了攔截操作储藐,因此不再繼續(xù)向下分發(fā)傳遞,而是交由MyViewGroupB的onTouchEvent進行處理消費蛛碌。MyViewGroupB的onTouchEvent返回的是true,說明它決定對ACTION_DOWN進行處理蔚携,因此事件也就不再移交上層處理克饶。當觸發(fā)ACTION_MOVE和ACTION_UP的時候彤路,事件還是從Activity開始向下傳遞,當到達MyViewGroupB的時候远豺,由于之前進行了攔截操作,因此躯护,MyViewGroupB直接將事件分發(fā)給自己的onTouchEvent進行處理棺滞,不在向下分發(fā)傳遞矢渊。事件處理也不再向上層移交。
總結:
可以看出矮男,最終是否消費毡鉴,是靠onTouchEvent的返回值確定!?當down事件被某層消費憎瘸,則move陈瘦、up事件會按照先從上到下,再平行從左到右的路徑含潘,進行消費遏弱!?看懂這4part塞弊,整個流程也就比較清晰了。