事件分发机制简单分析

事件传递的顺序: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 文章

 

相关文章:

  • 2018-01-12
  • 2021-04-17
  • 2019-12-08
  • 2018-09-30
  • 2018-05-07
  • 2021-08-29
  • 2019-06-23
  • 2019-02-20
猜你喜欢
  • 2018-03-10
  • 2019-06-18
  • 2021-07-20
  • 2021-01-24
  • 2018-07-12
  • 2021-01-26
  • 2018-01-28
  • 2021-09-08
相关资源
相似解决方案