一直對android的分發機制不是非常清楚,這次自己測試一下
先把測試結果貼上來:
默認的傳遞是這樣的:
activity dispatchTouchEvent --> viewgroup dispatchTouchEvent --> viewgroup onInterceptTouchEvent --> view dispatchTouchEvent --> view onTouchEvent
--> viewgroup onTouchEvent --> activity onTouchEvent
可以這樣理解:dispatchTouchEvent 事件分發 是負責自己和父容器的分發,如果返回爲true 交給自己的onInterceptTouchEvent (view沒有onInterceptTouchEvent 直接交給onTouchEvent),如果返回爲false,則把事件交給父容器的onTouchEvent
onInterceptTouchEvent 事件攔截 是負責自己和子View的分發,如果返回爲true 交給自己的onTouchEvent 如果爲false,交給子view的dispatchTouchEvent
需要注意的是,如果ACTION_DOWN被某view或者activity或者viewgroup消費,其後的一系類觸摸事件都會傳遞到這個消費者中
繼續改
viewgroup onInterceptTouchEvent 的ACTION_DOWN事件返回false,此時DOWN事件會交給子view的dispatchTouchEvent,然後子view的dispatchTouchEvent的DOWN事件返回true,子view的dispatchTouchEvent的MOVE事件返回false,我們知道,事件如果被View消費了,則不會繼續往上傳遞,但是viewgroup的ontouchEvent卻不能能接受的DOWN事件。可見事件的傳遞是一整套的,例如如果某個消費體消費了MOVE事件,則必定會消費DOWN事件,如果消費了DOWN事件,則必然會消費MOVE事件。
activity中:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { LogUtil.i("activity dispatchTouchEvent"); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: LogUtil.i("activity dispatchTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: LogUtil.i("activity dispatchTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: LogUtil.i("activity dispatchTouchEvent ACTION_UP"); break; } return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { LogUtil.i("activity onTouchEvent"); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: LogUtil.i("activity onTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: LogUtil.i("activity onTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: LogUtil.i("activity onTouchEvent ACTION_UP"); break; } return super.onTouchEvent(event); }
relativelatyout中:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { LogUtil.i("ralativelayout dispatchTouchEvent"); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: LogUtil.i("ralativelayout dispatchTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: LogUtil.i("ralativelayout dispatchTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: LogUtil.i("ralativelayout dispatchTouchEvent ACTION_UP"); break; } return super.dispatchTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { LogUtil.i("ralativelayout onInterceptTouchEvent"); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: LogUtil.i("ralativelayout onInterceptTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: LogUtil.i("ralativelayout onInterceptTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: LogUtil.i("ralativelayout onInterceptTouchEvent ACTION_UP"); break; } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { LogUtil.i("ralativelayout onTouchEvent"); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: LogUtil.i("ralativelayout onTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: LogUtil.i("ralativelayout onTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: LogUtil.i("ralativelayout onTouchEvent ACTION_UP"); break; } return super.onTouchEvent(event); }view中:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { LogUtil.i("view dispatchTouchEvent"); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: LogUtil.i("view dispatchTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: LogUtil.i("view dispatchTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: LogUtil.i("view dispatchTouchEvent ACTION_UP"); break; } return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { LogUtil.i("view onTouchEvent"); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: LogUtil.i("view onTouchEvent ACTION_DOWN"); break; case MotionEvent.ACTION_MOVE: LogUtil.i("view onTouchEvent ACTION_MOVE"); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: LogUtil.i("view onTouchEvent ACTION_UP"); break; } return super.onTouchEvent(event); }打印出來的日誌:
03-23 17:16:17.855 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent
03-23 17:16:17.855 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent ACTION_DOWN
03-23 17:16:17.865 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout dispatchTouchEvent
03-23 17:16:17.865 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout dispatchTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onInterceptTouchEvent
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onInterceptTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view dispatchTouchEvent
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view dispatchTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view onTouchEvent
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: view onTouchEvent ACTION_DOWN
03-23 17:16:17.875 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onTouchEvent
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: ralativelayout onTouchEvent ACTION_DOWN
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent ACTION_DOWN
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent ACTION_MOVE
03-23 17:16:17.885 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent ACTION_MOVE
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity dispatchTouchEvent ACTION_UP
03-23 17:16:17.895 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent
03-23 17:16:17.905 18515-18515/com.fy.administrator.listviewtest I/com.fy.administrator.listviewtest.LogUtil: activity onTouchEvent ACTION_UP