所在的位置: js >> js前景 >> autojs自己写布局分析三

autojs自己写布局分析三

牙叔教程简单易懂

之前的两个教程:

一个写了绘制绿框,

一个写了查看控件信息,

今天我们来写在布局层次中查看

UI构成

全屏悬浮窗

recyclerView

选中的view的classname显示为红色,相关的父子级也显示为红色

选中的view在屏幕中用红色矩形绘制出来

数据特征

控件信息显示有顺序性

控件是有状态的,展开或者折叠

控件是有层级的,一层一层的

要展示那些数据只展示必要的数据,那些数据是必要的?

根节点是必要的,以及与选中的节点相关的父子层级的节点

解析节点数据之前的教程,绘制绿框,我们使用的是广度搜索,这个教程呢?

因为这个列表是从上往下,前面显示完所有的子孙后代的控件,

然后再显示之后的层级控件,

因此,这里我们使用深度搜索DepthFirstSearch

虽然说我们只在UI显示必要的数据,但是在UI之后的数据,必定要是完整的数据,不然你的数据去哪里拿呢?

遍历节点依然是从根节点开始

letwindowRoot=auto.rootInActiveWindow;log(windowRoot);深度搜索DepthFirstSearch

这是DFS方式的递归,通常递归都是dfs

functionfindViewNodesByDFS(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=


转载请注明:http://www.aierlanlan.com/cyrz/7397.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了