个人理解,如果有不对的地方欢迎指正。
首先事件分发,事件是什么?我觉得简单讲就是人对手机发出的命令,也就是手指 触屏 的操作。那么分发呢?手指触屏首先应该是手机的硬件先感应到(触控传感器 我瞎说的呵呵哒)然后硬件把信号给系统?好了,这些我也不懂别瞎说了,总之我们的app接受到了手指触屏的事件,事件首先由window分发给根布局也就是rootview。我们基本上从这里控制事件就能满足大部分需求。来看个图:
这里我们捋一下控件的包含关系 :rootview包含viewgroup包含view
事件分发的顺序就是rootview--->viewgoroup--->view 这个是定好的规则不多解释。另外一点,假如说我的手指点的是view的上方,没点到view,那事件是不会发给view的。
说到这里基本上是说了个思路,那具体是怎么分发的呢。不管是什么类型view都有一个方法
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
这个方法就是事件分发的关键了,例如rootview遍历它的一级子控件(如上图所画,那view就不算是rootview的一级子控件了),如果有子控件满足条件,就调用子控件的dispatchTouchEvent(MotionEvent event)方法,那么事件就发给它的子控件了。那什么是满足条件呢,比如最基本的条件,手指点的位置要和子控件有重合(大白话就是我最起码要点到子控件上吧!)。同理一级子控件再遍历它自己的一级子控件........事件就一级一级的分发下去了。另外
事件的信息(比如说触屏的位置,触屏的动作是按下还是弹起等等)就用MotionEvent event这个对象包装好了,用于使用。
另外说到事件的分发,就不得不说事件的消耗。事件是先分发再消耗,分发到不能分发了才开始消耗!!!还是刚才的图,比如事件发给view了,view开始要分发事件,遍历子控件.....等等它没有也不能有子控件啊!这个时候事件分发就结束了,这个时候才开始事件的消耗处理!
还有事件的控制等等.....以后有机会再写,内容还是比较多的。
共同学习,写下你的评论
评论加载中...
作者其他优质文章