牙叔教程简单易懂
之前的两个教程:
一个写了绘制绿框,
一个写了查看控件信息,
今天我们来写在布局层次中查看
UI构成全屏悬浮窗
recyclerView
选中的view的classname显示为红色,相关的父子级也显示为红色
选中的view在屏幕中用红色矩形绘制出来
数据特征控件信息显示有顺序性
控件是有状态的,展开或者折叠
控件是有层级的,一层一层的
要展示那些数据只展示必要的数据,那些数据是必要的?根节点是必要的,以及与选中的节点相关的父子层级的节点解析节点数据之前的教程,绘制绿框,我们使用的是广度搜索,这个教程呢?因为这个列表是从上往下,前面显示完所有的子孙后代的控件,然后再显示之后的层级控件,因此,这里我们使用深度搜索DepthFirstSearch虽然说我们只在UI显示必要的数据,但是在UI之后的数据,必定要是完整的数据,不然你的数据去哪里拿呢?遍历节点依然是从根节点开始letwindowRoot=auto.rootInActiveWindow;log(windowRoot);深度搜索DepthFirstSearch这是DFS方式的递归,通常递归都是dfsfunctionfindViewNodesByDFS(viewNode){letviewNodes=[];//节点入库viewNodes.push(viewNode);//遍历节点letchildCount=viewNode.childCount();for(leti=0;ichildCount;i++){letchildViewNode=viewNode.child(i);letchildViewNodes=findViewNodesByDFS(childViewNode);viewNodes=viewNodes.concat(childViewNodes);}returnviewNodes;}这个数据够吗?不够,只有节点信息,没有节点状态,也没有节点的层级信息;节点的状态是展开还是折叠,这个我们要知道;节点在第几层,我们也要知道;所以,在遍历节点的时候,我们要把状态和层级也加上去functionfindViewNodesByDFS(viewNode,parentViewNodeObj,childViewNodeIndex){letviewNodeObjs=[];letviewNodeObj=null;if(!parentViewNodeObj){//处理根节点viewNodeObj={viewNode:viewNode,_level:0,_levelStr:"0",_expand:false,};viewNodeObjs.push(viewNodeObj);}else{//其他节点viewNodeObj={viewNode:viewNode,_level:parentViewNodeObj._level+1,_levelStr:parentViewNodeObj._levelStr+"-"+childViewNodeIndex,_expand:false,};viewNodeObjs.push(viewNodeObj);}letchildCount=viewNode.childCount();for(leti=0;ichildCount;i++){letchildViewNode=viewNode.child(i);letchildViewNodes=findViewNodesByDFS(childViewNode,viewNodeObj,i);viewNodeObjs=viewNodeObjs.concat(childViewNodes);}returnviewNodeObjs;}在上面这个代码中,我们增加了三个属性level节点层级
levelStr节点层级的字符串表示
expand是否展开状态
这个遍历之后,我们就获得了这个这个教程必备的数据,相当于盖房子打了地基打印看看[{viewNode:UiObject(id=null,sourceNodeId=-,packageName=