网上很多介绍事件分发机制的,都讲的云里雾里。自己动手写了个demo,现在将完整结论总结如下:
首先说明有三个相关方法
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
涉及到activity的方法:
public boolean dispatchTouchEvent(MotionEvent ev)
public boolean onTouchEvent(MotionEvent ev)
涉及到viewGroup的方法:
public boolean dispatchTouchEvent(MotionEvent ev)
public boolean onInterceptTouchEvent(MotionEvent ev)
public boolean onTouchEvent(MotionEvent ev)
涉及到view的方法:
public boolean dispatchTouchEvent(MotionEvent ev)
public boolean onTouchEvent(MotionEvent ev)
完整传递路径: 根布局到子布局分发,子布局到根布局处理。
即分发是 Activity ---> ViewGroup --->View
处理是 View ---> ViewGroup --->Activity
activity dispatchTouchEvent
viewGroup dispatchTouchEvent
viewGroup onInterceptTouchEvent
view dispatchTouchEvent
view onTouchEvent
viewGroup onTouchEvent
activity onTouchEvent
三个方法的传递过程说明:
1)dispatchTouchEvent
如果调用 super.dispatchTouchEvent(ev),并且return false,会继续传递;
如果调用 super.dispatchTouchEvent(ev),并且return true,会继续传递直到当前view的onTouchEvent被调用;
如果直接 return true 终止传递;
如果直接 return false 会从当前view的父布局(即当前层级的上一层级)的onTouchEvent开始继续传递;
(super.dispatchTouchEvent(ev)会去调用继续传递逻辑)
2)onInterceptTouchEvent
如果return true 会从当前view(当前层级)的onTouchEvent开始继续传递;
如果return false 会继续传递;
(有没有调用super.onInterceptTouchEvent(ev)对路径链没有影响;因为ViewGroup的这个方法只是返回了false)
3)onTouchEvent
如果return true 会终止传递;
如果return false 会继续传递;
需要说明的是,以上结论把Activity当作ViewGroup的上一层级,继续传递的意思是继续按照完整传递路径来传递事件。
另外,onTouchEvent的return true,会引起当前view到根布局的dispatchTouchEvent返回值为true;dispatchTouchEvent的return true,会引起当前view到根布局的dispatchTouchEvent返回值为true。
好了,关于事件分发就说到这里。