一、Touch 事件分析:
事件分發:dispatchTouchEvent
return true:事件會分發給當前 View 并由 dispatchTouchEvent 方法進行消費,同時事件停止向下傳遞;
return false:返回給 上一級的onTouchEvent 進行消費;
return super.dispatchTouchEvent(ev):事件會自動的分發給當前 View 的 onInterceptTouchEvent 方法。
事件攔截:onInterceptTouchEvent
(在View 的 dispatchTouchEvent(MotionEvent ev) 返回super.dispatchTouchEvent(ev) 時,事件會自動分發給當前 View 的 onInterceptTouchEvent 方法)
return true:將事件進行攔截,并將攔截到的事件交由當前 View 的 onTouchEvent 進行處理;
return false:將事件放行,當前 View 上的事件會被傳遞到子 View 上,再由子 View 的 dispatchTouchEvent 來開始這個事件的分發;
return super.onInterceptTouchEvent(ev):事件默認會被攔截,并將攔截到的事件交由當前 View 的 onTouchEvent 進行處理。
事件響應:onTouchEvent
(在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent 返回 true 或返回 super.onInterceptTouchEvent(ev) 時onTouchEvent 會被調用)
return? false:事件從當前 View 向上傳遞,并且都是由上層 View 的onTouchEvent 來接收,如果傳遞到上面的 onTouchEvent 也返回
false,這個事件就會“消失”,而且接收不到下一次事件。
return true:則會接收并消費該事件。
return super.onTouchEvent(ev): 默認處理事件的邏輯和返回 false 時相同。
1.ViewGroup的dispatchTouchEvent為false:
結果分析:
事件先由Activity的dispatchTouchEvent 分發給 ViewGroup的dispatchTouchEvent,而ViewGroup的 dispatchTouchEvent 返回 false,表示對獲取到的事件停止向下傳遞,同時也不對該事件進行消費。由于 ViewGroup獲取的事件直接來自 Activity,則會將事件返回給 Activity的 onTouchEvent 進行消費,最后直接由 Activity來響應手指移動和抬起事件。
2.ViewGroup的dispatchTouchEvent為true:
結果分析:
事件由Activity的dispatchTouchEvent 分發給 ViewGroup的dispatchTouchEvent,而ViewGroup的 dispatchTouchEvent 返回 true,表示分發事件到ViewGroup并由ViewGroup的dispatchTouchEvent 進行消費。Activity 不斷的分發事件到ViewGroup控件的dispatchTouchEvent,而ViewGroup控件的dispatchTouchEvent也不斷的將獲取到的事件進行消費。
3.ViewGroup的onInterceptTouchEvent為true:
結果分析:
事件由Activity的dispatchTouchEvent方法分發給ViewGroup控件的dispatchTouchEvent,而ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev),表示對事件進行分發并向下傳遞給 ViewGroup控件的onInterceptTouchEvent 方法,該方法返回 true 表示對所獲取到的事件進行攔截并將事件傳遞給ViewGroup的onTouchEvent 進行處理,ViewGroup的 onTouchEvent返回 super.onTouchEvent(ev) 表示對事件沒有做任何處理直接將事件返回給上級,由于 ViewGroup獲取的事件直接來自Activity,所以 ViewGroup的 onTouchEvent會將事件以冒泡方式直接返回給 Activity的 onTouchEvent 進行消費,后續的事件則會跳過ViewGroup直接由 Activity的 onTouchEvent 消費來自Activity自身分發的事件。
4.ViewGroup的onInterceptTouchEvent為false:
ViewGroup的onInterceptTouchEvent為false
結果分析:
事件先由Activity 的 dispatchTouchEvent 方法分發給 ViewGroup的 dispatchTouchEvent,而ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev),表示對事件進行分發并向下傳遞給ViewGroup的 onInterceptTouchEvent 方法,該方法返回 false 表示事件會被放行并傳遞到View 的dispatchTouchEvent方法,同樣View的 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev),認會將事件傳遞給 View的 onTouchEvent 進行處理,View的 onTouchEvent 返回 super.onTouchEvent(ev)表示對事件沒有做任何處理直接將事件返回給上級,由于 View獲取的事件直接來自ViewGroup,所以View的 onTouchEvent會將事件以冒泡方式直接返回給 ViewGroup
的 onTouchEvent 進行消費,而 ViewGroup的 onTouchEvent 也返回了super.onTouchEvent(ev),同樣 ViewGroup的 onTouchEvent 也會將事件返回給上級,而TouchEventFather 獲取的事件直接來自Activity,所以 ViewGroup控件的onTouchEvent 會將事件以冒泡方式直接返回給 Activity 的 onTouchEvent進行消費,后續的事件則會跳過 ViewGroup和 View,直接由Activity 的 onTouchEvent 消費來自Activity 自身分發的事件。
5.ViewGroup的onInterceptTouchEvent為false,View的dispatchTouchEvent為true:
結果分析:
事件由Activity的dispatchTouchEvent 方法分發給ViewGroup的dispatchTouchEvent,ViewGroup的 dispatchTouchEvent 返回super.dispatchTouchEvent(ev),事件會分發到ViewGroup的 onInterceptTouchEvent,onInterceptTouchEvent 返回 false,表示放行當前事件;事件會被傳遞到View 的 dispatchTouchEvent,dispatchTouchEvent 返回 true 表示事件被分發到 View并由View的dispatchTouchEvent 方法消費。后續的事件也會不斷的重復上面的邏輯最終被 View的dispatchTouchEvent 消費。