所在的位置: js >> js发展 >> autojs自己写布局分析

autojs自己写布局分析

牙叔教程简单易懂

要达到的效果

autojs自带的布局分析是这样的

绿框里面是控件的节点信息,我们要展示绿框,首先要提取当前界面的节点信息;

根节点

letwindowRoot=auto.rootInActiveWindow;log(windowRoot);

UiObject(id=null,sourceNodeId=-,packageName=org.autojs.autojspro,className=android.widget.FrameLayout,text=null,desc=null,indexInParent=-1,boundsInParent=[0,0][,],boundsInScreen=[0,0][,],checkable=false,checked=false,focusable=false,focused=false,selected=false,clickable=false,longClickable=false,enabled=true,password=false,scrollable=false)屏幕上绘制多少个绿框

如果节点有几十几个百个,问题不大,如果有几千个呢?

节点太多,会影响绘制绿框的速度;

因此,我们要限制绿框的数量.

假设节点有上千个,我们绘制那些绿框呢?

图中一共有6个节点,如果我们只绘制3个节点,

那么我们绘制谁呢?

用户需要使用什么,我们就绘制什么.

一般我们选择节点都不会是顶端的节点,而是偏向底层的节点,

因此,我们应该绘制DEF这三个节点.

如何获得DEF三个节点信息

必然要从根节点开始遍历

怎么遍历节点

遍历节点有2种方式:深度(DepthFirst)和广度(BreadthFirst),

我们要获取的节点是DEF,这三个节点是同一层的节点,应当用广度(BreadthFirst);

BF遍历代码

1)获取当前界面根节点

letwindowRoot=auto.rootInActiveWindow;

2)变量viewNodes存储节点

letviewNodes=[];viewNodes.push(windowRoot);

3)存储根节点的直接子节点

letviewNodes=[];viewNodes.push(windowRoot);varchildCount=windowRoot.childCount();for(vari=0;ichildCount;i++){letchildViewNode=windowRoot.child(i);viewNodes.push(childViewNode);}

4)第二层我们访问完了,接着该访问第三层了,按照第二层子节点的顺序,一次访问第三层;

varchildCount=secondLevelViewNodeA.childCount();for(vari=0;ichildCount;i++){letchildViewNode=secondLevelViewNodeA.child(i);viewNodes.push(childViewNode);}

以此类推

5)第三层访问完了,接着访问第四层

varchildCount=thirdLevelViewNodeA.childCount();for(vari=0;ichildCount;i++){letchildViewNode=thirdLevelViewNodeA.child(i);viewNodes.push(childViewNode);}

6)节点的层数是不确定的,我们也不清楚当前还有哪些节点需要遍历,因此,我们要一个队列,来存储需要遍历的节点,显而易见的,我们要写一个广度(BreadthFirst)递归

functionfindViewNodes(viewNode){letviewNodes=[];letbreadthViewNodes=[];//节点加入队列breadthViewNodes.push(viewNode);//遍历队列中的节点while(breadthViewNodes.length0){letheadViewNode=breadthViewNodes.shift();//子节点入队列letchildCount=headViewNode.childCount();for(leti=0;ichildCount;i++){letchildViewNode=headViewNode.child(i);breadthViewNodes.push(childViewNode);}//父节点入库viewNodes.push(headViewNode);}returnviewNodes;}

这一段代码也许有的人不太好理解,大家可以想象一下,机关枪;

子弹发射之后,一颗子弹有概率变成两颗,三颗,然后重新回到弹夹中,

弹夹空了以后,我们就获得了所有不会再分裂的子弹.

并且,这些子弹都是按分裂的次数,就和游戏里宝宝变异的不同级别一样,

每层都是同等级变异的宝宝,这体现了数据的顺序性.

限制绘制的绿框数量

我们可以把限制的数量,放到一个配置中,方便后期修改;

这里我们指定限制绘制10个绿框;

上面解析了所有的节点,存到了一个数组中,

用户常用的是节点面积区域最小的节点,因此我们从后往前截取10个节点;

letviewNodes=findViewNodes(windowRoot);letchildViewNodes=viewNodes.slice(-10)绘制绿框

我们要的节点数据有了,主要是节点的bounds数据;

下面开始绘制,绘制的话,先创建一个全屏悬浮窗,然后多次绘制矩形

letpaint=newPaint();paint.setColor(colors.parseColor("#00ff00"));paint.setStrokeWidth(5);paint.setStyle(Paint.Style.STROKE);window.canvas.on("draw",function(canvas){varlen=childViewNodes.length;for(vari=0;ilen;i++){letchildViewNode=childViewNodes[i];letbounds=childViewNode.bounds();letleft=bounds.left;lettop=bounds.top;letright=bounds.right;letbottom=bounds.bottom;canvas.drawRect(left,top,right,bottom,paint);}});

到这里本篇教程的目的:绘制绿框,就达到了;

之后有时间了,会继续模仿autojs的布局分析

环境

设备:小米11proAndroid版本:12雷电模拟器:9.0.17Android版本:9Autojs版本:9.2.13

名人名言

思路是最重要的,其他的百度,bing,stackoverflow,github,安卓文档,autojs文档,最后才是群里问问---牙叔教程

声明

部分内容来自网络本教程仅用于学习,禁止用于其他用途




转载请注明:http://www.aierlanlan.com/tzrz/7729.html

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