事件分发测试结果与理解总结

     *   总结:
     *     事件分发其实调用机制应该是这样的:(这里说的仅仅是系统的,其他的可能中途修改不一定是这样)
     *     总: dispatchTouchEvent会在在super.dispatchTouchEvent中最终会调用onTouchEvent, 以及onInterceptTouchEvent方法
     *     1.在调用onTouchEvent作为本事件是否被消耗了,如果自己没消耗会由父来消耗,如果使用了
     *     requestDisallowInterceptTouchEvent阻止父消耗,则会由Activity消耗以此结束
     *     2.在调用onInterceptTouchEvent方法中根据返回判断是否需要调用子dispatchTouchEvent事件,
     *       super.onInterceptTouchEvent默认返回false
     *     3.当子View把down 事件消耗了requestDisallowInterceptTouchEvent(true)才能把后续的事件交给子View,并且不再调用父的onTouchEvent
     *     4.当事件分发下去,onInterceptTouchEvent在调用子View的requestDisallowInterceptTouchEvent时候如果down事件返回的false,
     *       那么后续事件onInterceptTouchEvent也不会再给子view了,转而调用自己的Touch
     *     5.事件消耗,可以在onTouchEvent返回true ,或者dispatchTouchEvent 是true
     
     综上所述:底层简写代码应是这样的
    boolean isContinuDispatch=true;//后续事件继续分发
    boolean interceptTouchEvent=false;//是否调用自己的触摸事件(因为如果子view  requestDisallowInterceptTouchEvent(true)自己的touch就无效了)
   
    public boolean dispatchTouchEvent(MotionEvent ev) {
            //判断自己是否需要拦截
            if (onInterceptTouchEvent(ev)){
                //按下事件判断后续事件是否还需要分发
                if (ev.getAction()==MotionEvent.ACTION_DOWN){
                   return  isContinuDispatch=子View.dispatchTouchEvent(ev);
                }else {
                    //其他事件
                    if (isContinuDispatch){
                      return   子View.dispatchTouchEvent(ev);
                    }
                }
            }
        //没有被子View拦截,并且子View后续是不收的
        if (!interceptTouchEvent &&!isContinuDispatch){
                //自己触摸事件决定是否消耗
            return   onTouchEvent(ev);
        }else {
        //被阻止,事件没有被消耗,只能有Activity的OnTouch处理了
        
       return false;
        }
    }
 

以上总结是我自己测试的结果,与网上说法不一样,有些疑惑,还望大神指点

原文地址:https://www.cnblogs.com/lizhanqi/p/9289928.html