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