diff --git a/app/src/main/assets/docs/all.html b/app/src/main/assets/docs/all.html index 1920eb19..b9861522 100644 --- a/app/src/main/assets/docs/all.html +++ b/app/src/main/assets/docs/all.html @@ -2,8 +2,8 @@
-索引 | @@ -77,8 +77,9 @@
点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持Auto.js后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。
如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目打包功能。
-如果一个脚本是用intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的intent,从而获取外部参数。
如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。
+点击Auto.js的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的apk打包图标即可打包一个项目,点击工具栏可以重新配置项目。
例如,主脚本要读取同一文件夹下的图片1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录1.png图片;ui中的图片控件要引用同一文件夹的2.png图片则为<img src="file://2.png"/>。Auto.js内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。
目前Auto.js还不支持项目的图形化管理,后续会加入。
-需要使用项目打包功能。
-{
-"name": "项目名称",
-"versionName": "1.0.0",
-"versionCode": 1,
-"packageName": "org.autojs.example",
-"main": "main.js",
-"launchConfig": {
- "hideLogs": true
+如何使打包的应用不显示主界面#
+需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:
+"launchConfig": {
+ "hideLogs": true
}
+
例如:
+{
+ "name": "项目名称",
+ "versionName": "1.0.0",
+ "versionCode": 1,
+ "packageName": "org.autojs.example",
+ "main": "main.js",
+ "launchConfig": {
+ "hideLogs": true
+ }
}
-
其中,项目名称改为自己的项目名称,"org.autojs.example"改成自己的包名,下面的"launchConfig"表示启动配置,"hideLogs"表示隐藏日志。有关项目打包和配置的更多信息,参见项目与项目配置(待补)。
+"launchConfig"表示启动配置,"hideLogs"表示隐藏日志。
+参见项目与项目配置。
由于Auto.js支持直接调用Android的API,对于Auto.js没有内置的函数,可以直接通过修改Android代码为JavaScript代码实现。例如旋转图片的Android代码为:
import android.graphics.Bitmap;
@@ -1060,7 +1106,7 @@ launch("com.tencent.mm");
该函数也可以作为全局函数使用。
app.viewFile(path)#
用其他应用查看文件。文件不存在的情况由查看文件的应用处理。
如果找不出可以查看该文件的应用,则抛出ActivityNotException。
@@ -1068,7 +1114,7 @@ launch("com.tencent.mm");
app.viewFile("/sdcard/1.txt");
用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。
如果找不出可以编辑该文件的应用,则抛出ActivityNotException。
本模块提供了构建Intent的函数(app.intent()), 启动Activity的函数app.startActivity(), 发送广播的函数app.sendBroadcast()。
使用这些方法可以用来方便的调用其他应用。例如直接打开某个QQ号的个人卡片页,打开某个QQ号的聊天窗口等。
-
+var qq = "2732014414";
+app.startActivity({
+ action: "android.intent.action.VIEW",
+ data:"mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin=" + qq,
+ packageName: "com.tencent.mobileqq",
+});
app.intent(options)#
-- options <Object> 选项,包括:
-action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。常见的action参见常用的意图动作。
-type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
-data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。
-category <Array> 意图的类别。比较少用。
-packageName <string> 目标包名
-className <string> 目标Activity或Service等组件的名称
-extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。
+options <Object> 选项,包括:
+
+action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。参见Actions。
+
+type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
+
+data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。
+
+category <Array> 意图的类别。比较少用。参见Categories。
+
+packageName <string> 目标包名
+
+className <string> 目标Activity或Service等组件的名称
+
+extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见Extras。
+
+flags <Array> intent的标识,字符串数组,例如["activity_new_task", "grant_read_uri_permission"]。参见Flags。
+[v4.1.0新增]
+
+root <Boolea> 是否以root权限启动、发送该intent。使用该参数后,不能使用context.startActivity()等方法,而应该直接使用诸如app.startActivity({...})的方法。
+[v4.1.0新增]
+
@@ -1154,19 +1219,75 @@ var i = app.intent({
type: "image/png",
data: "file:///sdcard/1.png"
});
-app.startActivity(i);
-更多信息,请百度安卓Intent或参考Android指南: Intent。
+context.startActivity(i);
+需要注意的是,除非应用专门暴露Activity出来,否则在没有root权限的情况下使用intent是无法跳转到特定Activity、应用的特定界面的。例如我们能通过Intent跳转到QQ的分享界面,是因为QQ对外暴露了分享的Activity;而在没有root权限的情况下,我们无法通过intent跳转到QQ的设置界面,因为QQ并没有暴露这个Activity。
+但如果有root权限,则在intent的参数加上"root": true即可。例如使用root权限跳转到Auto.js的设置界面为:
+app.startActivity({
+ packageName: "org.autojs.autojs",
+ className: "org.autojs.autojs.ui.settings.SettingsActivity_",
+ root: true
+});
+
另外,关于intent的参数如何获取的问题,一些intent是意外发现并且在网络中传播的(例如跳转QQ聊天窗口是因为QQ给网页提供了跳转到客服QQ的方法),如果要自己获取活动的intent的参数,可以通过例如"intent记录","隐式启动"等应用拦截内部intent或者查询暴露的intent。其中拦截内部intent需要XPosed框架,或者可以通过反编译等手段获取参数。总之,没有简单直接的方法。
+更多信息,请百度安卓Intent或参考Android指南: Intent。
app.startActivity(options)#
根据选项构造一个Intent,并启动该Activity。
-app.sendBroadcast(options)#
+app.startActivity({
+ action: "SEND",
+ type: "text/plain",
+ data: "file:///sdcard/1.txt"
+});
+
app.sendBroadcast(options)#
根据选项构造一个Intent,并发送该广播。
-
+app.startService(options)#
+
+options <Object> 选项
+
+根据选项构造一个Intent,并启动该服务。
+app.sendBroadcast(name)#
+[v4.1.0新增]
+
+name <string> 特定的广播名称,包括:
+inspect_layout_hierarchy 布局层次分析
+inspect_layout_bounds 布局范围
+
+
+
+发送以上特定名称的广播可以触发Auto.js的布局分析,方便脚本调试。这些广播在Auto.js发送才有效,在打包的脚本上运行将没有任何效果。
+app.sendBroadcast("inspect_layout_bounds");
+
app.intentToShell(options)#
+[v4.1.0新增]
+
+options <Object> 选项
+
+根据选项构造一个Intent,转换为对应的shell的intent命令的参数。
+例如:
+shell("am start " + app.intentToShell({
+ packageName: "org.autojs.autojs",
+ className: "org.autojs.autojs.ui.settings.SettingsActivity_"
+}), true);
+
参见intent参数的规范。
+app.parseUri(uri)#
+[v4.1.0新增]
+
+uri <string> 一个代表Uri的字符串,例如"file:///sdcard/1.txt", "https://www.autojs.org"
+- 返回 <Uri> 一个代表Uri的对象,参见android.net.Uri。
+
+解析uri字符串并返回相应的Uri对象。即使Uri格式错误,该函数也会返回一个Uri对象,但之后如果访问该对象的scheme, path等值可能因解析失败而返回null。
+需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此如果uri字符串是文件file://...,返回的Uri会是诸如content://...的形式。
+app.getUriForFile(path)#
+[v4.1.0新增]
+
+path <string> 文件路径,例如"/sdcard/1.txt"
+- 返回 <Uri> 一个指向该文件的Uri的对象,参见android.net.Uri。
+
+从一个文件路径创建一个uri对象。需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此返回的Uri会是诸如content://...的形式。
+
Console#
Stability: 2 - Stable控制台模块提供了一个和Web浏览器中相似的用于调试的控制台。用于输出一些调试信息、中间结果等。
@@ -1179,8 +1300,8 @@ console模块中的一些函数也可以直接作为全局函数使用,例如l
清空控制台。
console.log([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
打印到控制台,并带上换行符。 可以传入多个参数,第一个参数作为主要信息,其他参数作为类似于 printf(3) 中的代替值(参数都会传给 util.format())。
const count = 5;
@@ -1192,26 +1313,26 @@ console.log('count:', count);
该函数也可以作为全局函数使用。
console.verbose([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以灰色字体显示。输出优先级低于log,用于输出观察性质的信息。
console.info([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以绿色字体显示。输出优先级高于log, 用于输出重要信息。
console.warn([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以蓝色字体显示。输出优先级高于info, 用于输出警告信息。
console.error([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以红色字体显示。输出优先级高于warn, 用于输出错误信息。
console.assert(value, message)#
@@ -1222,10 +1343,46 @@ console.log('count:', count);
断言。如果value为false则输出错误信息message并停止脚本运行。
var a = 1 + 1;
console.assert(a == 2, "加法出错啦");
-
console.input(data[, ...args])#
+[v4.1.0新增]
+label <String> 计时器标签,可省略启动一个定时器,用以计算一个操作的持续时间。
+定时器由一个唯一的 label 标识。
+当调用 console.timeEnd() 时,可以使用相同的 label 来停止定时器,并以毫秒为单位将持续时间输出到控制台。
+重复启动同一个标签的定时器会覆盖之前启动同一标签的定时器。
[v4.1.0新增]
+label <String> 计时器标签停止之前通过调用 console.time() 启动的定时器,并打印结果到控制台。
+调用 console.timeEnd() 后定时器会被删除。如果不存在标签指定的定时器则会打印 NaNms。
console.time('求和');
+var sum = 0;
+for(let i = 0; i < 100000; i++){
+ sum += i;
+}
+console.timeEnd('求和');
+// 打印 求和: xxx ms
+
+[v4.1.0新增]
+data <any>...args <any>与console.log类似,同时会打印出调用这个函数所在的调用栈信息(即当前运行的文件、行数等信息)。
+console.trace('Show me');
+// 打印: (堆栈跟踪会根据被调用的跟踪的位置而变化)
+// Show me
+// at <test>:7
+
+data ...args data <any>...args <any>与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串用eval计算后返回。
部分机型可能会有控制台不显示输入框的情况,属于bug。
@@ -1236,8 +1393,8 @@ toast(n + 1); //显示124data ...args data <any>...args <any>与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串直接返回。
部分机型可能会有控制台不显示输入框的情况,属于bug。
@@ -1263,7 +1420,24 @@ console.setSize(device.width / 2, device.height / 2);设置控制台的位置,单位像素。
console.show();
console.setPosition(100, 100);
-[v4.1.0新增]
+config <Object> 日志配置,可选的项有:
+设置日志保存的路径和配置。例如把日志保存到"/sdcard/1.txt":
+console.setGlobalLogConfig({
+ "file": "/sdcard/1.txt"
+});
+注意该函数会影响所有脚本的日志记录。
+停止所有正在运行的脚本并显示停止的脚本数量。包括当前脚本自身。
返回当前脚本的脚本引擎对象(ScriptEngine)
+[v4.1.0新增]
+特别的,该对象可以通过execArgv来获取他的运行参数,包括外部参数、intent等。例如:
log(engines.myEngine().execArgv);
+普通脚本的运行参数通常为空,通过定时任务的广播启动的则可以获取到启动的intent。
您可以通过APK编辑器来增加Auto.js以及Auto.js打包的应用的权限。
安卓所有的权限列表参见Permissions Overview。(并没有用)
+path <string> jar文件路径加载目标jar文件,加载成功后将可以使用该Jar文件的类。
+// 加载jsoup.jar
+runtime.loadJar("./jsoup.jar");
+// 使用jsoup解析html
+importClass(org.jsoup.Jsoup);
+log(Jsoup.parse(files.read("./test.html")));
+(jsoup是一个Java实现的解析Html DOM的库,可以在Jsoup下载)
+path <string> dex文件路径加载目标dex文件,加载成功后将可以使用该dex文件的类。
+因为加载jar实际上是把jar转换为dex再加载的,因此加载dex文件会比jar文件快得多。可以使用Android SDK的build tools的dx工具把jar转换为dex。
全局变量。一个android.content.Context对象。
注意该对象为ApplicationContext,因此不能用于界面、对话框等的创建。 @@ -3608,7 +3803,304 @@ log(colors.equals(0xFF112233, 0xFF223344));
透明,颜色值 #00000000
images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、找色、找图等。
+images模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。
+该模块分为两个部分,找图找色部分和图片处理部分。
+需要注意的是,image对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管Auto.js通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。
+Image对象通过调用recycle()函数来回收。例如:
// 读取图片
+var img = images.read("./1.png");
+//对图片进行操作
+...
+// 回收图片
+img.recycle();
+例外的是,caputerScreen()返回的图片不需要回收。
path <string> 图片路径读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。
+url <string> 图片URL地址加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。
+img <Image> 图片复制一张图片并返回新的副本。该函数会完全复制img对象的数据。
+把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
+//把图片压缩为原来的一半质量并保存
+var img = images.read("/sdcard/1.png");
+images.save(img, "/sdcard/1.jpg", "jpg", 50);
+app.viewFile("/sdcard/1.jpg");
+base64 <string> 图片的Base64数据解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null。
把图片编码为base64数据并返回。
+bytes <byte[]> 字节数组解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null。
把图片编码为字节数组并返回。
+从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。
+var src = images.read("/sdcard/1.png");
+var clip = images.clip(src, 100, 100, 400, 400);
+images.save(clip, "/sdcard/clip.png");
+[v4.1.0新增]
+img <Image> 图片size <Array> 两个元素的数组[w, h],分别表示宽度和高度;如果只有一个元素,则宽度和高度相等interpolation <string> 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有:
NEAREST 最近邻插值LINEAR 线性插值(默认)AREA 区域插值CUBIC 三次样条插值LANCZOS4 Lanczos插值
+参见InterpolationFlags返回 <Image>
+调整图片大小,并返回调整后的图片。例如把图片放缩为200*300:images.resize(img, [200, 300])。
[v4.1.0新增]
+img <Image> 图片fx <number> 宽度放缩倍数fy <number> 高度放缩倍数interpolation <string> 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有:
NEAREST 最近邻插值LINEAR 线性插值(默认)AREA 区域插值CUBIC 三次样条插值LANCZOS4 Lanczos插值
+参见InterpolationFlags返回 <Image>
+放缩图片,并返回放缩后的图片。例如把图片变成原来的一半:images.scale(img, 0.5, 0.5)。
[v4.1.0新增]
+img <Image> 图片degress <number> 旋转角度。x <number> 旋转中心x坐标,默认为图片中点y <number> 旋转中心y坐标,默认为图片中点将图片逆时针旋转degress度,返回旋转后的图片对象。
+例如逆时针旋转90度为images.rotate(img, 90)。
[v4.1.0新增]
+img1 <Image> 图片1img2 <Image> 图片2LEFT 将图片2接到图片1左边RIGHT 将图片2接到图片1右边TOP 将图片2接到图片1上边BOTTOM 将图片2接到图片1下边连接两张图片,并返回连接后的图像。如果两张图片大小不一致,小的那张将适当居中。
+[v4.1.0新增]
+img <Image> 图片灰度化图片,并返回灰度化后的图片。
+[v4.1.0新增]
+img <Image> 图片threshold <number> 阈值maxVal <number> 最大值type <string> 阈值化类型,默认为"BINARY",参见ThresholdTypes, 可选的值:
BINARY BINARY_INV TRUNCTOZEROTOZERO_INVOTSUTRIANGLE 返回 <Image>
+将图片阈值化,并返回处理后的图像。可以用这个函数进行图片二值化。例如:images.threshold(img, 100, 255, "BINARY"),这个代码将图片中大于100的值全部变成255,其余变成0,从而达到二值化的效果。如果img是一张灰度化图片,这个代码将会得到一张黑白图片。
可以参考有关博客(比如threshold函数的使用)或者OpenCV文档threshold。
+[v4.1.0新增]
+img <Image> 图片maxValue <number> 最大值adaptiveMethod <string> 在一个邻域内计算阈值所采用的算法,可选的值有:MEAN_C 计算出领域的平均值再减去参数C的值GAUSSIAN_C 计算出领域的高斯均值再减去参数C的值thresholdType <string> 阈值化类型,可选的值有:BINARYBINARY_INV blockSize <number> 邻域块大小C <number> 偏移值调整量对图片进行自适应阈值化处理,并返回处理后的图像。
+可以参考有关博客(比如threshold与adaptiveThreshold)或者OpenCV文档adaptiveThreshold。
+[v4.1.0新增]
+img <Image> 图片code <string> 颜色空间转换的类型,可选的值有一共有205个(参见ColorConversionCodes),这里只列出几个:BGR2GRAY BGR转换为灰度BGR2HSV BGR转换为HSV dstCn <number> 目标图像的颜色通道数量,如果不填写则根据其他参数自动决定。对图像进行颜色空间转换,并返回转换后的图像。
+可以参考有关博客(比如颜色空间转换)或者OpenCV文档cvtColor。
+[v4.1.0新增]
+img <Image> 图片lowerBound <string> | <number> 颜色下界upperBound <string> | <number> 颜色下界将图片二值化,在lowerBound~upperBound范围以外的颜色都变成0,在范围以内的颜色都变成255。
+例如images.inRange(img, "#000000", "#222222")。
[v4.1.0新增]
+ +将图片二值化,在color-interval ~ color+interval范围以外的颜色都变成0,在范围以内的颜色都变成255。这里对color的加减是对每个通道而言的。
+例如images.interval(img, "#888888", 16),每个通道的颜色值均为0x88,加减16后的范围是[0x78, 0x98],因此这个代码将把#787878~#989898的颜色变成#FFFFFF,而把这个范围以外的变成#000000。
[v4.1.0新增]
+img <Image> 图片size <Array> 定义滤波器的大小,如[3, 3]anchor <Array> 指定锚点位置(被平滑点),默认为图像中心type <string> 推断边缘像素类型,默认为"DEFAULT",可选的值有:CONSTANT iiiiii|abcdefgh|iiiiiii with some specified iREPLICATE aaaaaa|abcdefgh|hhhhhhhREFLECT fedcba|abcdefgh|hgfedcbWRAP cdefgh|abcdefgh|abcdefgREFLECT_101 gfedcb|abcdefgh|gfedcbaTRANSPARENT uvwxyz|abcdefgh|ijklmnoREFLECT101 same as BORDER_REFLECT_101DEFAULT same as BORDER_REFLECT_101ISOLATED do not look outside of ROI对图像进行模糊(平滑处理),返回处理后的图像。
+可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur。
+[v4.1.0新增]
+img <Image> 图片size <Array> 定义滤波器的大小,如[3, 3]对图像进行中值滤波,返回处理后的图像。
+可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur。
+[v4.1.0新增]
+img <Image> 图片size <Array> 定义滤波器的大小,如[3, 3]sigmaX <number> x方向的标准方差,不填写则自动计算sigmaY <number> y方向的标准方差,不填写则自动计算type <string> 推断边缘像素类型,默认为"DEFAULT",参见images.blur对图像进行高斯模糊,返回处理后的图像。
+可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档GaussianBlur。
+[v4.1.0新增]
+mat <Mat> OpenCV的Mat对象把Mat对象转换为Image对象。
+landscape <boolean> 布尔值, 表示将要执行的截屏是否为横屏。如果landscape为false, 则表示竖屏截图; true为横屏截图。返回图片image在点(x, y)处的像素的ARGB值。
该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。
坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
-img <Image> 图片复制一张图片并返回新的副本。该函数会完全复制img对象的数据。
-把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
-//把图片压缩为原来的一半质量并保存
-var img = images.read("/sdcard/1.png");
-images.save(img, "/sdcard/1.jpg", "jpg", 50);
-app.viewFile("/sdcard/1.jpg");
-path <string> 图片路径读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。
-url <string> 图片URL地址加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。
-base64 <string> 图片的Base64数据解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null。
把图片编码为base64数据并返回。
-bytes <byte[]> 字节数组解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null。
把图片编码为字节数组并返回。
-从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。
-var src = images.read("/sdcard/1.png");
-var clip = images.clip(src, 100, 100, 400, 400);
-images.save(clip, "/sdcard/clip.png");
-image <Image> 图片color <number> | <string> 要寻找的颜色的RGB值。如果是一个整数,则以0xRRGGBB的形式代表RGB值(A通道会被忽略);如果是字符串,则以"#RRGGBB"代表其RGB值。该函数也可以作为全局函数使用。
-[v4.1.0新增]
+img <Image> 大图片template <Image> 小图片(模板)options <Object> 找图选项:
+在大图片中搜索小图片,并返回搜索结果MatchingResult。该函数可以用于找图时找出多个位置,可以通过max参数控制最大的结果数量。也可以对匹配结果进行排序、求最值等操作。
+[v4.1.0新增]
+数组的元素是一个Match对象:
+point <Point> 匹配位置similarity <number> 相似度例如:
+var result = images.matchTemplate(img, template, {
+ max: 100
+});
+result.matches.forEach(match => {
+ log("point = " + match.point + ", similarity = " + match.similarity);
+});
+第一个匹配结果。如果没有任何匹配,则返回null。
最后一个匹配结果。如果没有任何匹配,则返回null。
位于大图片最左边的匹配结果。如果没有任何匹配,则返回null。
位于大图片最上边的匹配结果。如果没有任何匹配,则返回null。
位于大图片最右边的匹配结果。如果没有任何匹配,则返回null。
位于大图片最下边的匹配结果。如果没有任何匹配,则返回null。
相似度最高的匹配结果。如果没有任何匹配,则返回null。
相似度最低的匹配结果。如果没有任何匹配,则返回null。
left(左), top (上), right (右), bottom(下)。对匹配结果进行排序,并返回排序后的结果。
+var result = images.matchTemplate(img, template, {
+ max: 100
+});
+log(result.sortBy("top-right"));
+表示一张图片,可以是截图的图片,或者本地读取的图片,或者从网络获取的图片。
返回以像素为单位图片宽度。
@@ -3942,6 +4438,7 @@ if(p){返回图片image在点(x, y)处的像素的ARGB值。
该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。
坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
+##
findColor, findImage返回的对象。表示一个点(坐标)。
Auto.js 有一个简单的模块加载系统。 在 Auto.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块)。
例子,假设有一个名为 foo.js 的文件:
-const circle = require('circle.js');
+var circle = require('circle.js');
console.log("半径为 4 的圆的面积是 %d", circle.area(4));
在第一行中,foo.js 加载了同一目录下的 circle.js 模块。
circle.js 文件的内容为:
@@ -4218,7 +4715,9 @@ console.log("半径为 4 的圆的面积是 %d", circle.area(4));
var circle = {};
-circle.area = (r) => PI * r ** 2;
+circle.area = function (r) {
+ return PI * r * r;
+};
circle.circumference = (r) => 2 * PI * r;
@@ -4261,6 +4760,7 @@ module.exports = function(width) {
auto();
auto.waitFor()#
检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。
+因为该函数是阻塞的,因此除非是有协程特性,否则不能在ui模式下运行该函数,建议在ui模式下使用auto()函数。
auto.setMode(mode)#
mode <string> 模式
@@ -4270,6 +4770,72 @@ module.exports = function(width) {
fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
normal 正常模式,默认。
+auto.setFlags(flags)#
+[v4.1.0新增]
+
+flags <string> | <Array> 一些标志,来启用和禁用某些特性,包括:
+findOnUiThread 使用该特性后,选择器搜索时会在主进程进行。该特性用于解决线程安全问题导致的次生问题,不过目前貌似已知问题并不是线程安全问题。
+useUsageStats 使用该特性后,将会以"使用情况统计"服务的结果来检测当前正在运行的应用包名(需要授予"查看使用情况统计"权限)。如果觉得currentPackage()返回的结果不太准确,可以尝试该特性。
+useShell 使用该特性后,将使用shell命令获取当前正在运行的应用的包名、活动名称,但是需要root权限。
+
+
+
+启用有关automator的一些特性。例如:
+auto.setFlags(["findOnUiThread", "useShell"]);
+
auto.serivce#
+[v4.1.0新增]
+
+获取无障碍服务。如果无障碍服务没有启动,则返回null。
+
+auto.windows#
+[v4.1.0新增]
+
+- <Array>
+
+当前所有窗口(AccessibilityWindowInfo)的数组,可能包括状态栏、输入法、当前应用窗口,弹出窗口、悬浮窗、分屏应用窗口等。可以分别获取每个窗口的布局信息。
+该函数需要Android 5.0以上才能运行。
+auto.root#
+[v4.1.0新增]
+
+- <UiObject>
+
+当前窗口的布局根元素。如果无障碍服务未启动或者WindowFilter均返回false,则会返回null。
+如果不设置windowFilter,则当前窗口即为活跃的窗口(获取到焦点、正在触摸的窗口);如果设置了windowFilter,则获取的是过滤的窗口中的第一个窗口。
+如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素。
+auto.rootInActiveWindow#
+[v4.1.0新增]
+
+- <UiObject>
+
+当前活跃的窗口(获取到焦点、正在触摸的窗口)的布局根元素。如果无障碍服务未启动则为null。
+auto.setWindowFilter(filter)#
+[v4.1.0新增]
+
+filter <Function> 参数为窗口(AccessibilityWindowInfo),返回值为Boolean的函数。
+
+设置窗口过滤器。这个过滤器可以决定哪些窗口是目标窗口,并影响选择器的搜索。例如,如果想要选择器在所有窗口(包括状态栏、输入法等)中搜索,只需要使用以下代码:
+auto.setWindowFilter(function(window){
+ //不管是如何窗口,都返回true,表示在该窗口中搜索
+ return true;
+});
+
又例如,当前使用了分屏功能,屏幕上有Auto.js和QQ两个应用,但我们只想选择器对QQ界面进行搜索,则:
+auto.setWindowFilter(function(window){
+ // 对于应用窗口,他的title属性就是应用的名称,因此可以通过title属性来判断一个应用
+ return window.title == "QQ";
+});
+
选择器默认是在当前活跃的窗口中搜索,不会搜索诸如悬浮窗、状态栏之类的,使用WindowFilter则可以控制搜索的窗口。
+需要注意的是, 如果WindowFilter返回的结果均为false,则选择器的搜索结果将为空。
+另外setWindowFilter函数也会影响auto.windowRoots的结果。
+该函数需要Android 5.0以上才有效。
+auto.windowRoots#
+[v4.1.0新增]
+
+- <Array>
+
+返回当前被WindowFilter过滤的窗口的布局根元素组成的数组。
+如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素的数组。
SimpleActionAutomator#
Stability: 2 - StableSimpleActionAutomator提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。
click(text[, i])#
@@ -4402,6 +4968,18 @@ sendButton.click();
创建一个新的选择器。但一般情况不需要使用该函数,因为可以直接用相应条件的语句创建选择器。
由于历史遗留原因,本不应该这样设计(不应该让id(), text()等作为全局函数,而是应该用By.id(), By.text()),但为了后向兼容性只能保留这个设计。
这样的API设计会污染全局变量,后续可能会支持"去掉这些全局函数而使用By.*"的选项。
+UiSelector.algorithm(algorithm)#
+[v4.1.0新增]
+
+algorithm <string> 搜索算法,可选的值有:
+DFS 深度优先算法,选择器的默认算法
+BFS 广度优先算法
+
+
+
+指定选择器的搜索算法。例如:
+log(selector().text("文本").algorithm("BFS").find());
+
广度优先在控件所在层次较低时,或者布局的层次不多时,通常能更快找到控件。
UiSelector.text(str)#
str <string> 控件文本
@@ -6005,11 +6583,12 @@ setTimeout(function(){
用户界面: UI#
ui模块提供了编写用户界面的支持。
-带有ui的脚本的第一行必须使用"ui"指定ui模式,否则脚本将不会以ui模式运行。正确示范:
+带有ui的脚本的的最前面必须使用"ui";指定ui模式,否则脚本将不会以ui模式运行。正确示范:
"ui";
//脚本的其他代码
-
界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。
+字符串"ui"的前面可以有注释、空行和空格[v4.1.0新增],但是不能有其他代码。
+界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。
我们使用xml来编写界面,并通过ui.layout()函数指定界面的布局xml。举个例子:
"ui";
ui.layout(
diff --git a/app/src/main/assets/docs/app.html b/app/src/main/assets/docs/app.html
index ca798aa3..b67caca8 100644
--- a/app/src/main/assets/docs/app.html
+++ b/app/src/main/assets/docs/app.html
@@ -2,8 +2,8 @@
- App | Auto.js 3.0.0 文档
-
+ App | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -97,6 +97,11 @@
app.intent(options)
app.startActivity(options)
app.sendBroadcast(options)
+app.startService(options)
+app.sendBroadcast(name)
+app.intentToShell(options)
+app.parseUri(uri)
+app.getUriForFile(path)
@@ -173,7 +178,7 @@ launch("com.tencent.mm");
该函数也可以作为全局函数使用。
app.viewFile(path)#
用其他应用查看文件。文件不存在的情况由查看文件的应用处理。
如果找不出可以查看该文件的应用,则抛出ActivityNotException。
@@ -181,7 +186,7 @@ launch("com.tencent.mm");
app.viewFile("/sdcard/1.txt");
app.editFile(path)#
用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。
如果找不出可以编辑该文件的应用,则抛出ActivityNotException。
@@ -245,17 +250,36 @@ app.sendEmail({
本模块提供了构建Intent的函数(app.intent()), 启动Activity的函数app.startActivity(), 发送广播的函数app.sendBroadcast()。
使用这些方法可以用来方便的调用其他应用。例如直接打开某个QQ号的个人卡片页,打开某个QQ号的聊天窗口等。
-
+var qq = "2732014414";
+app.startActivity({
+ action: "android.intent.action.VIEW",
+ data:"mqq://im/chat?chat_type=wpa&version=1&src_type=web&uin=" + qq,
+ packageName: "com.tencent.mobileqq",
+});
app.intent(options)#
-- options <Object> 选项,包括:
-action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。常见的action参见常用的意图动作。
-type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
-data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。
-category <Array> 意图的类别。比较少用。
-packageName <string> 目标包名
-className <string> 目标Activity或Service等组件的名称
-extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。
+options <Object> 选项,包括:
+
+action <string> 意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。参见Actions。
+
+type <string> 意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
+
+data <string> 意图的Data,表示和该意图直接相关的数据,是一个Uri, 可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW", data为"file:///sdcard/1.txt"。
+
+category <Array> 意图的类别。比较少用。参见Categories。
+
+packageName <string> 目标包名
+
+className <string> 目标Activity或Service等组件的名称
+
+extras <Object> 以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见Extras。
+
+flags <Array> intent的标识,字符串数组,例如["activity_new_task", "grant_read_uri_permission"]。参见Flags。
+[v4.1.0新增]
+
+root <Boolea> 是否以root权限启动、发送该intent。使用该参数后,不能使用context.startActivity()等方法,而应该直接使用诸如app.startActivity({...})的方法。
+[v4.1.0新增]
+
@@ -267,18 +291,74 @@ var i = app.intent({
type: "image/png",
data: "file:///sdcard/1.png"
});
-app.startActivity(i);
-更多信息,请百度安卓Intent或参考Android指南: Intent。
+context.startActivity(i);
+需要注意的是,除非应用专门暴露Activity出来,否则在没有root权限的情况下使用intent是无法跳转到特定Activity、应用的特定界面的。例如我们能通过Intent跳转到QQ的分享界面,是因为QQ对外暴露了分享的Activity;而在没有root权限的情况下,我们无法通过intent跳转到QQ的设置界面,因为QQ并没有暴露这个Activity。
+但如果有root权限,则在intent的参数加上"root": true即可。例如使用root权限跳转到Auto.js的设置界面为:
+app.startActivity({
+ packageName: "org.autojs.autojs",
+ className: "org.autojs.autojs.ui.settings.SettingsActivity_",
+ root: true
+});
+
另外,关于intent的参数如何获取的问题,一些intent是意外发现并且在网络中传播的(例如跳转QQ聊天窗口是因为QQ给网页提供了跳转到客服QQ的方法),如果要自己获取活动的intent的参数,可以通过例如"intent记录","隐式启动"等应用拦截内部intent或者查询暴露的intent。其中拦截内部intent需要XPosed框架,或者可以通过反编译等手段获取参数。总之,没有简单直接的方法。
+更多信息,请百度安卓Intent或参考Android指南: Intent。
app.startActivity(options)#
根据选项构造一个Intent,并启动该Activity。
-app.sendBroadcast(options)#
+app.startActivity({
+ action: "SEND",
+ type: "text/plain",
+ data: "file:///sdcard/1.txt"
+});
+
app.sendBroadcast(options)#
根据选项构造一个Intent,并发送该广播。
+app.startService(options)#
+
+options <Object> 选项
+
+根据选项构造一个Intent,并启动该服务。
+app.sendBroadcast(name)#
+[v4.1.0新增]
+
+name <string> 特定的广播名称,包括:
+inspect_layout_hierarchy 布局层次分析
+inspect_layout_bounds 布局范围
+
+
+
+发送以上特定名称的广播可以触发Auto.js的布局分析,方便脚本调试。这些广播在Auto.js发送才有效,在打包的脚本上运行将没有任何效果。
+app.sendBroadcast("inspect_layout_bounds");
+
app.intentToShell(options)#
+[v4.1.0新增]
+
+options <Object> 选项
+
+根据选项构造一个Intent,转换为对应的shell的intent命令的参数。
+例如:
+shell("am start " + app.intentToShell({
+ packageName: "org.autojs.autojs",
+ className: "org.autojs.autojs.ui.settings.SettingsActivity_"
+}), true);
+
参见intent参数的规范。
+app.parseUri(uri)#
+[v4.1.0新增]
+
+uri <string> 一个代表Uri的字符串,例如"file:///sdcard/1.txt", "https://www.autojs.org"
+- 返回 <Uri> 一个代表Uri的对象,参见android.net.Uri。
+
+解析uri字符串并返回相应的Uri对象。即使Uri格式错误,该函数也会返回一个Uri对象,但之后如果访问该对象的scheme, path等值可能因解析失败而返回null。
+需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此如果uri字符串是文件file://...,返回的Uri会是诸如content://...的形式。
+app.getUriForFile(path)#
+[v4.1.0新增]
+
+path <string> 文件路径,例如"/sdcard/1.txt"
+- 返回 <Uri> 一个指向该文件的Uri的对象,参见android.net.Uri。
+
+从一个文件路径创建一个uri对象。需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此返回的Uri会是诸如content://...的形式。
diff --git a/app/src/main/assets/docs/assets/fonts.css b/app/src/main/assets/docs/assets/fonts.css
new file mode 100644
index 00000000..40e55798
--- /dev/null
+++ b/app/src/main/assets/docs/assets/fonts.css
@@ -0,0 +1,48 @@
+/* latin-ext */
+@font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 400;
+ src: local('Lato Italic'), local('Lato-Italic'), url(fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+ }
+ /* latin */
+ @font-face {
+ font-family: 'Lato';
+ font-style: italic;
+ font-weight: 400;
+ src: local('Lato Italic'), local('Lato-Italic'), url(fonts/S6u8w4BMUTPHjxsAXC-q.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
+ /* latin-ext */
+ @font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Lato Regular'), local('Lato-Regular'), url(fonts/S6uyw4BMUTPHjxAwXjeu.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+ }
+ /* latin */
+ @font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Lato Regular'), local('Lato-Regular'), url(fonts/S6uyw4BMUTPHjx4wXg.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
+ /* latin-ext */
+ @font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Lato Bold'), local('Lato-Bold'), url(fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+ }
+ /* latin */
+ @font-face {
+ font-family: 'Lato';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Lato Bold'), local('Lato-Bold'), url(fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+ }
\ No newline at end of file
diff --git a/app/src/main/assets/docs/assets/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 b/app/src/main/assets/docs/assets/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2
new file mode 100644
index 00000000..d88f1af8
Binary files /dev/null and b/app/src/main/assets/docs/assets/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 differ
diff --git a/app/src/main/assets/docs/assets/fonts/S6uyw4BMUTPHjx4wXg.woff2 b/app/src/main/assets/docs/assets/fonts/S6uyw4BMUTPHjx4wXg.woff2
new file mode 100644
index 00000000..b14c76ca
Binary files /dev/null and b/app/src/main/assets/docs/assets/fonts/S6uyw4BMUTPHjx4wXg.woff2 differ
diff --git a/app/src/main/assets/docs/canvas.html b/app/src/main/assets/docs/canvas.html
index 46bfd8c1..15d58806 100644
--- a/app/src/main/assets/docs/canvas.html
+++ b/app/src/main/assets/docs/canvas.html
@@ -2,8 +2,8 @@
- Canvas | Auto.js 3.0.0 文档
-
+ Canvas | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/console.html b/app/src/main/assets/docs/console.html
index 3a12754c..30ca88cf 100644
--- a/app/src/main/assets/docs/console.html
+++ b/app/src/main/assets/docs/console.html
@@ -2,8 +2,8 @@
- Console | Auto.js 3.0.0 文档
-
+ Console | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -84,10 +84,14 @@
console.warn([data][, ...args])
console.error([data][, ...args])
console.assert(value, message)
+console.time([label])
+console.timeEnd(label)
+console.trace([data][, ...args])
console.input(data[, ...args])
console.rawInput(data[, ...args])
console.setSize(w, h)
console.setPosition(x, y)
+console.setGlobalLogConfig(config)
print(text)
@@ -107,8 +111,8 @@ console模块中的一些函数也可以直接作为全局函数使用,例如l
清空控制台。
console.log([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
打印到控制台,并带上换行符。 可以传入多个参数,第一个参数作为主要信息,其他参数作为类似于 printf(3) 中的代替值(参数都会传给 util.format())。
const count = 5;
@@ -120,26 +124,26 @@ console.log('count:', count);
该函数也可以作为全局函数使用。
console.verbose([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以灰色字体显示。输出优先级低于log,用于输出观察性质的信息。
console.info([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以绿色字体显示。输出优先级高于log, 用于输出重要信息。
console.warn([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以蓝色字体显示。输出优先级高于info, 用于输出警告信息。
console.error([data][, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log类似,但输出结果以红色字体显示。输出优先级高于warn, 用于输出错误信息。
console.assert(value, message)#
@@ -150,10 +154,46 @@ console.log('count:', count);
断言。如果value为false则输出错误信息message并停止脚本运行。
var a = 1 + 1;
console.assert(a == 2, "加法出错啦");
-
console.input(data[, ...args])#
+console.time([label])#
+[v4.1.0新增]
+
+label <String> 计时器标签,可省略
+
+启动一个定时器,用以计算一个操作的持续时间。
+定时器由一个唯一的 label 标识。
+当调用 console.timeEnd() 时,可以使用相同的 label 来停止定时器,并以毫秒为单位将持续时间输出到控制台。
+重复启动同一个标签的定时器会覆盖之前启动同一标签的定时器。
+console.timeEnd(label)#
+[v4.1.0新增]
+
+label <String> 计时器标签
+
+停止之前通过调用 console.time() 启动的定时器,并打印结果到控制台。
+调用 console.timeEnd() 后定时器会被删除。如果不存在标签指定的定时器则会打印 NaNms。
+console.time('求和');
+var sum = 0;
+for(let i = 0; i < 100000; i++){
+ sum += i;
+}
+console.timeEnd('求和');
+// 打印 求和: xxx ms
+
+console.trace([data][, ...args])#
+[v4.1.0新增]
+
+data <any>
+...args <any>
+
+与console.log类似,同时会打印出调用这个函数所在的调用栈信息(即当前运行的文件、行数等信息)。
+console.trace('Show me');
+// 打印: (堆栈跟踪会根据被调用的跟踪的位置而变化)
+// Show me
+// at <test>:7
+
+console.input(data[, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串用eval计算后返回。
部分机型可能会有控制台不显示输入框的情况,属于bug。
@@ -164,8 +204,8 @@ toast(n + 1);
//显示124
console.rawInput(data[, ...args])#
-data
-...args
+data <any>
+...args <any>
与console.log一样输出信息,并在控制台显示输入框等待输入。按控制台的确认按钮后会将输入的字符串直接返回。
部分机型可能会有控制台不显示输入框的情况,属于bug。
@@ -191,7 +231,24 @@ console.setSize(device.width / 2, device.height / 2);
设置控制台的位置,单位像素。
console.show();
console.setPosition(100, 100);
-
print(text)#
+console.setGlobalLogConfig(config)#
+[v4.1.0新增]
+
+config <Object> 日志配置,可选的项有:
+
+
+设置日志保存的路径和配置。例如把日志保存到"/sdcard/1.txt":
+console.setGlobalLogConfig({
+ "file": "/sdcard/1.txt"
+});
+
注意该函数会影响所有脚本的日志记录。
+print(text)#
diff --git a/app/src/main/assets/docs/coordinates-based-automation.html b/app/src/main/assets/docs/coordinates-based-automation.html
index 2a3cd81f..4854db8f 100644
--- a/app/src/main/assets/docs/coordinates-based-automation.html
+++ b/app/src/main/assets/docs/coordinates-based-automation.html
@@ -2,8 +2,8 @@
- 基于坐标的触摸模拟 | Auto.js 3.0.0 文档
-
+ 基于坐标的触摸模拟 | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/device.html b/app/src/main/assets/docs/device.html
index 39d288ea..865171b4 100644
--- a/app/src/main/assets/docs/device.html
+++ b/app/src/main/assets/docs/device.html
@@ -2,8 +2,8 @@
- Device | Auto.js 3.0.0 文档
-
+ Device | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/dialogs.html b/app/src/main/assets/docs/dialogs.html
index 29ae1be5..2e8d7a3b 100644
--- a/app/src/main/assets/docs/dialogs.html
+++ b/app/src/main/assets/docs/dialogs.html
@@ -2,8 +2,8 @@
- Dialogs | Auto.js 3.0.0 文档
-
+ Dialogs | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -99,6 +99,9 @@
事件: multi_choice
事件: input
事件: input_change
+dialog.getProgress()
+dialog.getMaxProgress()
+dialog.getActionButton(action)
@@ -271,11 +274,11 @@ dialogs.select("请选择一个选项", ["选项A", "
itemsColor <string> | <number> 对话框列表的选项的文字颜色
itemsSelectMode <string> 对话框列表的选项选择模式,可以为:
select 普通选择模式
-singleChoice 单选模式
-multiChoice 多选模式
+single 单选模式
+multi 多选模式
-itemsSelectedIndex <number> | <Array> 对话框列表中???
+itemsSelectedIndex <number> | <Array> 对话框列表中预先选中的项目索引,如果是单选模式为一个索引;多选模式则为数组
positive <string> 对话框确定按钮的文字内容(最右边按钮)
positiveColor <string> | <number> 对话框确定按钮的文字颜色(最右边按钮)
neutral <string> 对话框中立按钮的文字内容(最左边按钮)
@@ -317,9 +320,9 @@ dialogs.select("请选择一个选项", ["选项A", "
dialogs.build({
title: "单选",
items: ["选项1", "选项2", "选项3", "选项4"],
- itemsSelectMode: "singleChoice",
+ itemsSelectMode: "single",
itemsSelectedIndex: 3
-}).on("item_select", (index, item)->{
+}).on("single_choice", (index, item)=>{
toast("您选择的是" + item);
}).show();
"处理中"对话框:
@@ -528,7 +531,26 @@ setTimeout(()=>{
}).on("input_change", (text, dialog)=>{
toast("你输入的是" + text);
}).show();
-
+dialog.getProgress()#
+
+- 返回 <number>
+
+获取当前进度条的进度值,是一个整数
+dialog.getMaxProgress()#
+
+- 返回 <number>
+
+获取当前进度条的最大进度值,是一个整数
+dialog.getActionButton(action)#
+
+action <string> 动作,包括:
+positive
+negative
+neutral
+
+
+
+
diff --git a/app/src/main/assets/docs/documentation.html b/app/src/main/assets/docs/documentation.html
index 2d07b665..3e314ef1 100644
--- a/app/src/main/assets/docs/documentation.html
+++ b/app/src/main/assets/docs/documentation.html
@@ -2,8 +2,8 @@
- 关于本文档 | Auto.js 3.0.0 文档
-
+ 关于本文档 | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/engines.html b/app/src/main/assets/docs/engines.html
index f58ed3d8..3f941928 100644
--- a/app/src/main/assets/docs/engines.html
+++ b/app/src/main/assets/docs/engines.html
@@ -2,8 +2,8 @@
- Engines | Auto.js 3.0.0 文档
-
+ Engines | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -185,6 +185,10 @@ exec(add, {a: 1, b:2});
停止所有正在运行的脚本并显示停止的脚本数量。包括当前脚本自身。
engines.myEngine()#
返回当前脚本的脚本引擎对象(ScriptEngine)
+[v4.1.0新增]
+特别的,该对象可以通过execArgv来获取他的运行参数,包括外部参数、intent等。例如:
+log(engines.myEngine().execArgv);
+
普通脚本的运行参数通常为空,通过定时任务的广播启动的则可以获取到启动的intent。
engines.all()#
- 返回 <Array>
diff --git a/app/src/main/assets/docs/events.html b/app/src/main/assets/docs/events.html
index b3f43660..b601d5e0 100644
--- a/app/src/main/assets/docs/events.html
+++ b/app/src/main/assets/docs/events.html
@@ -2,8 +2,8 @@
- Events | Auto.js 3.0.0 文档
-
+ Events | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/files.html b/app/src/main/assets/docs/files.html
index a182e972..01ffe297 100644
--- a/app/src/main/assets/docs/files.html
+++ b/app/src/main/assets/docs/files.html
@@ -2,8 +2,8 @@
- Files | Auto.js 3.0.0 文档
-
+ Files | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/floaty.html b/app/src/main/assets/docs/floaty.html
index c68ae3a6..145e078f 100644
--- a/app/src/main/assets/docs/floaty.html
+++ b/app/src/main/assets/docs/floaty.html
@@ -2,8 +2,8 @@
- Floaty | Auto.js 3.0.0 文档
-
+ Floaty | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/globals.html b/app/src/main/assets/docs/globals.html
index 0635fe44..1301d20e 100644
--- a/app/src/main/assets/docs/globals.html
+++ b/app/src/main/assets/docs/globals.html
@@ -2,8 +2,8 @@
- 全局变量与函数 | Auto.js 3.0.0 文档
-
+ 全局变量与函数 | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -90,6 +90,8 @@
- requiresApi(api)
- requiresAutojsVersion(version)
- runtime.requestPermissions(permissions)
+- runtime.loadJar(path)
+- runtime.loadDex(path)
- context
@@ -232,6 +234,23 @@ runtime.requestPermissions(["access_fine_location"]);
您可以通过APK编辑器来增加Auto.js以及Auto.js打包的应用的权限。
安卓所有的权限列表参见Permissions Overview。(并没有用)
+runtime.loadJar(path)#
+
+path <string> jar文件路径
+
+加载目标jar文件,加载成功后将可以使用该Jar文件的类。
+// 加载jsoup.jar
+runtime.loadJar("./jsoup.jar");
+// 使用jsoup解析html
+importClass(org.jsoup.Jsoup);
+log(Jsoup.parse(files.read("./test.html")));
+
(jsoup是一个Java实现的解析Html DOM的库,可以在Jsoup下载)
+runtime.loadDex(path)#
+
+path <string> dex文件路径
+
+加载目标dex文件,加载成功后将可以使用该dex文件的类。
+因为加载jar实际上是把jar转换为dex再加载的,因此加载dex文件会比jar文件快得多。可以使用Android SDK的build tools的dx工具把jar转换为dex。
context#
全局变量。一个android.content.Context对象。
注意该对象为ApplicationContext,因此不能用于界面、对话框等的创建。
diff --git a/app/src/main/assets/docs/http.html b/app/src/main/assets/docs/http.html
index 1d49d548..d3f85e40 100644
--- a/app/src/main/assets/docs/http.html
+++ b/app/src/main/assets/docs/http.html
@@ -2,8 +2,8 @@
- HTTP | Auto.js 3.0.0 文档
-
+ HTTP | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/images.html b/app/src/main/assets/docs/images.html
index 9e009677..7cb1f7c3 100644
--- a/app/src/main/assets/docs/images.html
+++ b/app/src/main/assets/docs/images.html
@@ -2,8 +2,8 @@
- colors | Auto.js 3.0.0 文档
-
+ colors | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -100,19 +100,35 @@
- colors.MAGENTA
- colors.TRANSPARENT
- Images
-- images.requestScreenCapture([landscape])
-- images.captureScreen()
-- images.captureScreen(path)
-- images.pixel(image, x, y)
-- images.copy(img)
-- images.save(image, path[, format = "png", quality = 100])
+- 图片处理
- images.read(path)
- images.load(url)
+- images.copy(img)
+- images.save(image, path[, format = "png", quality = 100])
- images.fromBase64(base64)
- images.toBase64(img[, format = "png", quality = 100])
- images.fromBytes(bytes)
- images.toBytes(img[, format = "png", quality = 100])
- images.clip(img, x, y, w, h)
+- images.resize(img, size[, interpolation])
+- images.scale(img, fx, fy[, interpolation])
+- images.rotate(img, degress[, x, y])
+- images.concat(img1, image2[, direction])
+- images.grayscale(img)
+- image.threshold(img, threshold, maxVal[, type])
+- images.adaptiveThreshold(img, maxValue, adaptiveMethod, thresholdType, blockSize, C)
+- images.cvtColor(img, code[, dstCn])
+- images.inRange(img, lowerBound, upperBound)
+- images.interval(img, color, interval)
+- images.blur(img, size[, anchor, type])
+- images.medianBlur(img, size)
+- images.gaussianBlur(img, size[, sigmaX, sigmaY, type])
+- images.matToImage(mat)
+- 找图找色
+- images.requestScreenCapture([landscape])
+- images.captureScreen()
+- images.captureScreen(path)
+- images.pixel(image, x, y)
- images.findColor(image, color, options)
- images.findColorInRegion(img, color, x, y[, width, height, threshold])
- images.findColorEquals(img, color[, x, y, width, height])
@@ -120,6 +136,21 @@
- images.detectsColor(image, color, x, y[, threshold = 16, algorithm = "diff"])
- images.findImage(img, template[, options])
- images.findImageInRegion(img, template, x, y[, width, height, threshold])
+- images.matchTemplate(img, template, options)
+
+
+- MatchingResult
- Image
@@ -246,7 +277,304 @@ log(colors.equals(0xFF112233, 0xFF223344));
colors.TRANSPARENT#
透明,颜色值 #00000000
Images#
-Stability: 2 - Stableimages模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、找色、找图等。
+Stability: 2 - Stableimages模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。
+该模块分为两个部分,找图找色部分和图片处理部分。
+需要注意的是,image对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管Auto.js通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。
+Image对象通过调用recycle()函数来回收。例如:
+
// 读取图片
+var img = images.read("./1.png");
+//对图片进行操作
+...
+// 回收图片
+img.recycle();
+
例外的是,caputerScreen()返回的图片不需要回收。
+图片处理#
+images.read(path)#
+
+path <string> 图片路径
+
+读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。
+images.load(url)#
+
+url <string> 图片URL地址
+
+加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。
+images.copy(img)#
+
+img <Image> 图片
+- 返回 <Image>
+
+复制一张图片并返回新的副本。该函数会完全复制img对象的数据。
+images.save(image, path[, format = "png", quality = 100])#
+
+把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
+//把图片压缩为原来的一半质量并保存
+var img = images.read("/sdcard/1.png");
+images.save(img, "/sdcard/1.jpg", "jpg", 50);
+app.viewFile("/sdcard/1.jpg");
+
images.fromBase64(base64)#
+
+base64 <string> 图片的Base64数据
+- 返回 <Image>
+
+解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null。
+images.toBase64(img[, format = "png", quality = 100])#
+
+把图片编码为base64数据并返回。
+images.fromBytes(bytes)#
+
+bytes <byte[]> 字节数组
+
+解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null。
+images.toBytes(img[, format = "png", quality = 100])#
+
+把图片编码为字节数组并返回。
+images.clip(img, x, y, w, h)#
+
+从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。
+var src = images.read("/sdcard/1.png");
+var clip = images.clip(src, 100, 100, 400, 400);
+images.save(clip, "/sdcard/clip.png");
+
images.resize(img, size[, interpolation])#
+[v4.1.0新增]
+
+img <Image> 图片
+size <Array> 两个元素的数组[w, h],分别表示宽度和高度;如果只有一个元素,则宽度和高度相等
+interpolation <string> 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有:
+
+NEAREST 最近邻插值
+LINEAR 线性插值(默认)
+AREA 区域插值
+CUBIC 三次样条插值
+LANCZOS4 Lanczos插值
+参见InterpolationFlags
+
+
+返回 <Image>
+
+
+调整图片大小,并返回调整后的图片。例如把图片放缩为200*300:images.resize(img, [200, 300])。
+
+images.scale(img, fx, fy[, interpolation])#
+[v4.1.0新增]
+
+img <Image> 图片
+fx <number> 宽度放缩倍数
+fy <number> 高度放缩倍数
+interpolation <string> 插值方法,可选,默认为"LINEAR"(线性插值),可选的值有:
+
+NEAREST 最近邻插值
+LINEAR 线性插值(默认)
+AREA 区域插值
+CUBIC 三次样条插值
+LANCZOS4 Lanczos插值
+参见InterpolationFlags
+
+
+返回 <Image>
+
+
+放缩图片,并返回放缩后的图片。例如把图片变成原来的一半:images.scale(img, 0.5, 0.5)。
+
+images.rotate(img, degress[, x, y])#
+[v4.1.0新增]
+
+img <Image> 图片
+degress <number> 旋转角度。
+x <number> 旋转中心x坐标,默认为图片中点
+y <number> 旋转中心y坐标,默认为图片中点
+- 返回 <Image>
+
+将图片逆时针旋转degress度,返回旋转后的图片对象。
+例如逆时针旋转90度为images.rotate(img, 90)。
+images.concat(img1, image2[, direction])#
+[v4.1.0新增]
+
+img1 <Image> 图片1
+img2 <Image> 图片2
+- direction <string> 连接方向,默认为"RIGHT",可选的值有:
+LEFT 将图片2接到图片1左边
+RIGHT 将图片2接到图片1右边
+TOP 将图片2接到图片1上边
+BOTTOM 将图片2接到图片1下边
+
+
+- 返回 <Image>
+
+连接两张图片,并返回连接后的图像。如果两张图片大小不一致,小的那张将适当居中。
+images.grayscale(img)#
+[v4.1.0新增]
+
+img <Image> 图片
+- 返回 <Image>
+
+灰度化图片,并返回灰度化后的图片。
+image.threshold(img, threshold, maxVal[, type])#
+[v4.1.0新增]
+
+img <Image> 图片
+threshold <number> 阈值
+maxVal <number> 最大值
+type <string> 阈值化类型,默认为"BINARY",参见ThresholdTypes, 可选的值:
+
+BINARY
+BINARY_INV
+TRUNC
+TOZERO
+TOZERO_INV
+OTSU
+TRIANGLE
+
+
+返回 <Image>
+
+
+将图片阈值化,并返回处理后的图像。可以用这个函数进行图片二值化。例如:images.threshold(img, 100, 255, "BINARY"),这个代码将图片中大于100的值全部变成255,其余变成0,从而达到二值化的效果。如果img是一张灰度化图片,这个代码将会得到一张黑白图片。
+可以参考有关博客(比如threshold函数的使用)或者OpenCV文档threshold。
+images.adaptiveThreshold(img, maxValue, adaptiveMethod, thresholdType, blockSize, C)#
+[v4.1.0新增]
+
+img <Image> 图片
+maxValue <number> 最大值
+adaptiveMethod <string> 在一个邻域内计算阈值所采用的算法,可选的值有:
+MEAN_C 计算出领域的平均值再减去参数C的值
+GAUSSIAN_C 计算出领域的高斯均值再减去参数C的值
+
+
+thresholdType <string> 阈值化类型,可选的值有:
+BINARY
+BINARY_INV
+
+
+blockSize <number> 邻域块大小
+C <number> 偏移值调整量
+- 返回 <Image>
+
+对图片进行自适应阈值化处理,并返回处理后的图像。
+可以参考有关博客(比如threshold与adaptiveThreshold)或者OpenCV文档adaptiveThreshold。
+images.cvtColor(img, code[, dstCn])#
+[v4.1.0新增]
+
+img <Image> 图片
+code <string> 颜色空间转换的类型,可选的值有一共有205个(参见ColorConversionCodes),这里只列出几个:
+BGR2GRAY BGR转换为灰度
+BGR2HSV BGR转换为HSV
+- ``
+
+
+dstCn <number> 目标图像的颜色通道数量,如果不填写则根据其他参数自动决定。
+- 返回 <Image>
+
+对图像进行颜色空间转换,并返回转换后的图像。
+可以参考有关博客(比如颜色空间转换)或者OpenCV文档cvtColor。
+images.inRange(img, lowerBound, upperBound)#
+[v4.1.0新增]
+
+img <Image> 图片
+lowerBound <string> | <number> 颜色下界
+upperBound <string> | <number> 颜色下界
+- 返回 <Image>
+
+将图片二值化,在lowerBound~upperBound范围以外的颜色都变成0,在范围以内的颜色都变成255。
+例如images.inRange(img, "#000000", "#222222")。
+images.interval(img, color, interval)#
+[v4.1.0新增]
+
+将图片二值化,在color-interval ~ color+interval范围以外的颜色都变成0,在范围以内的颜色都变成255。这里对color的加减是对每个通道而言的。
+例如images.interval(img, "#888888", 16),每个通道的颜色值均为0x88,加减16后的范围是[0x78, 0x98],因此这个代码将把#787878~#989898的颜色变成#FFFFFF,而把这个范围以外的变成#000000。
+images.blur(img, size[, anchor, type])#
+[v4.1.0新增]
+
+img <Image> 图片
+size <Array> 定义滤波器的大小,如[3, 3]
+anchor <Array> 指定锚点位置(被平滑点),默认为图像中心
+type <string> 推断边缘像素类型,默认为"DEFAULT",可选的值有:
+CONSTANT iiiiii|abcdefgh|iiiiiii with some specified i
+REPLICATE aaaaaa|abcdefgh|hhhhhhh
+REFLECT fedcba|abcdefgh|hgfedcb
+WRAP cdefgh|abcdefgh|abcdefg
+REFLECT_101 gfedcb|abcdefgh|gfedcba
+TRANSPARENT uvwxyz|abcdefgh|ijklmno
+REFLECT101 same as BORDER_REFLECT_101
+DEFAULT same as BORDER_REFLECT_101
+ISOLATED do not look outside of ROI
+
+
+- 返回 <Image>
+
+对图像进行模糊(平滑处理),返回处理后的图像。
+可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur。
+images.medianBlur(img, size)#
+[v4.1.0新增]
+
+img <Image> 图片
+size <Array> 定义滤波器的大小,如[3, 3]
+- 返回 <Image>
+
+对图像进行中值滤波,返回处理后的图像。
+可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档blur。
+images.gaussianBlur(img, size[, sigmaX, sigmaY, type])#
+[v4.1.0新增]
+
+img <Image> 图片
+size <Array> 定义滤波器的大小,如[3, 3]
+sigmaX <number> x方向的标准方差,不填写则自动计算
+sigmaY <number> y方向的标准方差,不填写则自动计算
+type <string> 推断边缘像素类型,默认为"DEFAULT",参见images.blur
+- 返回 <Image>
+
+对图像进行高斯模糊,返回处理后的图像。
+可以参考有关博客(比如实现图像平滑处理)或者OpenCV文档GaussianBlur。
+images.matToImage(mat)#
+[v4.1.0新增]
+
+mat <Mat> OpenCV的Mat对象
+- 返回 <Image>
+
+把Mat对象转换为Image对象。
+找图找色#
images.requestScreenCapture([landscape])#
landscape <boolean> 布尔值, 表示将要执行的截屏是否为横屏。如果landscape为false, 则表示竖屏截图; true为横屏截图。
@@ -300,90 +628,7 @@ toast(colors.toString(color));
返回图片image在点(x, y)处的像素的ARGB值。
该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。
坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
-images.copy(img)#
-
-img <Image> 图片
-- 返回 <Image>
-
-复制一张图片并返回新的副本。该函数会完全复制img对象的数据。
-images.save(image, path[, format = "png", quality = 100])#
-
-把图片image以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
-//把图片压缩为原来的一半质量并保存
-var img = images.read("/sdcard/1.png");
-images.save(img, "/sdcard/1.jpg", "jpg", 50);
-app.viewFile("/sdcard/1.jpg");
-
images.read(path)#
-
-path <string> 图片路径
-
-读取在路径path的图片文件并返回一个Image对象。如果文件不存在或者文件无法解码则返回null。
-images.load(url)#
-
-url <string> 图片URL地址
-
-加载在地址URL的网络图片并返回一个Image对象。如果地址不存在或者图片无法解码则返回null。
-images.fromBase64(base64)#
-
-base64 <string> 图片的Base64数据
-- 返回 <Image>
-
-解码Base64数据并返回解码后的图片Image对象。如果base64无法解码则返回null。
-images.toBase64(img[, format = "png", quality = 100])#
-
-把图片编码为base64数据并返回。
-images.fromBytes(bytes)#
-
-bytes <byte[]> 字节数组
-
-解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null。
-images.toBytes(img[, format = "png", quality = 100])#
-
-把图片编码为字节数组并返回。
-images.clip(img, x, y, w, h)#
-
-从图片img的位置(x, y)处剪切大小为w * h的区域,并返回该剪切区域的新图片。
-var src = images.read("/sdcard/1.png");
-var clip = images.clip(src, 100, 100, 400, 400);
-images.save(clip, "/sdcard/clip.png");
-
images.findColor(image, color, options)#
+images.findColor(image, color, options)#
image <Image> 图片
color <number> | <string> 要寻找的颜色的RGB值。如果是一个整数,则以0xRRGGBB的形式代表RGB值(A通道会被忽略);如果是字符串,则以"#RRGGBB"代表其RGB值。
@@ -561,7 +806,94 @@ if(p){
threshold: threshold
})
该函数也可以作为全局函数使用。
-Image#
+images.matchTemplate(img, template, options)#
+[v4.1.0新增]
+
+img <Image> 大图片
+template <Image> 小图片(模板)
+options <Object> 找图选项:
+
+- 返回 <MatchingResult>
+
+在大图片中搜索小图片,并返回搜索结果MatchingResult。该函数可以用于找图时找出多个位置,可以通过max参数控制最大的结果数量。也可以对匹配结果进行排序、求最值等操作。
+MatchingResult#
+[v4.1.0新增]
+matches#
+
+- <Array> 匹配结果的数组。
+
+数组的元素是一个Match对象:
+
+point <Point> 匹配位置
+similarity <number> 相似度
+
+例如:
+
var result = images.matchTemplate(img, template, {
+ max: 100
+});
+result.matches.forEach(match => {
+ log("point = " + match.point + ", similarity = " + match.similarity);
+});
+
points#
+
+- <Array> 匹配位置的数组。
+
+first()#
+
+- 返回 <Match>
+
+第一个匹配结果。如果没有任何匹配,则返回null。
+last()#
+
+- 返回 <Match>
+
+最后一个匹配结果。如果没有任何匹配,则返回null。
+leftmost()#
+
+- 返回 <Match>
+
+位于大图片最左边的匹配结果。如果没有任何匹配,则返回null。
+topmost()#
+
+- 返回 <Match>
+
+位于大图片最上边的匹配结果。如果没有任何匹配,则返回null。
+rightmost()#
+
+- 返回 <Match>
+
+位于大图片最右边的匹配结果。如果没有任何匹配,则返回null。
+bottommost()#
+
+- 返回 <Match>
+
+位于大图片最下边的匹配结果。如果没有任何匹配,则返回null。
+best()#
+
+- 返回 <Match>
+
+相似度最高的匹配结果。如果没有任何匹配,则返回null。
+worst()#
+
+- 返回 <Match>
+
+相似度最低的匹配结果。如果没有任何匹配,则返回null。
+sortBy(cmp)#
+
+- cmp <Function>|<string> 比较函数,或者是一个字符串表示排序方向。例如"left"表示将匹配结果按匹配位置从左往右排序、"top"表示将匹配结果按匹配位置从上往下排序,"left-top"表示将匹配结果按匹配位置从左往右、从上往下排序。方向包括
left(左), top (上), right (右), bottom(下)。
+- <MatchingResult>
+
+对匹配结果进行排序,并返回排序后的结果。
+var result = images.matchTemplate(img, template, {
+ max: 100
+});
+log(result.sortBy("top-right"));
+
Image#
表示一张图片,可以是截图的图片,或者本地读取的图片,或者从网络获取的图片。
Image.getWidth()#
返回以像素为单位图片宽度。
@@ -580,6 +912,7 @@ if(p){
返回图片image在点(x, y)处的像素的ARGB值。
该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。
坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
+##
Point#
findColor, findImage返回的对象。表示一个点(坐标)。
Point.x#
diff --git a/app/src/main/assets/docs/index.html b/app/src/main/assets/docs/index.html
index eb58ec90..770dccde 100644
--- a/app/src/main/assets/docs/index.html
+++ b/app/src/main/assets/docs/index.html
@@ -2,8 +2,8 @@
- Index | Auto.js 3.0.0 文档
-
+ Index | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/keys.html b/app/src/main/assets/docs/keys.html
index 5bf46617..521833d9 100644
--- a/app/src/main/assets/docs/keys.html
+++ b/app/src/main/assets/docs/keys.html
@@ -2,8 +2,8 @@
- Keys | Auto.js 3.0.0 文档
-
+ Keys | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/media.html b/app/src/main/assets/docs/media.html
index 68c9a799..ec975664 100644
--- a/app/src/main/assets/docs/media.html
+++ b/app/src/main/assets/docs/media.html
@@ -2,8 +2,8 @@
- Media | Auto.js 3.0.0 文档
-
+ Media | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/modules.html b/app/src/main/assets/docs/modules.html
index 06c95226..823b5edb 100644
--- a/app/src/main/assets/docs/modules.html
+++ b/app/src/main/assets/docs/modules.html
@@ -2,8 +2,8 @@
- module (模块) | Auto.js 3.0.0 文档
-
+ module (模块) | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -83,7 +83,7 @@
module (模块)#
Stability: 2 - StableAuto.js 有一个简单的模块加载系统。 在 Auto.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块)。
例子,假设有一个名为 foo.js 的文件:
-const circle = require('circle.js');
+var circle = require('circle.js');
console.log("半径为 4 的圆的面积是 %d", circle.area(4));
在第一行中,foo.js 加载了同一目录下的 circle.js 模块。
circle.js 文件的内容为:
@@ -91,7 +91,9 @@ console.log("半径为 4 的圆的面积是 %d", circle.area(4));
var circle = {};
-circle.area = (r) => PI * r ** 2;
+circle.area = function (r) {
+ return PI * r * r;
+};
circle.circumference = (r) => 2 * PI * r;
diff --git a/app/src/main/assets/docs/overview.html b/app/src/main/assets/docs/overview.html
index d69dd815..62da9798 100644
--- a/app/src/main/assets/docs/overview.html
+++ b/app/src/main/assets/docs/overview.html
@@ -2,8 +2,8 @@
- 综述 | Auto.js 3.0.0 文档
-
+ 综述 | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/qa.html b/app/src/main/assets/docs/qa.html
index 2aaf28af..bc39a66e 100644
--- a/app/src/main/assets/docs/qa.html
+++ b/app/src/main/assets/docs/qa.html
@@ -2,8 +2,8 @@
- Q & A | Auto.js 3.0.0 文档
-
+ Q & A | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -76,8 +76,9 @@
- Q & A
@@ -89,35 +90,30 @@
Q & A#
如何定时运行脚本#
点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持Auto.js后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。
-如何把图片和脚本一起打包,或者打包多个脚本#
-如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目打包功能。
-
-- 新建一个文件夹,命名为项目名称。
-- 在该文件夹下新建脚本,或者移动脚本到该文件夹,命名为main.js,表示主脚本。脚本打包后将会从该脚本开始运行。
-- 把其他资源或脚本放在该文件夹,并通过相对路径引用。
-- 通过文件夹菜单的"打包"功能来打包该项目
-
+定时任何如何获取外部参数#
+如果一个脚本是用intent"启动"的,比如定时任务中的特定事件(网络状态变化等)触发而启动的,则可以通过engines.myEngine().execArgv.intent获取启动的intent,从而获取外部参数。
+如何把图片和脚本一起打包,或者打包多个脚本#
+如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目功能。
+点击Auto.js的"+"号,选择项目,填写项目名称、包名等信息以后,点击"√"即可新建一个项目。可以在项目中放多个脚本、模块、资源文件,点击项目工具栏的apk打包图标即可打包一个项目,点击工具栏可以重新配置项目。
例如,主脚本要读取同一文件夹下的图片1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录1.png图片;ui中的图片控件要引用同一文件夹的2.png图片则为<img src="file://2.png"/>。Auto.js内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。
-目前Auto.js还不支持项目的图形化管理,后续会加入。
-如何使打包的应用不显示主界面#
-需要使用项目打包功能。
-
-- 新建一个文件夹,命名为项目名称。
-- 在该文件夹下新建脚本,或者移动脚本到该文件夹,命名为main.js,表示主脚本。脚本打包后将会从该脚本开始运行。
-- 在该文件夹下新建一个project.json的文件,其内容如下:
{
-"name": "项目名称",
-"versionName": "1.0.0",
-"versionCode": 1,
-"packageName": "org.autojs.example",
-"main": "main.js",
-"launchConfig": {
- "hideLogs": true
+如何使打包的应用不显示主界面#
+需要使用项目功能。新建项目后,修改项目下的project.json文件,增加以下条目:
+"launchConfig": {
+ "hideLogs": true
}
+
例如:
+{
+ "name": "项目名称",
+ "versionName": "1.0.0",
+ "versionCode": 1,
+ "packageName": "org.autojs.example",
+ "main": "main.js",
+ "launchConfig": {
+ "hideLogs": true
+ }
}
-
其中,项目名称改为自己的项目名称,"org.autojs.example"改成自己的包名,下面的"launchConfig"表示启动配置,"hideLogs"表示隐藏日志。
-- 通过文件夹菜单的"打包"功能来打包该项目
-
-有关项目打包和配置的更多信息,参见项目与项目配置(待补)。
+"launchConfig"表示启动配置,"hideLogs"表示隐藏日志。
+参见项目与项目配置。
Auto.js自带的模块和函数中没有的功能如何实现#
由于Auto.js支持直接调用Android的API,对于Auto.js没有内置的函数,可以直接通过修改Android代码为JavaScript代码实现。例如旋转图片的Android代码为:
import android.graphics.Bitmap;
diff --git a/app/src/main/assets/docs/sensors.html b/app/src/main/assets/docs/sensors.html
index f4c768df..92acf063 100644
--- a/app/src/main/assets/docs/sensors.html
+++ b/app/src/main/assets/docs/sensors.html
@@ -2,8 +2,8 @@
- Sensors | Auto.js 3.0.0 文档
-
+ Sensors | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/shell.html b/app/src/main/assets/docs/shell.html
index 3457d550..92521f32 100644
--- a/app/src/main/assets/docs/shell.html
+++ b/app/src/main/assets/docs/shell.html
@@ -2,8 +2,8 @@
- shell函数 | Auto.js 3.0.0 文档
-
+ shell函数 | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/storages.html b/app/src/main/assets/docs/storages.html
index 382c36d2..e9cb9b39 100644
--- a/app/src/main/assets/docs/storages.html
+++ b/app/src/main/assets/docs/storages.html
@@ -2,8 +2,8 @@
- Storages | Auto.js 3.0.0 文档
-
+ Storages | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/threads.html b/app/src/main/assets/docs/threads.html
index d36ade17..08dc2bfe 100644
--- a/app/src/main/assets/docs/threads.html
+++ b/app/src/main/assets/docs/threads.html
@@ -2,8 +2,8 @@
- Threads | Auto.js 3.0.0 文档
-
+ Threads | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/timers.html b/app/src/main/assets/docs/timers.html
index 264743d5..e7b58674 100644
--- a/app/src/main/assets/docs/timers.html
+++ b/app/src/main/assets/docs/timers.html
@@ -2,8 +2,8 @@
- Timers | Auto.js 3.0.0 文档
-
+ Timers | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/ui.html b/app/src/main/assets/docs/ui.html
index 3e830c80..784a9458 100644
--- a/app/src/main/assets/docs/ui.html
+++ b/app/src/main/assets/docs/ui.html
@@ -2,8 +2,8 @@
- 用户界面: UI | Auto.js 3.0.0 文档
-
+ 用户界面: UI | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -191,11 +191,12 @@
用户界面: UI#
ui模块提供了编写用户界面的支持。
-带有ui的脚本的第一行必须使用"ui"指定ui模式,否则脚本将不会以ui模式运行。正确示范:
+带有ui的脚本的的最前面必须使用"ui";指定ui模式,否则脚本将不会以ui模式运行。正确示范:
"ui";
//脚本的其他代码
-
界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。
+字符串"ui"的前面可以有注释、空行和空格[v4.1.0新增],但是不能有其他代码。
+界面是由视图(View)组成的。View分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。
我们使用xml来编写界面,并通过ui.layout()函数指定界面的布局xml。举个例子:
"ui";
ui.layout(
diff --git a/app/src/main/assets/docs/util.html b/app/src/main/assets/docs/util.html
index 95a7ab29..b759edac 100644
--- a/app/src/main/assets/docs/util.html
+++ b/app/src/main/assets/docs/util.html
@@ -2,8 +2,8 @@
- Util | Auto.js 3.0.0 文档
-
+ Util | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
diff --git a/app/src/main/assets/docs/widgets-based-automation.html b/app/src/main/assets/docs/widgets-based-automation.html
index d0dc5fec..857f7dfd 100644
--- a/app/src/main/assets/docs/widgets-based-automation.html
+++ b/app/src/main/assets/docs/widgets-based-automation.html
@@ -2,8 +2,8 @@
- 基于控件的操作 | Auto.js 3.0.0 文档
-
+ 基于控件的操作 | Auto.js 4.1.0 文档
+
@@ -61,7 +61,7 @@
- Auto.js 3.0.0 文档
+ Auto.js 4.1.0 文档
索引 |
@@ -78,6 +78,13 @@
- auto([mode])
- auto.waitFor()
- auto.setMode(mode)
+- auto.setFlags(flags)
+- auto.serivce
+- auto.windows
+- auto.root
+- auto.rootInActiveWindow
+- auto.setWindowFilter(filter)
+- auto.windowRoots
- SimpleActionAutomator
@@ -92,6 +99,7 @@
- UiSelector
- selector()
+- UiSelector.algorithm(algorithm)
- UiSelector.text(str)
- UiSelector.textContains(str)
- UiSelector.textStartsWith(prefix)
@@ -222,6 +230,7 @@
auto();
auto.waitFor()#
检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。
+因为该函数是阻塞的,因此除非是有协程特性,否则不能在ui模式下运行该函数,建议在ui模式下使用auto()函数。
auto.setMode(mode)#
mode <string> 模式
@@ -231,6 +240,72 @@
fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
normal 正常模式,默认。
+auto.setFlags(flags)#
+[v4.1.0新增]
+
+flags <string> | <Array> 一些标志,来启用和禁用某些特性,包括:
+findOnUiThread 使用该特性后,选择器搜索时会在主进程进行。该特性用于解决线程安全问题导致的次生问题,不过目前貌似已知问题并不是线程安全问题。
+useUsageStats 使用该特性后,将会以"使用情况统计"服务的结果来检测当前正在运行的应用包名(需要授予"查看使用情况统计"权限)。如果觉得currentPackage()返回的结果不太准确,可以尝试该特性。
+useShell 使用该特性后,将使用shell命令获取当前正在运行的应用的包名、活动名称,但是需要root权限。
+
+
+
+启用有关automator的一些特性。例如:
+auto.setFlags(["findOnUiThread", "useShell"]);
+
auto.serivce#
+[v4.1.0新增]
+
+获取无障碍服务。如果无障碍服务没有启动,则返回null。
+
+auto.windows#
+[v4.1.0新增]
+
+- <Array>
+
+当前所有窗口(AccessibilityWindowInfo)的数组,可能包括状态栏、输入法、当前应用窗口,弹出窗口、悬浮窗、分屏应用窗口等。可以分别获取每个窗口的布局信息。
+该函数需要Android 5.0以上才能运行。
+auto.root#
+[v4.1.0新增]
+
+- <UiObject>
+
+当前窗口的布局根元素。如果无障碍服务未启动或者WindowFilter均返回false,则会返回null。
+如果不设置windowFilter,则当前窗口即为活跃的窗口(获取到焦点、正在触摸的窗口);如果设置了windowFilter,则获取的是过滤的窗口中的第一个窗口。
+如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素。
+auto.rootInActiveWindow#
+[v4.1.0新增]
+
+- <UiObject>
+
+当前活跃的窗口(获取到焦点、正在触摸的窗口)的布局根元素。如果无障碍服务未启动则为null。
+auto.setWindowFilter(filter)#
+[v4.1.0新增]
+
+filter <Function> 参数为窗口(AccessibilityWindowInfo),返回值为Boolean的函数。
+
+设置窗口过滤器。这个过滤器可以决定哪些窗口是目标窗口,并影响选择器的搜索。例如,如果想要选择器在所有窗口(包括状态栏、输入法等)中搜索,只需要使用以下代码:
+auto.setWindowFilter(function(window){
+ //不管是如何窗口,都返回true,表示在该窗口中搜索
+ return true;
+});
+
又例如,当前使用了分屏功能,屏幕上有Auto.js和QQ两个应用,但我们只想选择器对QQ界面进行搜索,则:
+auto.setWindowFilter(function(window){
+ // 对于应用窗口,他的title属性就是应用的名称,因此可以通过title属性来判断一个应用
+ return window.title == "QQ";
+});
+
选择器默认是在当前活跃的窗口中搜索,不会搜索诸如悬浮窗、状态栏之类的,使用WindowFilter则可以控制搜索的窗口。
+需要注意的是, 如果WindowFilter返回的结果均为false,则选择器的搜索结果将为空。
+另外setWindowFilter函数也会影响auto.windowRoots的结果。
+该函数需要Android 5.0以上才有效。
+auto.windowRoots#
+[v4.1.0新增]
+
+- <Array>
+
+返回当前被WindowFilter过滤的窗口的布局根元素组成的数组。
+如果系统是Android5.0以下,则始终返回当前活跃的窗口的布局根元素的数组。
SimpleActionAutomator#
Stability: 2 - StableSimpleActionAutomator提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。
click(text[, i])#
@@ -363,6 +438,18 @@ sendButton.click();
创建一个新的选择器。但一般情况不需要使用该函数,因为可以直接用相应条件的语句创建选择器。
由于历史遗留原因,本不应该这样设计(不应该让id(), text()等作为全局函数,而是应该用By.id(), By.text()),但为了后向兼容性只能保留这个设计。
这样的API设计会污染全局变量,后续可能会支持"去掉这些全局函数而使用By.*"的选项。
+UiSelector.algorithm(algorithm)#
+[v4.1.0新增]
+
+algorithm <string> 搜索算法,可选的值有:
+DFS 深度优先算法,选择器的默认算法
+BFS 广度优先算法
+
+
+
+指定选择器的搜索算法。例如:
+log(selector().text("文本").algorithm("BFS").find());
+
广度优先在控件所在层次较低时,或者布局的层次不多时,通常能更快找到控件。
UiSelector.text(str)#
str <string> 控件文本