美文网首页
Android事件分发消费机制

Android事件分发消费机制

作者: dreamkid | 来源:发表于2020-06-22 16:54 被阅读0次

    android事件分发消费机制分为事件分发和消费。从三个层面来描述activity、viewGroup、View。事件分发是由外向内,事件消费是由内向外。

    事件分发(由外向内)

    activity:

    activity实际是由window的实例phoneWindow进行渲染的,事件分发首先调用phoneWindow内部的decorview的superDispatchTouchEvent方法实际上是调用viewGroup的dispatchTouchEvent

    ViewGroup:

    调用ViewGroup的disPatchTouchEvent判断是否允许拦截。如果允许拦截继续调用onInterceptTouchEvent方法判断是否进拦截,如果进行拦截则调用dispatchTouchEvent判断是否进行事件消费,如果不进行拦截调用dispatchTransformedTouchEvent判断是否有可接收的childview如果有判断childview是否是viewGroup如果是从头开始递归判断如果是view交给view处理,如果没有可接收的childview调用dispatchTouchEvent判断是否消费此事件;如果不允许拦截调用dispatchTransformedTouchEvent继续判断。

    View:

    调用dispatchTouchEvent接着会调用onTouchEvent判断是否对事件进行消费

    事件消费(由内向外)

    view:

    首先调用dispatchTouchEvent判断是否注册OnTouchListener如果注册并且onTouch方法是否返回true表示已经消费此事件,事件结束;如果没有注册OntouchListener或者onTouch返回false继续调用onTouchEvent方法判断是否消费此事件如果返回true消费事件结束返回false不消费继续向上传递给父控件viewGroup

    ViewGroup:

    首先调用dispatchTouchEvent判断是否注册OnTouchListener如果注册并且onTouch返回true表示消费事件,事件结束;如果没有注册OnTouchListener或者onTouch方法返回false继续调用onTouchEvent方法判断是否消费此事件如果返回true表示消费事件结束返回false不消费继续向上传递给父控件viewGroup,当传递到view树最外层的根view时如果还没有消费交给activity

    activity:

    实际是调用decorview的superDispatchTouchEvent方法内部又调用viewgroup的dispatchTouchEvent方法判断是否消费如果返回true表示消费事件结束返回false表示不消费丢弃

    总结,事件分发是由外向内传递,时间消费是由内向外传递。有两张比较形象的图如下(转):

    参考资料:

    1.通俗理解Android事件分发与消费机制 https://www.cnblogs.com/aademeng/articles/10923249.html

    2.Android Touch事件分发机制详解之由点击引发的战争 https://www.jianshu.com/p/b1d992f6e25b

    相关文章

      网友评论

          本文标题:Android事件分发消费机制

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