美文网首页
Android 事件机制Activity,ViewGroup,V

Android 事件机制Activity,ViewGroup,V

作者: 蓝海D鱼 | 来源:发表于2017-11-23 15:09 被阅读0次

    基于Android version 26 的源码对Android 事件传递进行分析

    1 基础分析

    1)Activity 处理事件的源码如下:

    源码分析:Activity 收到系统事件就会调用 diapatchTouchEvent(ex)处理

    在diapatchTouchEvent方法内部 调用 Activity 的 对应的 PhoneWindow的 

    superDiapatchTouchEvent(ex)来处理

    2)phoneWindow 处理事件源码:

    DecorView 的 处理源码和DecorView 的定义:

    源码分析:

    1)PhoneWindow 的superDispatchTouchEvent内部调用DecorView的 superDispatchTouchEvent

    2)DecorView 的 super.dispatchTouchEvent(event); 内部调用 super.dispatchTouchEvent(event);

    3) DecorView 是继承自 FrameLayout 实际调用的是 ViewGroup 的 dispatchTouchEvent(event);

    3) ViewGroup 的 事件处理源码:

    源码分析:

    1) 接着就是查找当前的 focus child view 由外向里 传递事件,调用 child 的 dispatchTouchEvent

    2)同时还有一个 intercepted 的 判断, 如果 onInterceptTouchEvent返回 true 则intercepted=true, 那么事件就不会再向viewgroup的 子view 传递

        3) View group 里面如过 判断 onInterceptTouchEvent 返回true 以后的code 逻辑:如果当前没有 TouchTarget 则当前的ViewGroup 就是TouchTarget, 调用 dispatchTransformedTouchEvent 给当前的view

    在 dispatchTransformedTouchEvent 方法里面 会调用:handled = super.dispatchTouchEvent(event); 

    让 ViewGroup的 super 也就是 View 类来处理 这个event

    也就是 如果onInterceptTouchEvent返回 true 则 这个view group 就会当成一个 view 来handle event 

    4) View group 如何向子View 传递 并且check 子view的返回值:

    a )会遍历所有的子view 并且判断 是否在 事件 touch 区域,然后调用 在dispatchTransformedTouchEvent 中 调用 handled = child.dispatchTouchEvent(event);  

    b) 在如果有child view dispatchTouchEvent 返回 true 则在 addTouchTarget(child, idBitsToAssign); 设置 mFirstTouchTarget的值 为当前child view。

    如果 child view 返回 false,则mFirstTouchTarget 的值依然为 null  默认还是要调用 当前view group 的 dispatchTransformedTouchEvent 和 onTouchEvent

    4) View 事件处理源码:

    源码分析:

    1)view 调用dispatchTouchEvent 会先判断 handleScrollBarDragging 和 li.mOnTouchListener.onTouch 如果这个两个返回true则表明 view 已经消费了事件,将不会调用 onTouchEvent()

    2)如果以上两个不消费事件 才调用 onTouchEvent()

    相关文章

      网友评论

          本文标题:Android 事件机制Activity,ViewGroup,V

          本文链接:https://www.haomeiwen.com/subject/gtezvxtx.html