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
网友评论