事件传递的顺序:Activity -> ViewGroup -> View
Android事件分发机制主要由“事件分发”—>“事件拦截”—>“事件响应”这三步来进行逻辑控制的。
事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
当监听到有触发事件时,首先由Activity进行捕获,然后事件就进入事件分发的流程。Activity本身没有事件拦截,从而将事件传递给最外层的View的dispatchTouchEvent(MotionEvent ev)方法,该方法将对事件进行分发。
return true : View消费所有事件。
return false :停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,那么事件将被系统消费、处理。
super.dispatchTouchEvent(ev): 将事件交由本层的事件拦截onInterceptTouchEvent方法处理。
事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
return true: 对事件拦截,交由本层的onTouchEvent进行处理。
return false: 不拦截,分发到子View,由子View的dispatchTouchEvent方法处理。
super.onInterceptTouchEvent(ev):默认表示事件拦截,交由本层的onTouchEvent进行处理。
事件响应:public boolean onTouchEvent(MotionEvent ev)
return true: 表示onTouchEvent处理完事件后消费了此次事件。
return false: 不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费。如果到最顶层View还是返回false,那么该事件不消费,将交由Activity的onTouchEvent进行处理。
return: super.onTouchEvent,不响应事件,结果与return返回false一样
TouchTestActivity----dispatchTouchEvent
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_DOWN
ChildLayout-----ACTION_DOWN
ParaentLayout---ACTION_DOWN
TouchTestActivity----ACTION_DOWN
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_MOVE
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_MOVE
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_MOVE
TouchTestActivity----dispatchTouchEvent
TouchTestActivity----ACTION_UP
没有组件处理事件,固事件回传给顶层父控件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_DOWN
ChildLayout-----ACTION_DOWN
ParaentLayout---ACTION_DOWN
fu控件拦截事件,但是没有处理事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ParaentLayout---ACTION_DOWN
父控件拦截并处理事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ParaentLayout---ACTION_DOWN
ParaentLayout---dispatchTouchEvent
ParaentLayout---ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---ACTION_UP
子控件(viewGroup)拦截事件但不处理
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
ChildLayout-----ACTION_DOWN
ParaentLayout---ACTION_DOWN
子控件(viewGroup)拦截事件并且处理事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
ChildLayout-----ACTION_DOWN
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----ACTION_UP
子控件(View)分发事件
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
没有进view的onTouchEvent
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_DOWN
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_MOVE
ParaentLayout---dispatchTouchEvent
ParaentLayout---onInterceptTouchEvent
ChildLayout-----dispatchTouchEvent
ChildLayout-----onInterceptTouchEvent
MyView-------dispatchTouchEvent
MyView-------ACTION_UP
为方便自己理解,所做的记录。如有不妥,请大神提点。
参考于:https://blog.csdn.net/salmon_zhang/article/details/76746159 文章