继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android事件分发 浅记

qq_匡璐_0
关注TA
已关注
手记 6
粉丝 7
获赞 132

个人理解,如果有不对的地方欢迎指正。
首先事件分发,事件是什么?我觉得简单讲就是人对手机发出的命令,也就是手指 触屏 的操作。那么分发呢?手指触屏首先应该是手机的硬件先感应到(触控传感器 我瞎说的呵呵哒)然后硬件把信号给系统?好了,这些我也不懂别瞎说了,总之我们的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开始要分发事件,遍历子控件.....等等它没有也不能有子控件啊!这个时候事件分发就结束了,这个时候才开始事件的消耗处理!
还有事件的控制等等.....以后有机会再写,内容还是比较多的。

打开App,阅读手记
11人推荐
发表评论
随时随地看视频慕课网APP