从源码角度简要解析android事件拦截机制

1、ViewGroup中 dispatchTouchEvent()方法简要执行逻辑:

if (event == down) {  //如果是down事件

     mFirstTouchTarget = null;

     resetTouchState();重置触摸状态

}

intercepted = false;

if(event == down || mFirstTouchTarget != null) {

     if(!disallowIntercept) {

         intercepted = onInterceptTouchEvent();

     } else {

       Intercepted =false;

     }

} else{

     intercepted = true;直接拦截,不询问

}

if(!intercepted){

        //子view的简要逻辑

        if(child.dispatchTouchEvent()){

            mFirstTouchTarget = child;

        }

}

if(mFirstTouchTarget == null) {

    viewGroup.onTouchEvent();  交由viewGroup处理

} else {

    if (intercepted) {

       child.dispatchTouchEvent(cancelEvent); //给子view发送cancel事件

        mFirstTouchTarget = null; //关键点

     }

 }


结论:

1、如果在down事件拦截,那么down事件和后续事件都会被viewgroup处理,因为mFirstTouchTarget为null,还没有被赋值,也就是事件还没有被子view消费过;

2、如果在非down事件拦截,本次事件不会被子view处理,也不会被父viewGroup处理,后续事件会被viewGroup处理,因为本次事件mFirstTouchTarget不为null。

如果有分析不正确的地方,请大神们指正。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容