天天看點

Android 的事件分發、傳遞、處理機制事件分發 dispatchTouchEvent事件攔截 onInterceptTouchEvent事件響應 onTouchEvent

事件分發 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

繼續閱讀