Android开发经验谈Android实用技术

2019日更挑战(八),Android-View与ViewGro

2019-01-08  本文已影响22人  Jlanglang

瞎扯

上篇写了,View与ViewGroup之间的组合模式.
今天就聊聊事件分发,责任链模式.

什么是责任链

举个现实的例子说一下这个模式.
就拿公司来说:

老板-经理-员工.

一个员工要处理自己无法做决定的事,

正常的顺序肯定是.

如下:

员工->[经理,老板]->结果

员工做为这件事的触发者,就把这事一层一层直到传到老板那去.

当然,员工可以不往上报,经理可以不上报.直接处理
中间有任何一个环节把事件拦截处理掉.这件事就等于没了.

View就是员工,ViewGroup就是经理和老板.

总的来说就是:

一个事件,从低级传到高级,能处理就直接处理,不能处理就轮到下一个处理

但是!


View与ViewGroup的责任链的区别

Android中的责任链和上面说的还不一样.

上面说的责任链是,从低级别传到高级别.

而在Android中,触摸事件是直接传到最优先的activity
然后从ViewGroup.遍历分发传到View的.
也就是说,View与ViewGroup的实现是从高级传递到低级.

用上面的举例来说:

就是公司有一个活:
需要一个人来干.
当然最先发起的就是老板了.
所以是:
事件->老板->经理->员工
是反着来的.如果所有人都不干,这件事就老板自己处理了.


再来个代码

public class Test {
    public class Wood {
        private Tree pareant;

        public Tree getParent() {
            return pareant;
        }

        public void setParent(Tree pareant) {
            this.pareant = pareant;
        }

        public String name() {
            return "木头";
        }

        public void printName() {
            String name = this.name();
            Log.i("name", name);
        }

        public boolean dispatchEvent() {
            //默认不处理.
            Log.i("event", name() + "dispatch不拦截");
            return false;
        }

        public boolean onTouch() {
            Log.i("event", name() + "消费了事件");
            return false;
        }
    }

    public class Tree extends Wood {
        private List<Wood> childs = new ArrayList<>();
        private String type;

        public Tree(String type) {
            this.type = type;
        }

        public void add(Wood wood) {
            childs.add(wood);
            wood.setParent(this);
        }

        public void remove(Wood wood) {
            childs.remove(wood);
        }

        public String name() {
            return type+"树枝" ;
        }

        public void printChildName() {
            printName();
            int size = childs.size();
            for (int i = 0; i < size; i++) {
                Wood wood = childs.get(i);
                if (wood instanceof Tree) {
                    ((Tree) wood).printChildName();
                }
                wood.printName();
            }
        }

        @Override
        public boolean dispatchEvent() {
            int size = childs.size();
            boolean b = super.dispatchEvent();
            if (onInterceptTouchEvent()) {
                onTouch();
                b = true;
            } else {
                for (int i = 0; i < size; i++) {
                    Wood wood = childs.get(i);
                    b = wood.dispatchEvent();
                    if (b) {
                        break;
                    }
                }
            }
            return b;
        }

        public boolean onInterceptTouchEvent() {
            //默认不处理.
            Log.i("event", name() + "onInterceptTouch不拦截");
            return false;
        }
    }

    public class Leaf extends Wood {
        public String name() {
            return "树叶";
        }

    }

    public void test() {
        Leaf leaf = new Leaf();
        Tree tree = new Tree("第二级");
        tree.add(leaf);
        Tree tree1 = new Tree("最高级");
        tree1.add(tree);
        tree1.dispatchEvent();
    }
}

运行结果:

image.png

好了,今天码了3个小时,发现以前的认识还有点不对.哈哈,今天写的时候正好梳理了一下.


您的喜欢与回复是我最大的动力-_-
交流群:493180098

上一篇 下一篇

猜你喜欢

热点阅读