Android自定义View

Android View相关(二)事件分发机制

2018-07-01  本文已影响4人  Utte

点击事件的传递规则

当一个MotionEvent产生之后,系统需要把这个事件传递给一个具体的View,这个传递的过程就是分发过程。

事件分发的三个重要方法

时间分发过程由三个方法共同完成:

  1. public boolean dispatchTouchEvent(MotionEvent event)
    • 用途:用来进行事件分发。
    • 所属:View的方法,ViewGroup中重写了这个方法。
    • 返回:当前事件是否被消耗了。
  2. public boolean onInterceptTouchEvent(MotionEvent ev)
    • 用途:判断是否拦截某个事件。
    • 所属:ViewGroup定义的方法。
    • 调用:在ViewGroup的dispatchTouchEvent()中调用。
    • 返回:是否拦截当前事件。
  3. public boolean onTouchEvent(MotionEvent event)
    • 用途:用来处理点击事件。
    • 所属:View的方法,ViewGroup中没有重写。
    • 调用:在dispatchTouchEvent()中调用。
    • 返回:是否消耗当前事件。

ViewGroup中三个方法的大概关系如下图(View没有onInterceptTouchEvent(),默认拦截):


这个图只是大概梳理三个方法的关系,其实是非常不完善的。

dispatchTouchEvent()去调用onTouchEvent()判断当前View是否拦截当前事件,如果拦截就去调用onTouchEvent()处理事件,并返回其返回值,如果不拦截就调用子View的dispatchTouchEvent()(分发一直到存在一个View处理了事件),并返回其返回值。

事件分发中的结论

这些结论都会在后面的源码分析中体现出来,先留一个概念。

同一个事件序列是指手指接触屏幕开始到手指离开屏幕过程中的产生的所有事件,以ACTION_DOWN开始,以ACTION_UP结束。后序事件就是指与当前时间是同一事件序列的后面所有事件。

分发:

拦截:

消耗:

上一篇下一篇

猜你喜欢

热点阅读