看過很多事件分發(fā)的文章,大致的過程基本都能說上來,但是每當別人列舉了一個小例子,問你事件是怎么分發(fā)的,事件觸發(fā)了沒有,就懵逼了,歸咎原因還是沒有吃透,下面列舉幾個小例子,權當回顧每個流程了

1.描述:viewC與ViewGroupB都是普通的view,沒有點擊事件,現(xiàn)在點擊View
事件:
問題:對于U型事件傳遞大家應該很清楚了,但是ViewGroupB與ViewC都返回了false后,手勢剩余部分是怎么傳遞的呢?
答案:因為ViewGroupViewB與viewC在dispatchTouchEvent,onInterceptTouchEvent,onTouch中都返回了false,所以手勢剩余部分將不會傳遞給ViewGroupB與viewC,只會調(diào)用activity的dispatchTouchEvent與onTouch,貌似這個答案大家都清楚
本來原本結(jié)論到這里就結(jié)束了,和同事分享了一下,同事問,什么原理,是down事件記住了?還是別的邏輯....,好吧,只能看看源碼了...
原理:


源碼這里就不羅列了,當子 View中分發(fā)器中處理了該事件返回true,mFirstTouchTarget會被賦值,若返回了false,該值為null,所以在DecorView中不會分發(fā)到其子View中,所以其他后續(xù)事件move,up不會傳遞到ViewGroupB與ViewC中.

2.描述:viewC現(xiàn)在加入了點擊事件,點擊viewC之后,手指拖動,viewC上的點擊事件會執(zhí)行嗎?
結(jié)論:不執(zhí)行,但是我一直很納悶,down事件被viewC消費,然后之后的move,up事件都會分發(fā)到viewC,為什么沒有執(zhí)行onclick事件呢?

當手指移動出控件所處的區(qū)域后,移除長按與點擊的事件回調(diào),并設置view的press狀態(tài)為false,這樣在up事件時,檢測的該view不是處于press狀態(tài),就不會執(zhí)行到performClick方法.
具體事件分析,會持續(xù)整理,這里拋磚引玉...
參考文章:http://www.itdecent.cn/p/2be492c1df96