android的事件分发机制总结

介绍

本篇文章主要总结android的事件分发,和与事件分发相关的触摸事件包装类 Scroller,ViewDragHelper等。

这里不做原理的解释,因为最好的方法就是看源码,这里只是总结结论。

View的事件分发

事件无非是手指触控屏幕。常用基本事件包括 ACTION_DOWN,ACTION_MOVE,ACTION_UP等。

如果一个view设置的全部事件接收。它的执行顺序是这样的

入口:

dispatchTouchEvent(event)

   android的事件分发机制总结

  mOnTouchListener.onTouch(view, event)
  onTouchEvent(event)
    onClick(view)

我们要理解onTouch,onTouchEvent的返回值意义。返回值boolean,true,表示事件被捕获使用,不会往下传递(此处,对viewGroup同样试用)。
另外,如果你在执行ACTION_DOWN的时候返回了false,后面一系列其它的action就不会再得到执行了。
简单的说,就是当dispatchTouchEvent在进行事件分发的时候,只有前一个action返回true,才会触发后一个action。

关于坐标系

在我们复写onTouchEvent时,要理解view的坐标系。事件发生的位置event.getX(), event.getY()是
触摸点相对于其所在组件坐标系的坐标,即相对于当前view的左上角。event.getRawX()是触摸点相对于屏幕默认坐标系的坐标,即相对于父控件的左上角
深入了解参考 传送门

ViewGroup的事件分发

ViewGroup相对于View,他继承自View,既有View的特性,也有容器的特性。首先,当action触发以后,事件先到ViewGroup.然后根据onInterceptTouchEvent(event)判断事件是否分发给子View,true表示拦截事件自己处理,此时可以认为他是一个View。处理流程同View。 false,表示事件会先分发给子View,如果子View捕获并处理,则事件结束。子View不处理,则事件会继续由ViewGroup处理。有点类似于回传。

android的事件分发机制总结

dispatchTouchEvent

  onInterceptTouchEvent

  childView.dispatchTouchEvent



参考资料

  郭霖事件分发介绍