从源码角度简要解析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。

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

你可能感兴趣的:(从源码角度简要解析android事件拦截机制)