事件分發 dispatchTouchEvent
dispatchTouchEvent 的事件分發邏輯如下:
- Activity.dispatchTouchEvent 傳回 true |fasle 事件隻在 Activity 的 dispatchTouchEvent 進行處理。
- View|ViewGroup.dispatchTouchEvent 傳回true, 事件在目前 View|ViewGroup 的 dispatchTouchEvent 方法進行消費,同時事件會停止繼續傳遞;
- View|ViewGroup.dispatchTouchEvent 傳回false, 事件有傳遞給 上一層的(可能是ViewGroup或者Activity) onTouchEvent進行處理
- View.dispatchTouchEvent 傳回super.dispatchTouchEvent(ev); 事件會傳遞給目前View的 onTouchEvent 進行處理;
- ViewGroup.dispatchTouchEvent 傳回super.dispatchTouchEvent(ev); 事件會傳遞給目前ViewGroup的 onInterceptTouchEvent 進行處理;
事件攔截 onInterceptTouchEvent
onInterceptTouchEvent 的事件攔截邏輯如下:
- 如果 onInterceptTouchEvent 傳回 true,則表示将事件會被攔截,事件最終在目前ViewGroup的 onTouchEvent 進行處理;
- 如果 onInterceptTouchEvent 傳回 false,則表示将事件沒被攔截,事件會被傳遞到子 View上,再由子 View 的 dispatchTouchEvent來開始這個事件的分發;
- 如果 onInterceptTouchEvent 傳回 super.onInterceptTouchEvent(ev),事件預設不會被攔截,處理方式同傳回false一樣。
事件響應 onTouchEvent
onTouchEvent 的事件響應邏輯如下:
- 如果 onTouchEvent傳回了 true 則會接收并消費該事件。
- 如果 onTouchEvent傳回了 false 那麼這個事件會從目前 View 向上傳遞,并且都是由上層 View 的 onTouchEvent 來接收,
如果傳遞到上面的 onTouchEvent 也傳回 false,這個事件就會“消失”,而且接收不到下一次事件。
- 如果傳回 super.onTouchEvent(ev);
Activity.super.onTouchEvent(ev); 預設 傳回 false
ViewGroup.super.onTouchEvent(ev); 預設 傳回 false
View.super.onTouchEvent(ev); 預設 傳回 true