标签:
整个dump返回的文件可以看成一棵由控件组成的多叉树,每一行代表一个控件,每一行(一个控件)开始前的空格数代表该控件在这棵树的层次,如没有空格代表的就是根节点,也就是我们常说的窗口顶端的DecorView.
以上方法的算法理解我们首先要弄清楚用到的几个变量的意义:
至于ViewNode控件是怎么一回事我们往下会分析到,现在就需要知道整个控件树就是由它组成的且它的构造函数 ViewNode(Window window, ViewNode parent, String data)接受的三个参数分别是:
对照430行 “new ViewNode(window, currentNode, line.substring(depth))”可以看到,在根据一行控件字串信息创建一个控件树中的ViewNode控件的整个算法的重点就是如何确定该节点的父节点!因为其他两个参数都是显而易见的。知道算法的重点就好描述了,在一个循环中主要就是421-429行来确定父控件节点,然后430-431行根据父控件节点创建ViewNode节点,所以整个算法就是:
从以上的算法我们可以知道,ViewServer返回的空间信息字串应该是有一定的约束的,其实从第13章第6小节的输出“图13-6-1 NotesList控件列表”也可以印证:
经过以上步骤后,HierarchyViewer就组建好一个从根节点DecorView开始的树了,也就是说可以从树根开始找到任意一个需要的节点了。
那么最后我们来看下ViewNode这个类是怎么回事:
那么我们首先看下它做为一个控件所拥有的属性:
public class ViewNode
{
...
public String id;
public String name;
public String hashCode;
...
public List<Property> properties = new ArrayList();
public Map<String, Property> namedProperties = new HashMap();
...
public int left;
public int top;
public int width;
public int height;
public int protocolVersion;
...
}
代码14-8-5 ViewNode类-控件属性
从以上代码我们看到ViewNode拥有的大量的控件属性。至于每项属性是什么我相信都很明了,没有必要浪费时间在这里给大家全部解析了,这里大家注意下properties和namedProperties这个两个属性,其中properties就是个保存控件属性的的一个列表;而namedProperties也是保存控件属性的,但是它不是个列表,而是个由控件属性名称为键,控件属性值为值组成的键值对一个映射集,这样就让调用者很容易通过一个控件属性的名字找到这个控件的属性了。
我们再看下ViewNode做为控件树的节点来连接组成整棵控件树的相应变量:
22 public class ViewNode
23 {
...
52 public ViewNode parent;
53
54 public List<ViewNode> children = new ArrayList();
...
}
代码14-8-6 ViewNode类-做为控件树节点
老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 3
标签:
原文地址:http://www.cnblogs.com/poptest/p/5103276.html