一直对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