android的事件分发机制总结
介绍
本篇文章主要总结android的事件分发,和与事件分发相关的触摸事件包装类 Scroller,ViewDragHelper等。
这里不做原理的解释,因为最好的方法就是看源码,这里只是总结结论。
View的事件分发
事件无非是手指触控屏幕。常用基本事件包括 ACTION_DOWN,ACTION_MOVE,ACTION_UP等。
如果一个view设置的全部事件接收。它的执行顺序是这样的
入口:
dispatchTouchEvent(event)
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处理。有点类似于回传。
dispatchTouchEvent
onInterceptTouchEvent
childView.dispatchTouchEvent
参考资料