事件分发机制

View和ViewGroup关系

事件分发机制_第1张图片

Activity、viewgroup、view事件分发机制顺序三者关系

三个重要方法

  • public boolean dispatchTouchEvent(MotionEvent event)
    • 分发触控用于事件的分发,每个事件都必须经过这个方法分发,然后决定是自身消费还是往下传递给子控件;true表示不传递,事件没有被消费,false表示传递给子控件,如果子控件是viewgroup,则调用 oninterceptTouchEvent(),判断是否拦截事件
  • public boolean onTouchEvent(MotionEvent event);
    • 触控事件用于处理事件,true表示处理消费事件,false表示不处理,继续分发给子控件
  • public boolean onInterceptTouchEvent(MotionEvent event);
    • 拦截触控viewgroup中才有的方法,负责事件的拦截;当返回值为true时,表示拦截事件,将事件交给自身的onTouchEvent()进行处理;返回false,则表示不拦截,继续往下传递;viewgroup中可以子view,但是view中不能再包含view

Android事件分发流程图

事件分发机制_第2张图片
事件分发机制_第3张图片
整个事件流向是一个类U型图

注:

  • 仔细看的话,图分为3层,从上往下依次是Activity、ViewGroup、View事件从左上角那个白色箭头开始,由Activity的dispatchTouchEvent做分发箭头的上面字代表方法返回值,return true、return false、return super.xxxxx(),super的意思是调用父类实现。
  • dispatchTouchEvent和onTouchEvent的框里有个【true---->消费】的字,表示的意思是如果方法返回true,那么代表事件就此消费,不会继续往别的地方传了,事件终止。
    目前所有的图的事件是针对ACTION_DOWN的
  • 只有return super.dispatchTouchEvent(ev) 才是往下走,返回true 或者 false事件就被消费了(终止传递)。

对于ACTION_MOVE和ACTION_UP

  • 如果在某个控件的dispatchTouchEvent 返回true消费终结事件,那么收到ACTION_DOWN 的函数也能收到 ACTION_MOVE和ACTION_UP。


    事件分发机制_第4张图片

事件分发机制_第5张图片

小结

  • Android中事件传递按照从上到下进行层级传递,事件处理从Activity开始到ViewGroup再到View。
  • 事件传递方法包括dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent,其中前两个是View和ViewGroup都有的,最后一个是只有ViewGroup才有的方法。这三个方法的作用分别是负责事件分发、事件处理、事件拦截。
  • onTouch事件要先于onClick事件执行,onTouch在事件分发方法dispatchTouchEvent中调用,而onClick在事件处理方法onTouchEvent中被调用,onTouchEvent要后于dispatchTouchEvent方法的调用。

如有不妥之处,请指点

参考地址

Android事件传递机制--Ryan's Zone

View 的事件分发机制(Android 开发艺术探索读书笔记)

图解 Android 事件分发机制-文/Kelin(作者)

2016年12月28日10:23:17

你可能感兴趣的:(事件分发机制)