美文网首页程序员
伪代码10分钟解释android事件分发别穷举一些大图整些有的没

伪代码10分钟解释android事件分发别穷举一些大图整些有的没

作者: Rex_叶然 | 来源:发表于2018-01-02 04:21 被阅读0次

    到一些解释android事件分发的,基本都是穷举一些所有情况整几个大图,名词概念搬一搬,也不说为什么会这样,3个方法的牵扯关系究竟为何,很长,实战或面试的时候能拿来用吗?本人不才,认为以下的伪代码基本能搞定事件分发,为图简单Event参数都不要了,只解释核心,自己自定义view的时候也可以直接跟着用,请赐教

    
    public class IView{ 
    
     public boolean dispatchTouchEvent() {
         return onTouchEvent();
     }
     public  boolean onTouchEvent() {
       //可以通过setOnTouchListener等消费则  return true        return false;
      }
    
    }
    
    public class IViewGroup extends IView {
    public List<IView> childs = new ArrayList<>();
     //注释1:理解事件分发有个容易被忽视的前提就是ViewGroup是继承的View
     //虽然ViewGroup没有实现onTouchEvent 
     //但是super.dispatchTouchEvent调用的就是super.onTouchEvent
    // 即他自己的onTouchEvent
        public boolean onInterceptTouchEvent() {
            return false;//
        }
    
        @Override
        public boolean dispatchTouchEvent() {
            if (true) {
                //这个true就是
                //  final int action = ev.getAction();
                // final int actionMasked = action & MotionEvent.ACTION_MASK;
                // actionMasked == MotionEvent.ACTION_DOWN
                resetTouchState();//FLAG_DISALLOW_INTERCEPT==false
                //这里的意思就是findid后 直接调requestDisallowInterceptTouchEvent没有暖用
                //此处被重置 为false需要在这个if后面调
            }
    
            if (!FLAG_DISALLOW_INTERCEPT && onInterceptTouchEvent()) {
     //只有FLAG_DISALLOW_INTERCEPT为false才去判断onInterceptTouchEvent
                super.dispatchTouchEvent();//注释1
            } else {
                for (int i = 0; i < childs.size(); i++) {
                    if (childs.get(i).dispatchTouchEvent()) {
                        return true;
                        //只要有一个child View的dispatchTouchEvent(注释1)返回true
                        //已经return那么后续的view也拿不到 super(他自己)也拿不到
                    }
                }
            }
            return super.dispatchTouchEvent();
        }
    
        private boolean FLAG_DISALLOW_INTERCEPT = false; //是否禁止打断
    
        public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
            FLAG_DISALLOW_INTERCEPT = disallowIntercept;
            //如果viewgroup有父就 parent.requestDisallowInterceptTouchEvent(disallowIntercept)
    
        }
    
        public void resetTouchState() {
            FLAG_DISALLOW_INTERCEPT = false;
        }
    }
    

    小总结 背了下面这个伪代码
    这个执行顺序和相互关系随便问

    if (!禁止打断()&& 是否打断()) {
     viewgroup可以要了
    }else{
    for (int i = 0; i < childs.size(); i++) {
    if (somechild.要//即somechild.onTouchEvent) {
         return true;
    }
    }
    }
    
    return    viewgroup可以要了
    

    小总结

    <font color=RED face="楷体" size=5>
    父想要咋办 1.使!禁止打断()&& 是否打断() 为true 2. child.要全为false
    子想要咋办 1.禁止打断为true 2.要的那个view的child.要为true
    </font>
    <font color=#123456 face="楷体" size=5>
    完事 so easy 如果还没有概括不了情况 欢迎指正
    另外谁能告诉我这个简书文字怎么不变色~2333
    </font>

    记住上面基本就可以了 如果你还想考虑move down up

    如果你还想考虑到down move

    View mTarget=null;//保存捕获Touch事件处理的View
        public boolean dispatchTouchEvent(MotionEvent ev) {
    
            //....其他处理,在此不管
    
            if(ev.getAction()==KeyEvent.ACTION_DOWN){
                //每次Down事件,都置为Null
    
                if(FLAG_DISALLOW_INTERCEPT ||!onInterceptTouchEvent()){
                mTarget=null;
                View[] views=getChildView();
                for(int i=0;i<views.length;i++){
                    if(views[i].dispatchTouchEvent(ev))
                        mTarget=views[i];
                        return true;
                }
              }
            }
            //当子View没有捕获down事件时,ViewGroup自身处理。这里处理的Touch事件包含Down、Up和Move
            if(mTarget==null){
                return super.dispatchTouchEvent(ev);
            }
            //...其他处理,在此不管
            if(onInterceptTouchEvent()){
             //...其他处理,在此不管    
             }
    //这一步在Action_Down中是不会执行到的,只有Move和UP才会执行到。
            return mTarget.dispatchTouchEvent(ev);
    
        }
    

    相关文章

      网友评论

        本文标题:伪代码10分钟解释android事件分发别穷举一些大图整些有的没

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