个人简介
👨🏻💻个人主页:九黎aj
🏃🏻♂️幸福源自奋斗,平凡造就不凡
🌟如果文章对你有用,麻烦关注点赞收藏走一波,感谢支持!
🌱欢迎订阅我的专栏:autojs
🌟 QQ群:698307198
前言
大概内容:网上文档不方便搜索,直接用python写了个一键读取全部文本内容的
—————————————————
`以下是本篇文章正文内容,
一、实现代码
import os
from bs4 import BeautifulSoup
# 指定目录
directory = r'D:\autojsdoc'
# 打开output.txt文件,准备写入内容
with open('output.txt', 'w', encoding='utf-8') as output_file:
# 遍历目录下的文件
for root, dirs, files in os.walk(directory):
for filename in files:
if filename.endswith('.html'):
file_path = os.path.join(root, filename)
try:
with open(file_path, 'r', encoding='utf-8') as file:
# 使用BeautifulSoup解析HTML文件
soup = BeautifulSoup(file, 'html.parser')
# 提取文字内容并写入output.txt文件
text = soup.get_text()
output_file.write(text)
except UnicodeDecodeError:
print(f"编码错误{file_path}. 跳过.")
二、使用步骤
app - 应用 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: https://pro.autojs.org/docs/zh/v8/app.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档app - 应用app.versionCode
app.versionName
app.autojs.versionCode
app.autojs.versionName
app.launchApp(appName)
app.launch(packageName)
app.launchPackage(packageName)
app.getPackageName(appName)
app.getAppName(packageName)
app.openAppSetting(packageName)
app.viewFile(path)
app.editFile(path)
app.uninstall(packageName)
app.openUrl(url)
app.sendEmail(options)
app.startActivity(name)
app.intent(options)
app.startActivity(options)
app.sendBroadcast(options)
app.startService(options)
app.sendBroadcast(name)
app.intentToShell(options)
app.parseUri(uri)
app.getUriForFile(path)
app.getInstalledApps([options])
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
media - 多媒体
module - 模块
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器
work_manager - 定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
app - 应用2022年10月22日
此页内容
app.versionCodeapp.versionNameapp.autojs.versionCodeapp.autojs.versionNameapp.launchApp(appName)app.launch(packageName)app.launchPackage(packageName)app.getPackageName(appName)app.getAppName(packageName)app.openAppSetting(packageName)app.viewFile(path)app.editFile(path)app.uninstall(packageName)app.openUrl(url)app.sendEmail(options)app.startActivity(name)app.intent(options)app.startActivity(options)app.sendBroadcast(options)app.startService(options)app.sendBroadcast(name)app.intentToShell(options)app.parseUri(uri)app.getUriForFile(path)app.getInstalledApps([options])
# app - 应用
app模块提供一系列函数,用于使用其他应用、与其他应用交互。例如发送意图、打开文件、发送邮件等。
同时提供了方便的进阶函数startActivity和sendBroadcast,用他们可完成app模块没有内置的和其他应用的交互。
# app.versionCode{number}当前软件版本号,整数值。例如160, 256等。
如果在Auto.js中运行则为Auto.js的版本号;在打包的软件中则为打包软件的版本号。toastLog(app.versionCode);# app.versionName{string}当前软件的版本名称,例如"3.0.0 Beta"。
如果在Auto.js中运行则为Auto.js的版本名称;在打包的软件中则为打包软件的版本名称。toastLog(app.versionName);# app.autojs.versionCode{number}Auto.js版本号,整数值。例如160, 256等。
# app.autojs.versionName{string}Auto.js版本名称,例如"3.0.0 Beta"。
# app.launchApp(appName)appName {string} 应用名称通过应用名称启动应用。如果该名称对应的应用不存在,则返回false; 否则返回true。如果该名称对应多个应用,则只启动其中某一个。
该函数也可以作为全局函数使用。launchApp("Auto.js");# app.launch(packageName)packageName {string} 应用包名通过应用包名启动应用。如果该包名对应的应用不存在,则返回false;否则返回true。
该函数也可以作为全局函数使用。//启动微信
launch("com.tencent.mm");
# app.launchPackage(packageName)packageName {string} 应用包名
相当于app.launch(packageName)。
# app.getPackageName(appName)appName {string} 应用名称获取应用名称对应的已安装的应用的包名。如果该找不到该应用,返回null;如果该名称对应多个应用,则只返回其中某一个的包名。
该函数也可以作为全局函数使用。var name = getPackageName("QQ"); //返回"com.tencent.mobileqq"# app.getAppName(packageName)packageName {string} 应用包名获取应用包名对应的已安装的应用的名称。如果该找不到该应用,返回null。
该函数也可以作为全局函数使用。var name = getAppName("com.tencent.mobileqq"); //返回"QQ"# app.openAppSetting(packageName)packageName {string} 应用包名打开应用的详情页(设置页)。如果找不到该应用,返回false; 否则返回true。
该函数也可以作为全局函数使用。
# app.viewFile(path)path {string} 文件路径用其他应用查看文件。文件不存在的情况由查看文件的应用处理。
如果找不出可以查看该文件的应用,则抛出ActivityNotException。//查看文本文件
app.viewFile("/sdcard/1.txt");
# app.editFile(path)path {string} 文件路径用其他应用编辑文件。文件不存在的情况由编辑文件的应用处理。
如果找不出可以编辑该文件的应用,则抛出ActivityNotException。//编辑文本文件
app.editFile("/sdcard/1.txt/);
# app.uninstall(packageName)packageName {string} 应用包名卸载应用。执行后会会弹出卸载应用的提示框。如果该包名的应用未安装,由应用卸载程序处理,可能弹出"未找到应用"的提示。//卸载QQ
app.uninstall("com.tencent.mobileqq");
# app.openUrl(url)url {string}
网站的Url,如果不以"http://"或"https://"开头则默认是"http://"。用浏览器打开网站url。
如果没有安装浏览器应用,则抛出ActivityNotException。
# app.sendEmail(options)options {Object} 发送邮件的参数。包括:
email {string} | {Array} 收件人的邮件地址。如果有多个收件人,则用字符串数组表示
cc {string} | {Array} 抄送收件人的邮件地址。如果有多个抄送收件人,则用字符串数组表示
bcc {string} | {Array} 密送收件人的邮件地址。如果有多个密送收件人,则用字符串数组表示
subject {string} 邮件主题(标题)
text {string} 邮件正文
attachment {string} 附件的路径。根据选项options调用邮箱应用发送邮件。这些选项均是可选的。
如果没有安装邮箱应用,则抛出ActivityNotException。//发送邮件给10086@qq.com和10001@qq.com。
app.sendEmail({
email: ["10086@qq.com", "10001@qq.com"],
subject: "这是一个邮件标题",
text: "这是邮件正文"
});
# app.startActivity(name)name {string} 活动名称,可选的值为:
console 日志界面
settings 设置界面启动Auto.js的特定界面。该函数在Auto.js内运行则会打开Auto.js内的界面,在打包应用中运行则会打开打包应用的相应界面。app.startActivity("console");# app.intent(options)options {Object} 选项,包括: action {string}
意图的Action,指意图要完成的动作,是一个字符串常量,比如"android.intent.action.SEND"。当action以"android.intent.action"开头时,可以省略前缀,直接用"SEND"代替。参见Actions
open in new window。
type {string}
意图的MimeType,表示和该意图直接相关的数据的类型,表示比如"text/plain"为纯文本类型。
data {string} 意图的Data,表示和该意图直接相关的数据,是一个Uri,
可以是文件路径或者Url等。例如要打开一个文件, action为"android.intent.action.VIEW",
data为"file:///sdcard/1.txt"。
category {Array} 意图的类别。比较少用。参见Categories
open in new window。
packageName {string} 目标包名
className {string} 目标Activity或Service等组件的名称
extras {Object}
以键值对构成的这个Intent的Extras(额外信息)。提供该意图的其他信息,例如发送邮件时的邮件标题、邮件正文。参见Extras
open in new window。
flags {Array}
intent的标识,字符串数组,例如["activity_new_task", "grant_read_uri_permission"]。参见Flags
open in new window。
[v4.1.0新增]
root {Boolean}
是否以root权限启动、发送该intent。使用该参数后,不能使用context.startActivity()等方法,而应该直接使用诸如app.startActivity({...})的方法。
[v4.1.0新增]
根据选项,构造一个意图Intent对象。
例如://打开应用来查看图片文件
var i = app.intent({
action: "VIEW",
type: "image/png",
data: "file:///sdcard/1.png"
});
context.startActivity(i);Intent(意图) 是一个消息传递对象,您可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:
启动活动(Activity): Activity
表示应用中的一个"屏幕"。例如应用主入口都是一个Activity,应用的功能通常也以Activity的形式独立,例如微信的主界面、朋友圈、聊天窗口都是不同的Activity。通过将
Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了任何必要的数据。
启动服务(Service): Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给
startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。
传递广播: 广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给
sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用。 需要注意的是,除非应用专门暴露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
open in new window或参考Android指南: Intent
open in new window。
# app.startActivity(options)options {Object} 选项根据选项构造一个Intent,并启动该Activity。app.startActivity({
action: "SEND",
type: "text/plain",
data: "file:///sdcard/1.txt"
});# app.sendBroadcast(options)options {Object} 选项根据选项构造一个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参数的规范
open in new window。
# app.parseUri(uri)
[v4.1.0新增]uri {string}
一个代表Uri的字符串,例如"file:///sdcard/1.txt", "https://www.autojs.org"
返回 {Uri} 一个代表Uri的对象,参见android.net.Uri
open in new window。解析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
open in new window。
从一个文件路径创建一个uri对象。需要注意的是,在高版本Android上,由于系统限制直接在Uri暴露文件的绝对路径,因此返回的Uri会是诸如content://...的形式。
# app.getInstalledApps([options])
** [Pro 8.0.0新增
open in new window] **options {Object} 选项,包括:
get: 指定返回的应用信息中包含的信息
"activities" 应用的Activity组件信息
"configurations" 应用的硬件配置
"gids" 应用的group id
"instrumentation" 应用的Instrumentation信息
"intent_filters" 应用的意图过滤
"meta_data" 应用的元信息(默认)
"permissions" 应用的权限信息
"providers" 应用的ContentProvider组件信息
"receivers" 应用的BroadcastReceiver组件信息
"services" 应用的Service组件信息
"shared_library_files" 应用的动态链接库文件信息
"signatures" 应用的签名信息(已弃用
"signing_certificates" 应用的签名信息
"uri_permission_patterns"
"disabled_components" 被卸载的但保留了数据的应用
"disabled_until_used_components"
禁用直到被使用的组件
"uninstalled_packages" 被卸载的但保留了数据的应用
match: 指定要匹配的应用列表
"uninstalled_packages" 被卸载的但保留了数据的应用
"disabled_components" 被禁用的组件
"disabled_until_used_components"
禁用直到被使用的组件
"system_only" 只匹配系统应用
"factory_only" 只匹配预装应用
"apex" APEX应用
返回 {Array<ApplicationInfo>}返回为当前用户安装的所有应用程序包的列表。如果设置了match选项
uninstalled_packages,则包括被删除但保留了数据的应用程序。 获取安装的应用列表。
返回值是ApplicationInfo对象的数组。 如果没有安装任何应用,则返回一个空数组。
选项options的match选项用于指定要返回哪些应用程序,get选项用于指定返回的应用程序携带哪些信息。// 获取系统app
let apps = $app.getInstalledApps({
get: ['meta_data'],
match: ['system_only']
});
console.log(apps);
上次编辑于:
贡献者: hyb1996
下一页
base64ocr - 文字识别 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: ocr.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js
Pro
指南
第一代API文档第二代API文档
官网与相关链接官网与软件下载
open in new
window官方博客
open in new
window官方频道
open in new
windowEnglish
简体中文指南阅读须知API文档
自动化 - 控件操作
自动化 - 坐标操作setScreenMetrics(width,
height)
安卓7.0以上的触摸和手势模拟click(x, y)
longClick(x, y)
press(x, y,
duration)
swipe(x1,
y1, x2, y2, duration)
gesture(duration,
[x1, y1], [x2, y2], ...)
gestures([delay1,
duration1, [x1, y1], [x2, y2], ...], [delay2, duration2, [x3,
y3], [x4, y4], ...], ...)
使用root权限点击和滑动的简单命令Tap(x, y)
Swipe(x1,
y1, x2, y2, [duration])
RootAutomatornew
RootAutomator([options])
RootAutomator.tap(x,
y[, id])
RootAutomator.swipe(x1,
x2, y1, y2[, duration, id])
RootAutomator.press(x,
y, duration[, id])
RootAutomator.longPress(x,
y[, id])
RootAutomator.touchDown(x,
y[, id])
RootAutomator.touchMove(x,
y[, id])
RootAutomator.touchUp([id])
RootAutomator2new
RootAutomator2([options])
RootAutomator2.tap(x,
y)
RootAutomator2.longPress(x,
y)
RootAutomator2.press(x,
y, duration)
RootAutomator2.swipe(x1,
y1, x2, y2, duration)
RootAutomator2.touchDown(x,
y, [id])
RootAutomator2.touchDown(pointers)
RootAutomator2.touchMove(x,
y, [id])
RootAutomator2.touchMove(pointers)
RootAutomator2.touchUp([id])
RootAutomator2.touchUp(pointers)
RootAutomator2.flush()
RootAutomator2.exit([forced])
app -
应用
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
images - 图片处理
keys
- 按键模拟
media
- 多媒体
module - 模块
ocr -
文字识别
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器
work_manager - 定时与任务ui -
用户界面util -
工具
WebSocket
zip -
压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
自动化 - 坐标操作自动化 - 坐标操作2022年10月22日
此页内容
setScreenMetrics(width,
height)
安卓7.0以上的触摸和手势模拟
click(x,
y)
longClick(x,
y)
press(x,
y, duration)
swipe(x1,
y1, x2, y2, duration)
gesture(duration,
[x1, y1], [x2, y2], ...)
gestures([delay1,
duration1, [x1, y1], [x2, y2], ...], [delay2, duration2, [x3, y3], [x4, y4],
...], ...)使用root权限点击和滑动的简单命令
Tap(x,
y)
Swipe(x1,
y1, x2, y2, [duration])RootAutomator
new
RootAutomator([options])
RootAutomator.tap(x,
y[, id])
RootAutomator.swipe(x1,
x2, y1, y2[, duration, id])
RootAutomator.press(x,
y, duration[, id])
RootAutomator.longPress(x,
y[, id])
RootAutomator.touchDown(x,
y[, id])
RootAutomator.touchMove(x,
y[, id])
RootAutomator.touchUp([id])
RootAutomator2
new
RootAutomator2([options])
RootAutomator2.tap(x,
y)
RootAutomator2.longPress(x,
y)
RootAutomator2.press(x,
y, duration)
RootAutomator2.swipe(x1,
y1, x2, y2, duration)
RootAutomator2.touchDown(x,
y, [id])
RootAutomator2.touchDown(pointers)RootAutomator2.touchMove(x,
y, [id])
RootAutomator2.touchMove(pointers)RootAutomator2.touchUp([id])RootAutomator2.touchUp(pointers)RootAutomator2.flush()RootAutomator2.exit([forced])# 自动化 - 坐标操作Stability: 2 - Stable本章节介绍了一些使用坐标进行点击、滑动的函数。这些函数有的需要安卓7.0以上,有的需要root权限。
要获取要点击的位置的坐标,可以在开发者选项中开启"指针位置"。
基于坐标的脚本通常会有分辨率的问题,这时可以通过setScreenMetrics()函数来进行自动坐标放缩。这个函数会影响本章节的所有点击、长按、滑动等函数。通过设定脚本设计时的分辨率,使得脚本在其他分辨率下自动放缩坐标。
控件和坐标也可以相互结合。一些控件是无法点击的(clickable为false),
无法通过.click()函数来点击,这时如果安卓版本在7.0以上或者有root权限,就可以通过以下方式来点击:
//获取这个控件
var widget = id("xxx").findOne();
//获取其中心位置并点击
click(widget.bounds().centerX(), widget.bounds().centerY());
//如果用root权限则用Tap# setScreenMetrics(width, height)width {number} 屏幕宽度,单位像素
height {number} 屏幕高度,单位像素设置脚本坐标点击所适合的屏幕宽高。如果脚本运行时,屏幕宽度不一致会自动放缩坐标。
例如在1920*1080的设备中,某个操作的代码为setScreenMetrics(1080, 1920);
click(800, 200);
longClick(300, 500);那么在其他设备上AutoJs会自动放缩坐标以便脚本仍然有效。例如在540 *
960的屏幕中click(800, 200)实际上会点击位置(400,
100)。
# 安卓7.0以上的触摸和手势模拟Stability: 2 - Stable注意以下命令只有Android7.0及以上才有效
# click(x, y)x {number} 要点击的坐标的x值
y {number} 要点击的坐标的y值模拟点击坐标(x, y),并返回是否点击成功。只有在点击执行完成后脚本才继续执行。
一般而言,只有点击过程(大约150毫秒)中被其他事件中断(例如用户自行点击)才会点击失败。
使用该函数模拟连续点击时可能有点击速度过慢的问题,这时可以用press()函数代替。
# longClick(x,
y)x {number} 要长按的坐标的x值
y {number} 要长按的坐标的y值模拟长按坐标(x, y), 并返回是否成功。只有在长按执行完成(大约600毫秒)时脚本才会继续执行。
一般而言,只有长按过程中被其他事件中断(例如用户自行点击)才会长按失败。
#
press(x, y, duration)x {number} 要按住的坐标的x值
y {number} 要按住的坐标的y值
duration {number} 按住时长,单位毫秒模拟按住坐标(x, y), 并返回是否成功。只有按住操作执行完成时脚本才会继续执行。
如果按住时间过短,那么会被系统认为是点击;如果时长超过500毫秒,则认为是长按。
一般而言,只有按住过程中被其他事件中断才会操作失败。
一个连点器的例子如下://循环100次
for(var i = 0; i < 100; i++){
//点击位置(500, 1000), 每次用时1毫秒
press(500, 1000, 1);
}#
swipe(x1, y1, x2, y2, duration)x1 {number} 滑动的起始坐标的x值
y1 {number} 滑动的起始坐标的y值
x2 {number} 滑动的结束坐标的x值
y2 {number} 滑动的结束坐标的y值
duration {number} 滑动时长,单位毫秒模拟从坐标(x1, y1)滑动到坐标(x2, y2),并返回是否成功。只有滑动操作执行完成时脚本才会继续执行。
一般而言,只有滑动过程中被其他事件中断才会滑动失败。
# gesture(duration, [x1, y1], [x2, y2], ...)duration {number} 手势的时长
[x, y]
{...} 手势滑动路径的一系列坐标模拟手势操作。例如gesture(1000, [0, 0], [500, 500], [500, 1000])为模拟一个从(0,
0)到(500, 500)到(500, 100)的手势操作,时长为2秒。
# gestures([delay1, duration1, [x1, y1], [x2, y2], ...], [delay2,
duration2, [x3, y3], [x4, y4], ...], ...)
同时模拟多个手势。每个手势的参数为[delay, duration, 坐标],
delay为延迟多久(毫秒)才执行该手势;duration为手势执行时长;坐标为手势经过的点的坐标。其中delay参数可以省略,默认为0。
例如手指捏合:gestures([0, 500, [800, 300], [500, 1000]],
[0, 500, [300, 1500], [500, 1000]]);
# 使用root权限点击和滑动的简单命令Stability: 1 - Experimental注意:本章节的函数在后续版本很可能有改动!请勿过分依赖本章节函数的副作用。推荐使用RootAutomator代替本章节的触摸函数。
以下函数均需要root权限,可以实现任意位置的点击、滑动等。这些函数通常首字母大写以表示其特殊的权限。
这些函数均不返回任何值。
并且,这些函数的执行是异步的、非阻塞的,在不同机型上所用的时间不同。脚本不会等待动作执行完成才继续执行。因此最好在每个函数之后加上适当的sleep来达到期望的效果。例如:Tap(100, 100);
sleep(500);
注意,动作的执行可能无法被停止,例如:for(var i = 0; i < 100; i++){
Tap(100, 100);
}这段代码执行后可能会出现在任务管理中停止脚本后点击仍然继续的情况。 因此,强烈建议在每个动作后加上延时:for(var i = 0; i < 100; i++){
Tap(100, 100);
sleep(500);
}
# Tap(x, y)x {number} 要点击的x坐标
y {number} 要点击的y坐标点击位置(x, y), 您可以通过"开发者选项"开启指针位置来确定点击坐标。
# Swipe(x1, y1, x2, y2, [duration])x1 {number} 滑动起点的x坐标
y1 {number} 滑动起点的y坐标
x2 {number} 滑动终点的x坐标
y2 {number} 滑动终点的y坐标
duration {number} 滑动动作所用的时间滑动。从(x1, y1)位置滑动到(x2, y2)位置。
#
RootAutomatorStability: 2 - StableRootAutomator是一个使用root权限来模拟触摸的对象,用它可以完成触摸与多点触摸,并且这些动作的执行没有延迟。
一个脚本中最好只存在一个RootAutomator,并且保证脚本结束退出他。可以在exit事件中退出RootAutomator,例如:var ra = new RootAutomator();
events.on('exit', function(){
ra.exit();
});
//执行一些点击操作
...注意
RootAutomator需要root权限或adb权限才能执行,要使用adb权限可以用shell.setDefaultOptions({adb: true})默认使用adb权限,需要shizuku授权。
另外RootAutomoat兼容性不佳,从9.3版本开始,推荐使用RootAutomator2代替。
#
new RootAutomator([options])options {object} 可选参数,包括:
adb {boolean}
是否使用adb权限,默认为false。若为true时,需要用shizuku授权才能使用。
inputDevice {string}
指定RootAutomator操作的设备,比如/dev/input/event4。不指定则自动检测。
构造一个RootAutomator。
#
RootAutomator.tap(x, y[, id])x {number} 横坐标
y {number} 纵坐标
id {number}
多点触摸id,可选,默认为1,可以通过setDefaultId指定。点击位置(x, y)。其中id是一个整数值,用于区分多点触摸,不同的id表示不同的"手指",例如:var ra = new RootAutomator();
//让"手指1"点击位置(100, 100)
ra.tap(100, 100, 1);
//让"手指2"点击位置(200, 200);
ra.tap(200, 200, 2);
ra.exit();
如果不需要多点触摸,则不需要id这个参数。 多点触摸通常用于手势或游戏操作,例如模拟双指捏合、双指上滑等。
某些情况下可能存在tap点击无反应的情况,这时可以用RootAutomator.press()函数代替。
# RootAutomator.swipe(x1, x2, y1, y2[, duration, id])x1 {number} 滑动起点横坐标
y1 {number} 滑动起点纵坐标
x2 {number} 滑动终点横坐标
y2 {number} 滑动终点纵坐标
duration {number} 滑动时长,单位毫秒,默认值为300
id {number} 多点触摸id,可选,默认为1模拟一次从(x1, y1)到(x2, y2)的时间为duration毫秒的滑动。
# RootAutomator.press(x, y, duration[, id])x {number} 横坐标
y {number} 纵坐标
duration {number} 按下时长
id {number} 多点触摸id,可选,默认为1模拟按下位置(x, y),时长为duration毫秒。
# RootAutomator.longPress(x, y[, id])x {number} 横坐标
y {number} 纵坐标
duration {number} 按下时长
id {number} 多点触摸id,可选,默认为1模拟长按位置(x, y)。
以上为简单模拟触摸操作的函数。如果要模拟一些复杂的手势,需要更底层的函数。
# RootAutomator.touchDown(x, y[, id])x {number} 横坐标
y {number} 纵坐标
id {number} 多点触摸id,可选,默认为1模拟手指按下位置(x, y)。
# RootAutomator.touchMove(x, y[, id])x {number} 横坐标
y {number} 纵坐标
id {number} 多点触摸id,可选,默认为1模拟移动手指到位置(x, y)。
#
RootAutomator.touchUp([id])id {number} 多点触摸id,可选,默认为1模拟手指弹起。
#
RootAutomator2
RootAutomator2用于基于root或者adb权限,模拟点击、手势、长按等操作。相比起基于无障碍的操作,RootAutomator支持多点触控和动态改变手势;相比RootAutomator,RootAutomator2的兼容性更佳。
let screenWidth = $device.width;
let screenHeight = $device.height;// 使用root权限执行。也可以指定为{adb: true}使用adb权限,需要shizuku授权
const ra = new RootAutomator2({ root: true });// 点击(200, 200)的位置
ra.tap(200, 200);
sleep(1000);// 按住屏幕中点持续500毫秒
ra.press(screenWidth / 2, screenHeight / 2, 500);
sleep(1000);// 从(500, 200)滑动到(500, 1000),滑动时长300毫秒
ra.swipe(500, 200, 500, 1000, 300);
sleep(1000);
// 双指捏合
// 左上角位置
let p0 = {
x: screenWidth / 6,
y: screenHeight / 6,
};
// 右下角位置
let p1 = {
x: screenWidth - p0.x,
y: screenHeight - p0.y,
}
// 同时按下左上角和右下角,手指id为0和1
ra.touchDown([
{ x: p0.x, y: p0.y, id: 0 },
{ x: p1.x, y: p1.y, id: 1 },
]);// 移动步数
const steps = 20;
// 计算每一步移动的偏移量
const stepX = Math.round((p1.x - p0.x) / steps) / 2;
const stepY = Math.round((p1.y - p0.y) / steps) / 2;
for (let i = 0; i < steps; i++) {
// 手指0向右下移动,手指1向左上移动
ra.touchMove([
{ x: p0.x + stepX * i, y: p0.y + stepY * i, id: 0 },
{ x: p1.x - stepX * i, y: p1.y - stepY * i, id: 1 }
]);
}
// 弹起所有手指
ra.touchUp();
// 等待前面的操作全部完成
ra.flush();// 退出RootAutomator,如果没有正确退出,可能导致"手指"残留在屏幕上
ra.exit();#
new
RootAutomator2([options])options 创建RootAutomator2的选项,可选。
adb {boolean} 是否使用adb权限,默认为`false
root {boolean}
是否使用root权限,当不指定adb权限时,默认为true根据选项创建一个新的RootAutomator2实例。RootAutomator2相比RootAutomator有更好的兼容性。
可以指定是否使用root权限、adb权限等,参见ShellOptions。如果不指定root或adb权限,则默认使用root权限。
#
RootAutomator2.tap(x,
y)
点击位置(x,
y),时长为5毫秒。此函数会等待操作同步完成,可能函数执行时间大于实际操作时间,若对执行时间有要求,可以用touchDown,
touchUp等异步方法代替。
# 参数名称
类型
x
numbery
number
#
RootAutomator2.longPress(x,
y)
长按(x, y)位置。长按的时长为ViewConfiguration.getLongPressTimeout()
open in new
window+100毫秒。此函数会等待操作同步完成,可能函数执行时间大于实际操作时间,若对执行时间有要求,可以用touchDown,
touchUp等异步方法代替。
# 参数
名称
类型
x
numbery
number
#
RootAutomator2.press(x,
y,
duration)
按下(x,
y)位置持续duration时长,然后抬起手指。此函数会等待操作同步完成,可能函数执行时间大于实际操作时间,若对执行时间有要求,可以用touchDown,
touchUp等异步方法代替。
# 参数
名称
类型
描述
x
number-
y
number-
durationnumber按下时长,单位毫秒#
RootAutomator2.swipe(x1,
y1,
x2,
y2,
duration)
在给定的duration时长从(x1, y1)位置滑动到(x2,
y2)位置。此函数会等待操作同步完成,可能函数执行时间大于实际操作时间,若对执行时间有要求,可以用touchDown,
touchUp等异步方法代替。
# 参数
名称
类型
描述
x1
number-
y1
number-
x2
number-
y2
number-
durationnumber滑动时长,单位毫秒#
RootAutomator2.touchDown(x,
y,
[id])
按下(x,
y)位置。若对应id的手指之前已经是按下状态,则会模拟手指移动(touchMove)事件。此操作是异步进行的,若要等待操作完成,可以使用flush方法。
# 参数
名称
类型
描述
x
number-
y
number-
id
number手指ID,默认为0#
RootAutomator2.touchDown(pointers)
模拟一个手指按下事件,使用数组描述触摸的位置和相应的手指id。例如ra.touchDown([{x: 100, y: 100, id: 0}, {x: 200, y: 200, id: 1}])会使用手指0按下位置(100,
100),使用手指1按下位置(200,
200)。此操作是异步进行的,若要等待操作完成,可以使用flush方法。
# 参数
名称
类型
描述
pointersArray 描述每个手指位置的数组,数组的每个元素带有x,
y和id三个字段
#
RootAutomator2.touchMove(x,
y,
[id])
将手指移动到(x,
y)位置。若对应id的手指之前并非按下状态,则会模拟手指按下(touchDown)事件。此操作是异步进行的,若要等待操作完成,可以使用flush方法。
# 参数
名称
类型
描述
x
number-
y
number-
id
number手指ID,默认为0#
RootAutomator2.touchMove(pointers)
模拟一个手指移动事件,使用数组描述触摸的位置和相应的手指id。例如ra.touchMove([{x: 100, y: 100, id: 0}, {x: 200, y: 200, id: 1}])会将手指0移动到位置(100,
100),将手指1移动到位置(200,
200)。此操作是异步进行的,若要等待操作完成,可以使用flush方法。
# 参数
名称
类型
描述
pointersArray 描述每个手指位置的数组,数组的每个元素带有x,
y和id三个字段
#
RootAutomator2.touchUp([id])
抬起手指。
# 参数
名称
类型
描述
id
number手指ID,若不指定则抬起所有手指#
RootAutomator2.touchUp(pointers)
模拟一个手指抬起事件,使用数组描述触摸的位置和相应的手指id。例如ra.touchUp([{x: 100, y: 100, id: 0}, {x: 200, y: 200, id: 1}])会使用手指0和手指1抬起,其中的坐标位置为手指抬起时的位置。此操作是异步进行的,若要等待操作完成,可以使用flush方法。
# 参数
名称
类型
描述
pointersArray 描述每个手指位置的数组,数组的每个元素带有x,
y和id三个字段
#
RootAutomator2.flush()
等待所有操作完成。例如我们使用tocuhDown,
touchMove,
touchUp完成了一系列手势,需要等待这些手势完成后继续下一步时,使用ra.flush()来等待这些操作完成。
#
RootAutomator2.exit([forced])
退出RootAutomator2。
# 参数
名称
类型
描述
forcedboolean可选。如果为true,将不等待未完成的操作,而是尽可能快地退出;如果为false,在会所有未完成的操作结束后退出进程。
上次编辑于: 2022/11/20
17:30:01
贡献者: hyb1996
下一页
app - 应用新内容已就绪a
images - 图片处理 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: ./docs/zh/v8/ocr.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档
自动化 -
控件操作自动化 -
坐标操作
app -
应用
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
images - 图片处理图片处理
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.readPixels(path)
images.clip(img, x, y,
w, h)
images.resize(img,
size[, interpolation])
images.scale(img,
fx, fy[, interpolation])
images.rotate(img,
degree[, x, y])
images.concat(img1,
image2[, direction])
images.grayscale(img)
images.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.getSimilarity(img1,
img2, options)
images.matToImage(mat)
找图找色
images.requestScreenCapture([landscape])
$images.requestScreenCapture(options)
$images.getScreenCaptureOptions()
$images.stopScreenCapture()
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.findAllPointsForColor(img,
color, options)
images.findColorEquals(img,
color[, x, y, width, height])
images.findMultiColors(img,
firstColor, colors[, options])
images.detectsColor(image,
color, x, y[, threshold = 16, algorithm = "diff"])
images.detectsMultiColors(img,
x, y, firstColor, colors, options)
images.findImage(img,
template[, options])
images.findImageInRegion(img,
template, x, y[, width, height, threshold])
images.matchTemplate(img,
template, options)
images.findCircles(gray,
options)
$images.detectAndComputeFeatures(img[,
options])
$images.matchFeatures(scene,
object[, options])
ImageFeaturesImageFeatures.recycle()
ObjectFrameObjectFrame.topLeft
ObjectFrame.topRight
ObjectFrame.bottomLeft
ObjectFrame.bottomRight
ObjectFrame.center
ObjectFrame.centerX
ObjectFrame.centerY
MatchingResultMatchingResult.matches
MatchingResult.points
MatchingResult.first()
MatchingResult.last()
MatchingResult.leftmost()
MatchingResult.topmost()
MatchingResult.rightmost()
MatchingResult.bottommost()
MatchingResult.best()
MatchingResult.worst()
MatchingResult.sortBy(cmp)
ImageImage.getWidth()
Image.getHeight()
Image.saveTo(path)
Image.pixel(x,
y)
PointPoint.x
Point.y
ColorMappingColorMapping.singleton
ColorMapping.reset(img)
ColorMapping.recycle()
ColorMapping.findColor(color[,
options])
ColorMapping.findMultiColors(firstColor,
colors, options)
ColorMapping.findAllPointsForColor(color,
options)
keys
- 按键模拟
media
- 多媒体
module - 模块
ocr -
文字识别
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器
work_manager - 定时与任务ui -
用户界面util -
工具
WebSocket
zip -
压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
images - 图片处理images - 图片处理2022年10月22日
此页内容
图片处理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.readPixels(path)images.clip(img,
x, y, w, h)
images.resize(img,
size[, interpolation])
images.scale(img,
fx, fy[, interpolation])
images.rotate(img,
degree[, x, y])
images.concat(img1,
image2[, direction])
images.grayscale(img)images.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.getSimilarity(img1,
img2, options)
images.matToImage(mat)找图找色images.requestScreenCapture([landscape])$images.requestScreenCapture(options)$images.getScreenCaptureOptions()$images.stopScreenCapture()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.findAllPointsForColor(img,
color, options)
images.findColorEquals(img,
color[, x, y, width, height])
images.findMultiColors(img,
firstColor, colors[, options])
images.detectsColor(image,
color, x, y[, threshold = 16, algorithm = "diff"])
images.detectsMultiColors(img,
x, y, firstColor, colors, options)
images.findImage(img,
template[, options])
images.findImageInRegion(img,
template, x, y[, width, height, threshold])
images.matchTemplate(img,
template, options)
images.findCircles(gray,
options)
$images.detectAndComputeFeatures(img[,
options])
$images.matchFeatures(scene,
object[, options])
ImageFeatures
ImageFeatures.recycle()
ObjectFrame
ObjectFrame.topLeftObjectFrame.topRightObjectFrame.bottomLeftObjectFrame.bottomRightObjectFrame.centerObjectFrame.centerXObjectFrame.centerY
MatchingResult
MatchingResult.matchesMatchingResult.pointsMatchingResult.first()MatchingResult.last()MatchingResult.leftmost()MatchingResult.topmost()MatchingResult.rightmost()MatchingResult.bottommost()MatchingResult.best()MatchingResult.worst()MatchingResult.sortBy(cmp)
Image
Image.getWidth()Image.getHeight()Image.saveTo(path)Image.pixel(x,
y)Point
Point.xPoint.y
ColorMapping
ColorMapping.singletonColorMapping.reset(img)ColorMapping.recycle()ColorMapping.findColor(color[,
options])
ColorMapping.findMultiColors(firstColor,
colors, options)
ColorMapping.findAllPointsForColor(color,
options)
# images - 图片处理Stability: 2 - Stableimages模块提供了一些手机设备中常见的图片处理函数,包括截图、读写图片、图片剪裁、旋转、二值化、找色找图等。
该模块分为两个部分,找图找色部分和图片处理部分。
需要注意的是,image对象创建后尽量在不使用时进行回收,同时避免循环创建大量图片。因为图片是一种占用内存比较大的资源,尽管Auto.js通过各种方式(比如图片缓存机制、垃圾回收时回收图片、脚本结束时回收所有图片)尽量降低图片资源的泄漏和内存占用,但是糟糕的代码仍然可以占用大量内存。
Image对象通过调用recycle()函数来回收。例如:
// 读取图片
var img = images.read("./1.png");
// 对图片进行操作
...
// 回收图片
img.recycle();
例外的是,captureScreen()返回的图片不需要回收。
# 图片处理
# 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 {Image} 图片
path {string} 路径
format {string} 图片格式,可选的值为:
png
jpeg/jpgwebp
quality {number} 图片质量,为0~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])image {image} 图片
format {string} 图片格式,可选的值为:
png
jpeg/jpgwebp
quality {number} 图片质量,为0~100的整数值
返回 {string}把图片编码为base64数据并返回。
# images.fromBytes(bytes)bytes {byte[]} 字节数组解码字节数组bytes并返回解码后的图片Image对象。如果bytes无法解码则返回null。
# images.toBytes(img[, format = "png", quality = 100])image {image} 图片
format {string} 图片格式,可选的值为:
png
jpeg/jpgwebp
quality {number} 图片质量,为0~100的整数值
返回 {byte[]}把图片编码为字节数组并返回。
# images.readPixels(path)path {string} 图片的地址
返回 {Object} 包括图片的像素数据和宽高,{data,width,height}读取图片的像素数据和宽高。
# images.clip(img, x, y, w, h)img {Image} 图片
x {number} 剪切区域的左上角横坐标
y {number} 剪切区域的左上角纵坐标
w {number} 剪切区域的宽度
h {number} 剪切区域的高度
返回 {Image}从图片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
open in new
window返回 {Image}
调整图片大小,并返回调整后的图片。例如把图片放缩为200*300:images.resize(img, [200, 300])。
参见Imgproc.resize
open in new window。
# 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
open in new
window返回 {Image}
放缩图片,并返回放缩后的图片。例如把图片变成原来的一半:images.scale(img, 0.5, 0.5)。
参见Imgproc.resize
open in new window。
# images.rotate(img, degree[, x, y])
[v4.1.0新增]img {Image} 图片
degree {number} 旋转角度。
x {number} 旋转中心x坐标,默认为图片中点
y {number} 旋转中心y坐标,默认为图片中点
返回 {Image}将图片逆时针旋转degree度,返回旋转后的图片对象。
例如逆时针旋转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}灰度化图片,并返回灰度化后的图片。
# images.threshold(img, threshold, maxVal[, type])
[v4.1.0新增]
img {Image} 图片
threshold {number} 阈值
maxVal {number} 最大值
type {string} 阈值化类型,默认为"BINARY",参见ThresholdTypes
open in new
window, 可选的值:BINARY
BINARY_INV
TRUNC
TOZERO
TOZERO_INV
OTSU
TRIANGLE返回 {Image}
将图片阈值化,并返回处理后的图像。可以用这个函数进行图片二值化。例如:images.threshold(img, 100, 255, "BINARY"),这个代码将图片中大于100的值全部变成255,其余变成0,从而达到二值化的效果。如果img是一张灰度化图片,这个代码将会得到一张黑白图片。
可以参考有关博客(比如threshold函数的使用
open in new
window)或者OpenCV文档threshold
open in new window。
# 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
open in new
window)或者OpenCV文档adaptiveThreshold
open in new window。
# images.cvtColor(img, code[, dstCn])
[v4.1.0新增]img {Image} 图片
code {string} 颜色空间转换的类型,可选的值有一共有205个(参见ColorConversionCodes
open in new
window),这里只列出几个:
BGR2GRAY BGR转换为灰度
BGR2HSV BGR转换为HSV
``
dstCn {number}
目标图像的颜色通道数量,如果不填写则根据其他参数自动决定。
返回 {Image}对图像进行颜色空间转换,并返回转换后的图像。
可以参考有关博客(比如颜色空间转换
open in new
window)或者OpenCV文档cvtColor
open in new window。
# 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新增]img {Image} 图片
color {string} | {number} 颜色值
interval {number} 每个通道的范围间隔
返回 {Image}将图片二值化,在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}对图像进行模糊(平滑处理),返回处理后的图像。
可以参考有关博客(比如实现图像平滑处理
open in new
window)或者OpenCV文档blur
open in new window。
# images.medianBlur(img, size)
[v4.1.0新增]img {Image} 图片
size {Array} 定义滤波器的大小,如[3, 3]
返回 {Image}对图像进行中值滤波,返回处理后的图像。
可以参考有关博客(比如实现图像平滑处理
open in new
window)或者OpenCV文档blur
open in new window。
# 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}对图像进行高斯模糊,返回处理后的图像。
可以参考有关博客(比如实现图像平滑处理
open in new
window)或者OpenCV文档GaussianBlur
open in new window。
# images.getSimilarity(img1, img2, options)
img1 {Image} 图片1
img2 {Image} 图片2
options {Object} 选项包括:type {string} 比较相似度的算法(默认为MSSIM):
MSSIM
平均结构相似性,在影像品质的衡量上更能符合人眼对影像品质的判断。结构相似性SSIM的取值范围是 [ 0 , 1 ]
,当两张图像越相似时,则SSIM越接近1。
PNSR
峰值信噪比,是针对于像素绝对误差,通过均方误差(MSE)进行定义,当两幅图像的PSNR小于30时,那么这两幅图像可以说是比较相似的。返回 {number}
比较两幅图片的相似性,返回相似度。
例如log(images.getSimilarity(img1, img2, {
"type": "PNSR"
}));# images.matToImage(mat)
[v4.1.0新增]mat {Mat} OpenCV的Mat对象
返回 {Image}把Mat对象转换为Image对象。
# 找图找色
找图找色介绍了通过截图、匹配等搜索目标的不同方式,可以根据实际情况选择不同的方式:找色、多点找色:通过描述颜色或颜色路径匹配图片中的像素,效率较高
基于ColorMaping的找色或多点找色:适合每次截图都有多次找色、多点找色的情况,可以进一步提升找色效率,效率最高
找图(模板匹配):通过在大图中依次匹配小图,搜索小图的位置,效率中等,但不同分辨率兼容性较差
全分辨率找图(特征匹配):通过计算大图和小图的特征点,匹配特征而计算小图的位置,效率比普通找图低,但兼容分辨率、旋转等变化
# images.requestScreenCapture([landscape])landscape {boolean} 布尔值,
表示将要执行的截屏是否为横屏。如果landscape为false, 则表示竖屏截图; true为横屏截图。向系统申请屏幕截图权限,返回是否请求成功。
第一次使用该函数会弹出截图权限请求,建议选择“总是允许”。(某些系统没有总是允许选项)
这个函数只是申请截图权限,并不会真正执行截图,真正的截图函数是captureScreen()。
该函数在截图脚本中只需执行一次,而无需每次调用captureScreen()都调用一次;若已有截图权限,则抛出异常。
如果不指定landscape值,则截图方向由当前设备屏幕方向决定,因此务必注意执行该函数时的屏幕
截图权限无法在脚本引擎之间共享。
建议在本软件界面运行该函数,在其他软件界面运行时容易出现一闪而过的黑屏现象;另外,某些定制ROM或者高版本Android不允许在后台弹出界面,在后台运行此函数时可能会一直阻塞。
示例:// 请求截图
if(!requestScreenCapture()){
toast("请求截图失败");
exit();
}
// 连续截图10张图片(间隔1秒)并保存到存储卡目录
for(var i = 0; i < 10; i++){
captureScreen("/sdcard/screen_capture_" + i + ".png");
sleep(1000);
}
该函数也可以作为全局函数使用。
# $images.requestScreenCapture(options)
[Pro
8.0新增
open in new
window]options {object} 申请截图选项
width {number}
截图宽度,默认为-1,即自动设置为设备屏幕宽度
height {number}
截图高度,默认为-1,即自动设置为设备屏幕高度
orientation {number} 截图方向,默认为0
-1:ORIENTATION_CURRENT, 检测当前的屏幕方向,用该方向作为申请截图的屏幕方向
0: ORIENTATION_AUTO, 自动适应截图方向(转屏时自动切换方向)
1: ORIENTATION_PORTRAIT, 竖屏截图
2: ORIENTATION_LANDSCAPE, 横屏截图
async {boolean} 是否为异步截图。默认为false
向系统申请屏幕截图权限,返回是否请求成功。对于width和height参数,系统只会匹配相邻的合适的宽高。截图宽高不一定和指定的宽高完全一致。requestScreenCapture({orientation: 0});更多参数和说明参见上面的images.requestScreenCapture([landscape])函数,这里只特别解释async参数。
当async为true时,申请截图将为异步截图,也即无法通过captureScreen()来截图,而是通过事件screen_capture来监听截图。
该事件将在屏幕变化时自动触发,对于屏幕刷新少的软件界面更加节能省电,对于游戏界面则可能无法达到省电效果。// 请求截图权限, 注意参数 async: true
requestScreenCapture({async: true});
let target = $images.read('./test.png');
$events.on('exit', () => target.recycle());
// 监听屏幕截图
$images.on("screen_capture", capture => {
// 找图
let pos = $images.findImage(capture, target);
// 打印
console.log(pos);
});# $images.getScreenCaptureOptions()
[Pro
8.8.12新增
open in new
window]返回 {object} | {null}获取当前截图配置选项。如果并未申请截图权限,则返回null。返回的对象有以下字段: *
width {number} 截图宽度 *
height {number} 截图高度 *
orientation {number} 截图方向 * 0:
ORIENTATION_AUTO, 自动适应截图方向 * 1: ORIENTATION_PORTRAIT, 竖屏截图 * 2: ORIENTATION_LANDSCAPE, 横屏截图 *
density {number} 截图像素密度 *
async {boolean} 是否为异步截图
# $images.stopScreenCapture()
[Pro
8.8.12新增
open in new
window]
释放截图权限。如果并未申请截图权限,则此函数没有任何作用。
# images.captureScreen()
截取当前屏幕并返回一个Image对象。
没有截图权限时执行该函数会抛出SecurityException。
该函数不会返回null,两次调用可能返回相同的Image对象。这是因为设备截图的更新需要一定的时间,短时间内(一般来说是16ms)连续调用则会返回同一张截图。
截图需要转换为Bitmap格式,从而该函数执行需要一定的时间(0~20ms)。
另外在requestScreenCapture()执行成功后需要一定时间后才有截图可用,因此如果立即调用captureScreen(),会等待一定时间后(一般为几百ms)才返回截图。
例子:// 请求横屏截图
requestScreenCapture(true);
// 截图
var img = captureScreen();
// 获取在点(100, 100)的颜色值
var color = images.pixel(img, 100, 100);
// 显示该颜色值
toast(colors.toString(color));
该函数也可以作为全局函数使用。
# images.captureScreen(path)path {string} 截图保存路径截取当前屏幕并以PNG格式保存到path中。如果文件不存在会被创建;文件存在会被覆盖。
该函数不会返回任何值。该函数也可以作为全局函数使用。
# images.pixel(image, x, y)image {Image} 图片
x {number} 要获取的像素的横坐标。
y {number} 要获取的像素的纵坐标。返回图片image在点(x, y)处的像素的ARGB值。
该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。
坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
# images.findColor(image, color, options)image {Image} 图片
color {number} | {string}
要寻找的颜色的RGB值。如果是一个整数,则以0xRRGGBB的形式代表RGB值(A通道会被忽略);如果是字符串,则以"#RRGGBB"代表其RGB值。
options {Object} 选项在图片中寻找颜色color。找到时返回找到的点Point,找不到时返回null。
选项包括:region {Array}
找色区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。
threshold {number} 找色时颜色相似度的临界值,范围为0 ~
255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255 -
threshold) / 255.该函数也可以作为全局函数使用。
一个循环找色的例子如下:requestScreenCapture();// 循环找色,找到红色(#ff0000)时停止并报告坐标
while(true){
var img = captureScreen();
var point = findColor(img, "#ff0000");
if(point){
toast("找到红色,坐标为(" + point.x + ", " + point.y + ")");
}
}
一个区域找色的例子如下:// 读取本地图片/sdcard/1.png
var img = images.read("/sdcard/1.png");
// 判断图片是否加载成功
if(!img){
toast("没有该图片");
exit();
}
// 在该图片中找色,指定找色区域为在位置(400, 500)的宽为300长为200的区域,指定找色临界值为4
var point = findColor(img, "#00ff00", {
region: [400, 500, 300, 200],
threshold: 4
});
if(point){
toast("找到啦:" + point);
}else{
toast("没找到");
}# images.findColorInRegion(img, color, x, y[, width, height,
threshold])
区域找色的简便方法。
相当于images.findColor(img, color, {
region: [x, y, width, height],
threshold: threshold
});
该函数也可以作为全局函数使用。
# images.findAllPointsForColor(img, color, options)img {Image} 图片
color {number} | {string} 要检测的颜色
options {Object} 选项包括:
region {Array}
找色区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。
similarity {number}
找色时颜色相似度,范围为0~1(越大越相似,1为颜色相等,0为任何颜色都能匹配)。
threshold {number}
找色时颜色相似度的临界值,范围为0 ~
255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255
- threshold) / 255 。相似度与阈值二选一,同时存在则以相似度为准。
返回 {Array}在图片中寻找所有颜色为color的点。找到时返回找到的点Point的数组,找不到时返回null。
例如找出所有白色的点:log(images.findAllPointsForColor(img, "#ffffff"));# images.findColorEquals(img, color[, x, y, width, height])img {Image} 图片
color {number} | {string} 要寻找的颜色
x {number} 找色区域的左上角横坐标
y {number} 找色区域的左上角纵坐标
width {number} 找色区域的宽度
height {number} 找色区域的高度
返回 {Point}在图片img指定区域中找到颜色和color完全相等的某个点,并返回该点的左边;如果没有找到,则返回null。
找色区域通过x,
y,
width,
height指定,如果不指定找色区域,则在整张图片中寻找。
该函数也可以作为全局函数使用。
示例: (通过找QQ红点的颜色来判断是否有未读消息)requestScreenCapture();
launchApp("QQ");
sleep(1200);
var p = findColorEquals(captureScreen(), "#f64d30");
if(p){
toast("有未读消息");
}else{
toast("没有未读消息");
}# images.findMultiColors(img, firstColor, colors[, options])img {Image} 要找色的图片
firstColor {number} | {string} 第一个点的颜色
colors {Array}
表示剩下的点相对于第一个点的位置和颜色的数组,数组的每个元素为[x, y, color]
options {Object} 选项,包括:
region {Array}
找色区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。
threshold {number}
找色时颜色相似度的临界值,范围为0 ~
255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255
- threshold) / 255.多点找色,类似于按键精灵的多点找色,其过程如下:在图片img中找到颜色firstColor的位置(x0, y0)
对于数组colors的每个元素[x, y, color],检查图片img在位置(x + x0, y + y0)上的像素是否是颜色color,是的话返回(x0,
y0),否则继续寻找firstColor的位置,重新执行第1步
整张图片都找不到时返回null例如,对于代码images.findMultiColors(img, "#123456", [[10, 20, "#ffffff"], [30, 40, "#000000"]]),假设图片在(100,
200)的位置的颜色为#123456, 这时如果(110, 220)的位置的颜色为#fffff且(130, 240)的位置的颜色为#000000,则函数返回点(100, 200)。
如果要指定找色区域,则在options中指定,例如:var p = images.findMultiColors(img, "#123456", [[10, 20, "#ffffff"], [30, 40, "#000000"]], {
region: [0, 960, 1080, 960]
});# images.detectsColor(image, color, x, y[, threshold = 16, algorithm
= "diff"])image {Image} 图片
color {number} | {string} 要检测的颜色
x {number} 要检测的位置横坐标
y {number} 要检测的位置纵坐标
threshold {number} 颜色相似度临界值,默认为16。取值范围为0 ~
255。
algorithm {string} 颜色匹配算法,包括: "equal": 相等匹配,只有与给定颜色color完全相等时才匹配。
"diff": 差值匹配。与给定颜色的R、G、B差的绝对值之和小于threshold时匹配。
"rgb": rgb欧拉距离相似度。与给定颜色color的rgb欧拉距离小于等于threshold时匹配。
"rgb+": 加权rgb欧拉距离匹配(LAB Delta E
open in new
window)。
"hs": hs欧拉距离匹配。hs为HSV空间的色调值。
返回图片image在位置(x, y)处是否匹配到颜色color。用于检测图片中某个位置是否是特定颜色。
一个判断微博客户端的某个微博是否被点赞过的例子:requestScreenCapture();
// 找到点赞控件
var like = id("ly_feed_like_icon").findOne();
// 获取该控件中点坐标
var x = like.bounds().centerX();
var y = like.bounds().centerY();
// 截图
var img = captureScreen();
// 判断在该坐标的颜色是否为橙红色
if(images.detectsColor(img, "#fed9a8", x, y)){
// 是的话则已经是点赞过的了,不做任何动作
}else{
// 否则点击点赞按钮
like.click();
}# images.detectsMultiColors(img, x, y, firstColor, colors, options)
img {Image} 目标图片
x {number} 第一个点的x坐标
y {number} 第一个点的y坐标
firstColor {number} | {string} 第一个点的颜色
colors {Array}
表示剩下的点相对于第一个点的位置和颜色的数组,数组的每个元素为[x, y, color]
options {Object} 选项,包括:
region {Array}
找色区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则区域为整张图片。
threshold {number}
比色时颜色相似度的临界值,范围为0 ~
255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255
- threshold) / 255.
返回 boolean多点比色,返回img在起始位置(x, y)处的多个点的颜色是否匹配。
参见images.findMultiColors()多点找色的文档。
log(images.detectsMultiColors(img, 100, 200, "#000000", [[3, 4, "#123456"], [8, 10, "#ff0000"]]));# images.findImage(img, template[, options])
[v8.5.5新增]img {Image} 大图片
template {Image} 小图片(模板)
options {Object} 找图选项找图。在大图片img中查找小图片template的位置(模块匹配),找到时返回位置坐标(Point),找不到时返回null。
选项包括:threshold {number}
图片相似度。取值范围为0~1的浮点数。默认值为0.9。
region {Array}
找图区域。参见findColor函数关于region的说明。
level {number}
一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。该函数也可以作为全局函数使用。
一个最简单的找图例子如下:var img = images.read("/sdcard/大图.png");
var templ = images.read("/sdcard/小图.png");
var p = findImage(img, templ);
if(p){
toast("找到啦:" + p);
}else{
toast("没找到");
}
稍微复杂点的区域找图例子如下:auto();
requestScreenCapture();
var wx = images.read("/sdcard/微信图标.png");
// 返回桌面
home();
// 截图并找图
var p = findImage(captureScreen(), wx, {
region: [0, 50],
threshold: 0.8
});
if(p){
toast("在桌面找到了微信图标啦: " + p);
}else{
toast("在桌面没有找到微信图标");
}# images.findImageInRegion(img, template, x, y[, width, height,
threshold])
区域找图的简便方法。相当于:images.findImage(img, template, {
region: [x, y, width, height],
threshold: threshold
})
该函数也可以作为全局函数使用。
# images.matchTemplate(img, template, options)
[v4.1.0新增]img {Image} 大图片
template {Image} 小图片(模板)
options {Object} 找图选项:
threshold {number}
图片相似度。取值范围为0~1的浮点数。默认值为0.9。
region {Array}
找图区域。参见findColor函数关于region的说明。
max {number} 找图结果最大数量,默认为5
transparentMask {boolean}
是否使用透明模板找图。此选项开启后,传入的template参数可以是一个透明背景的图片对象用于匹配。此选项为 [Pro
8.0新增
open in new
window] 。
level {number}
一般而言不必修改此参数。不加此参数时该参数会根据图片大小自动调整。找图算法是采用图像金字塔进行的, level参数表示金字塔的层次,
level越大可能带来越高的找图效率,但也可能造成找图失败(图片因过度缩小而无法分辨)或返回错误位置。因此,除非您清楚该参数的意义并需要进行性能调优,否则不需要用到该参数。
返回 {MatchingResult}在大图片中搜索小图片,并返回搜索结果MatchingResult。该函数可以用于找图时找出多个位置,可以通过max参数控制最大的结果数量。也可以对匹配结果进行排序、求最值等操作。
# images.findCircles(gray, options)
gray {Image} 灰度图片
options {Object} 选项包括:region {Array}
找圆区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找圆区域的左上角;region[2]*region[3]表示找圆区域的宽高。如果只有region只有两个元素,则找圆区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则找圆区域为整张图片。
dp {number}
dp是累加面与原始图像相比的分辨率的反比参数,dp=2时累计面分辨率是元素图像的一半,宽高都缩减为原来的一半,dp=1时,两者相同。默认为1。
minDst {number}
minDist定义了两个圆心之间的最小距离。默认为图片高度的八分之一。
param1 {number}
param1是Canny边缘检测的高阈值,低阈值被自动置为高阈值的一半。默认为100,范围为0-255。
param2 {number}
param2是累加平面对是否是圆的判定阈值,默认为100。
minRadius {number}
定义了检测到的圆的半径的最小值,默认为0。
maxRadius {number}
定义了检测到的圆的半径的最大值,0为不限制最大值,默认为0。返回 {Array}
在图片中寻找圆(做霍夫圆变换)。找到时返回找到的所有圆{x,y,radius}的数组,找不到时返回null。
一个寻找圆的例子:// 请求截图
requestScreenCapture();
// 截图
let img = captureScreen();
// 灰度化图片
let gray = images.grayscale(img);
// 找圆
let arr = findCircles(gray, {
dp: 1,
minDst: 80,
param1: 100,
param2: 100,
minRadius: 50,
maxRadius: 80,
});
// 回收图片
gray.recycle();# $images.detectAndComputeFeatures(img[, options])
[v9.2新增]
img {Image} 图片,要计算特征的图片
options {object} 特征计算选项,可选参数:scale {number}
计算特征时图片的缩放比例,缩放比例越小,计算特征越快,但可能因为放缩过度导致特征计算错误。对于宽度 * 高度 >
1000000的图片,scale参数默认为0.5,否则scale默认为1
grayscale {boolean}
是否灰度化后再计算特征,默认为true
method {string}
图像特征匹配的方法,默认为SIFT,也可指定为ORB(不推荐)
region {Array}
图像的匹配区域,不填此字段时则为整个图片计算特征返回 {ImageFeatures}
保存图片特征的对象,不用时需要调用recycle()回收
对给定图片计算特征,将图片计算后的特征信息返回。该特征信息对象可用于后续使用matchFeatures函数做特征匹配。
一般而言,小图的特征可以在程序开始时就计算,在程序结束时再回收。如果每次截图时都去读取小图、计算小图特征,不仅会导致程序运行效率低,而且会导致内存碎片,从而使得内存难以利用和更快耗尽。
# $images.matchFeatures(scene, object[, options])
[v9.2新增]
scene {ImageFeatures} 场景图片的特征对象(大图特征)
object {ImageFeatures} 目标图片的特征对象(小图特征)
options {object} 可选参数:matcher {string}
特征匹配方式,默认为FLANNBASED,可选的值有"FLANNBASED",
"BRUTEFORCE",
"BRUTEFORCE_L1",
"BRUTEFORCE_HAMMING",
"BRUTEFORCE_HAMMINGLUT",
"BRUTEFORCE_SL2",除了FLANNBASED外其他匹配方式未经过充分测试
drawMatches {string}
绘制图片匹配详情的路径,若为空则不绘制匹配详情。此选项一般为调试使用,在真正匹配时请勿指定,否则会增加耗时。
thredshold {number}
匹配阈值,默认为0.7返回 {ObjectFrame}
| {null} 小图在大图中的匹配位置,若未找到则返回null
特征匹配提供了全分辨率找图功能,可以识别检测图像中明显的特征并根据特征来查找类似图片。即使图片的分辨率、形状、旋转有差异也能识别出来,但匹配速度相对较慢。
需要注意的是,计算特征的过程也比较耗时,因此请勿在每次匹配时才计算小图的特征,小图若不变可以提前计算特征并复用特征对象。
以下是一个简单的示例,也在Auto.js Pro内置示例"图片与图色处理 - 找图找色"文件夹中,可直接运行。// 读取小图
let hellokitty = $images.read('./hellokitty.jpg');
// 计算小图特征
let objectFeatures = $images.detectAndComputeFeatures(hellokitty);
// 请求截图权限
requestScreenCapture();// 打开HelloKitty图片
$app.openUrl('https://baike.baidu.com/item/Hello%20Kitty/984270')let n = 3;
for (let i = 0; i < n; i++) {
sleep(3000);
let capture = captureScreen(); // 若要提高效率,可以在计算大图特征时调整scale参数,默认为0.5,
// 越小越快,但可以放缩过度导致匹配错误。若在特征匹配时无法搜索到正确结果,可以调整这里的参数,比如{scale: 1}
// 也可以在这里指定{region: [...]}参数只计算这个区域的特征提高效率
let sceneFeatures = $images.detectAndComputeFeatures(capture);
// 最后一次匹配时,我们将特征和匹配绘制出来,在调试时更容易看出匹配效果,但会增加耗时
let drawMatches = (i === n - 1 ? './matches.jpg' : undefined);
let result = $images.matchFeatures(sceneFeatures, objectFeatures, { drawMatches });
// 打印结果和中心点,可使用click(reuslt.centerX, result.centerY)点击
console.log(result, result ? result.center : null); // 回收特征对象
sceneFeatures.recycle(); if (drawMatches) {
// 可以在当前目录查看matches.jpg图片,会绘制详细匹配详情
app.viewFile('./matches.jpg');
}
}
// 回收小图特征对象
objectFeatures.recycle();
hellokitty.recycle();
#
ImageFeatures
[v9.2新增]
存储特征信息的类,仅用于特征匹配。
# ImageFeatures.recycle()
回收特征对象。必须显式在不使用该对象时调用,否则会导致内存泄露而程序崩溃。
#
ObjectFrame
[v9.2新增]
特征匹配返回的结果,表示一个四边形。
# ObjectFrame.topLeft{Point}四边形的左上角坐标。
# ObjectFrame.topRight{Point}四边形的右上角坐标。
# ObjectFrame.bottomLeft{Point}四边形的左下角坐标。
# ObjectFrame.bottomRight{Point}四边形的右下角坐标。
# ObjectFrame.center{Point}四边形的中心点坐标。
# ObjectFrame.centerX{number}四边形的中心点x坐标。
# ObjectFrame.centerY{number}四边形的中心点y坐标。
#
MatchingResult
[v4.1.0新增]
# MatchingResult.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);
});
# MatchingResult.points{Array} 匹配位置的数组。# MatchingResult.first()返回 {Match}第一个匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.last()返回 {Match}最后一个匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.leftmost()返回 {Match}位于大图片最左边的匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.topmost()返回 {Match}位于大图片最上边的匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.rightmost()返回 {Match}位于大图片最右边的匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.bottommost()返回 {Match}位于大图片最下边的匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.best()返回 {Match}相似度最高的匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.worst()返回 {Match}相似度最低的匹配结果。如果没有任何匹配,则返回null。
# MatchingResult.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()
返回以像素为单位图片宽度。
# Image.getHeight()
返回以像素为单位的图片高度。
# Image.saveTo(path)path {string} 路径把图片保存到路径path。(如果文件存在则覆盖)
# Image.pixel(x, y)x {number} 横坐标
y {number} 纵坐标返回图片image在点(x, y)处的像素的ARGB值。
该值的格式为0xAARRGGBB,是一个"32位整数"(虽然JavaScript中并不区分整数类型和其他数值类型)。
坐标系以图片左上角为原点。以图片左侧边为y轴,上侧边为x轴。
# Point
findColor, findImage返回的对象。表示一个点(坐标)。
#
Point.x
横坐标。
#
Point.y
纵坐标。
#
ColorMapping
通过颜色映射的实现一种找色方式,对于同一张图找多次色,每次找色相比images模块里的函数非常快,只是需要相比一般找色需要一个初始化过程。
注意!ColorMapping仅能使用截图的图片对象初始化颜色映射。
初始化方式:// 申请截图权限
$images.requestScreenCapture();
// 初始化ColorMapping
let ColorMapping = $colors.mapping;
// 创建ColorMapping实例
let cm = new ColorMapping();
// 截屏
let img = $images.captureScreen();
// 初始化颜色映射
cm.reset(img);
// 使用完后及时回收
cm.recycle();
如果不想手动回收,可以用ColorMapping的单例,这个单例会自动在脚本结束时回收。// 申请截图权限
$images.requestScreenCapture();
// 初始化ColorMapping
let ColorMapping = $colors.mapping;
// 创建ColorMapping实例
let cm = ColorMapping.singleton;
// 截屏
let img = $images.captureScreen();
// 初始化颜色映射
cm.reset(img);
// 找色
cm.findColor("#ffffff")
# ColorMapping.singleton{ColorMapping}ColorMapping的全局单例对象。
# ColorMapping.reset(img)img {Image} 截图此操作会重新初始化颜色映射的数据。
# ColorMapping.recycle()
此操作会释放ColorMapping对象。
# ColorMapping.findColor(color[, options])color {number} | {string} 要检测的颜色
options {Object} 选项包括:
region {Array}
找色区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。
similarity {number}
找色时颜色相似度,范围为0~1(越大越相似,1为颜色相等,0为任何颜色都能匹配)。
threshold {number}
找色时颜色相似度的临界值,范围为0 ~
255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255
- threshold) / 255 。相似度与阈值二选一,同时存在则以相似度为准。
返回 {Point}在图片中寻找颜色color。找到时返回找到的点Point,找不到时返回null。
一个同一张图多次找色的例子如下:// 申请截图权限
$images.requestScreenCapture();
// 初始化ColorMapping
let ColorMapping = $colors.mapping;
// 创建ColorMapping实例
let cm = new ColorMapping();
// 使用ColorMapping找色
while (true) {
// 截屏
let img = $images.captureScreen();
// 初始化颜色映射
cm.reset(img);
let p1 = cm.findColor("#ffffff");
if (p1) {
// ...
console.log("白色点坐标" + p1);
continue;
}
let p2 = cm.findColor("#000000");
if (p2) {
// ...
console.log("黑色点坐标" + p2);
continue;
}
}
// 释放ColorMapping
cm.recycle();一个区域找色的例子如下:// 申请截图权限
$images.requestScreenCapture();
// 初始化ColorMapping
let ColorMapping = $colors.mapping;
// 创建ColorMapping实例
let cm = new ColorMapping();
// 截屏
let img = $images.captureScreen();
// 初始化颜色映射
cm.reset(img);
// 使用ColorMapping找色,指定找色区域为在位置(400, 500)的宽为300长为200的区域,指定找色临界值为4
let point = cm.findColor("#00ff00", {
region: [400, 500, 300, 200],
threshold: 4
});
if(point){
toast("找到啦:" + point);
}else{
toast("没找到");
}
// 释放ColorMapping
cm.recycle();
# ColorMapping.findMultiColors(firstColor, colors, options)firstColor {number} | {string} 第一个点的颜色
colors {Array}
表示剩下的点相对于第一个点的位置和颜色的数组,数组的每个元素为[x, y, color]
options {Object} 选项,包括:
region {Array}
找色区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。
threshold {number}
找色时颜色相似度的临界值,范围为0 ~
255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为 similarity = (255
- threshold) / 255。
返回 {Point}多点找色,与images.findMultiColors类似,但多次在同一张图片中找色速度极快。
一个同一张图片多次多点找色的例子:// 申请截图权限
$images.requestScreenCapture();
// 初始化ColorMapping
let ColorMapping = $colors.mapping;
// 创建ColorMapping实例
let cm = new ColorMapping();
// 截屏
let img = $images.captureScreen();
// 初始化颜色映射
cm.reset(img);
// 使用ColorMapping多点找色
let p1 = cm.findMultiColors("#ff00ff", [[10, 20, "#ffffff"], [30, 40, "#000000"]]);
let p2 = cm.findMultiColors("#ff00ff", [[10, 20, "#ffffff"], [30, 40, "#000000"]]);
log("p1" + p1 + "p2" + p2);
// 释放ColorMapping
cm.recycle();
# ColorMapping.findAllPointsForColor(color, options)color {number} | {string} 要检测的颜色
options {Object} 选项包括:
region {Array}
找色区域。是一个两个或四个元素的数组。(region[0],
region[1])表示找色区域的左上角;region[2]*region[3]表示找色区域的宽高。如果只有region只有两个元素,则找色区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则找色区域为整张图片。
similarity {number}
找色时颜色相似度,范围为0~1(越大越相似,1为颜色相等,0为任何颜色都能匹配)。
threshold {number}
找色时颜色相似度的临界值,范围为0—255(越小越相似,0为颜色相等,255为任何颜色都能匹配)。默认为4。threshold和浮点数相似度(0.0~1.0)的换算为
similarity = (255 - threshold) / 255 。相似度与阈值二选一,同时存在则以相似度为准。
返回 {Array}在图片中寻找所有颜色为color的点。找到时返回找到的点Point的数组,找不到时返回null。
找出所有白色点和所有黑色点的例子:// 申请截图权限
$images.requestScreenCapture();
// 初始化ColorMapping
let ColorMapping = $colors.mapping;
// 创建ColorMapping实例
let cm = new ColorMapping();
// 截屏
let img = $images.captureScreen();
// 初始化颜色映射
cm.reset(img);
// 使用ColorMapping多点找色
let whitePoints = cm.findAllPointsForColor("#ffffff");
let blackPoints = cm.findAllPointsForColor("#000000");
if (whitePoints != null) {
log("白色点有" + whitePoints.length + "个");
} else {
log("未找到白色点");
}
if (blackPoints != null) {
log("黑色点有" + blackPoints.length + "个");
} else {
log("未找到黑色点");
}
// 释放ColorMapping
cm.recycle();上次编辑于: 2022/10/23
21:32:46
贡献者: hyb1996
上一页
http - HTTP网络请求下一页
keys - 按键模拟新内容已就绪a
keys - 按键模拟 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: keys.html
Title: keys - 按键模拟 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档
自动化 - 控件操作自动化 - 坐标操作
app - 应用
base64
colors - 颜色
canvas - 画布
console -
控制台
crypto -
加解密与消息摘要
debug - 调试工具
device - 设备
dialogs -
对话框
engines -
脚本引擎
events -
事件与监听
floaty - 悬浮窗
files - 文件系统
globals -
全局变量与函数
http -
HTTP网络请求
images -
图片处理
keys - 按键模拟back()
home()
powerDialog()
notifications()
quickSettings()
recents()
splitScreen()
Home()
Back()
Power()
Menu()
VolumeUp()
VolumeDown()
Camera()
Up()
Down()
Left()
Right()
OK()
Text(text)
KeyCode(code)
附录: KeyCode对照表
media - 多媒体
module - 模块
ocr - 文字识别
plugins - 插件
power_manager -
电源管理
sensors -
传感器
shell -
Shell命令
storages -
本地存储
settings -
设置
threads -
多线程
timers - 定时器
work_manager -
定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
keys - 按键模拟keys - 按键模拟2022年10月22日
此页内容
back()
home()
powerDialog()
notifications()
quickSettings()
recents()
splitScreen()
Home()
Back()
Power()
Menu()
VolumeUp()
VolumeDown()
Camera()
Up()
Down()
Left()
Right()
OK()
Text(text)
KeyCode(code)
附录: KeyCode对照表# keys - 按键模拟
按键模拟部分提供了一些模拟物理按键的全局函数,包括Home、音量键、照相键等,有的函数依赖于无障碍服务,有的函数依赖于root权限。
一般来说,以大写字母开头的函数都依赖于root权限。执行此类函数时,如果没有root权限,则函数执行后没有效果,并会在控制台输出一个警告。
# back()返回 {boolean}模拟按下返回键。返回是否执行成功。 此函数依赖于无障碍服务。
# home()返回 {boolean}模拟按下Home键。返回是否执行成功。 此函数依赖于无障碍服务。
# powerDialog()返回 {boolean}弹出电源键菜单。返回是否执行成功。 此函数依赖于无障碍服务。
# notifications()
返回 {boolean}拉出通知栏。返回是否执行成功。 此函数依赖于无障碍服务。
# quickSettings()
返回 {boolean}显示快速设置(下拉通知栏到底)。返回是否执行成功。 此函数依赖于无障碍服务。
# recents()返回 {boolean}显示最近任务。返回是否执行成功。 此函数依赖于无障碍服务。
# splitScreen()返回 {boolean}分屏。返回是否执行成功。 此函数依赖于无障碍服务, 并且需要系统自身功能的支持。
# Home()
模拟按下Home键。 此函数依赖于root权限。
# Back()
模拟按下返回键。 此函数依赖于root权限。
# Power()
模拟按下电源键。 此函数依赖于root权限。
# Menu()
模拟按下菜单键。 此函数依赖于root权限。
# VolumeUp()
按下音量上键。 此函数依赖于root权限。
# VolumeDown()
按键音量上键。 此函数依赖于root权限。
# Camera()
模拟按下照相键。
# Up()
模拟按下物理按键上。 此函数依赖于root权限。
# Down()
模拟按下物理按键下。 此函数依赖于root权限。
# Left()
模拟按下物理按键左。 此函数依赖于root权限。
# Right()
模拟按下物理按键右。 此函数依赖于root权限。
# OK()
模拟按下物理按键确定。 此函数依赖于root权限。
# Text(text)text {string} 要输入的文字,只能为英文或英文符号
输入文字text。例如Text("aaa");
# KeyCode(code)
code {number} | {string} 要按下的按键的数字代码或名称。参见下表。
模拟物理按键。例如KeyCode(29)和KeyCode("KEYCODE_A")是按下A键。
# 附录: KeyCode对照表KeyCode
KeyEvent value
KEYCODE_MENU
1
KEYCODE_SOFT_RIGHT
2
KEYCODE_HOME
3
KEYCODE_BACK
4
KEYCODE_CALL
5
KEYCODE_ENDCALL
6
KEYCODE_0
7
KEYCODE_1
8
KEYCODE_2
9
KEYCODE_3
10
KEYCODE_4
11
KEYCODE_5
12
KEYCODE_6
13
KEYCODE_7
14
KEYCODE_8
15
KEYCODE_9
16
KEYCODE_STAR
17
KEYCODE_POUND
18
KEYCODE_DPAD_UP
19
KEYCODE_DPAD_DOWN
20
KEYCODE_DPAD_LEFT
21
KEYCODE_DPAD_RIGHT
22
KEYCODE_DPAD_CENTER
23
KEYCODE_VOLUME_UP
24
KEYCODE_VOLUME_DOWN
25
KEYCODE_POWER
26
KEYCODE_CAMERA
27
KEYCODE_CLEAR
28
KEYCODE_A
29
KEYCODE_B
30
KEYCODE_C
31
KEYCODE_D
32
KEYCODE_E
33
KEYCODE_F
34
KEYCODE_G
35
KEYCODE_H
36
KEYCODE_I
37
KEYCODE_J
38
KEYCODE_K
39
KEYCODE_L
40
KEYCODE_M
41
KEYCODE_N
42
KEYCODE_O
43
KEYCODE_P
44
KEYCODE_Q
45
KEYCODE_R
46
KEYCODE_S
47
KEYCODE_T
48
KEYCODE_U
49
KEYCODE_V
50
KEYCODE_W
51
KEYCODE_X
52
KEYCODE_Y
53
KEYCODE_Z
54
KEYCODE_COMMA
55
KEYCODE_PERIOD
56
KEYCODE_ALT_LEFT
57
KEYCODE_ALT_RIGHT
58
KEYCODE_SHIFT_LEFT
59
KEYCODE_SHIFT_RIGHT
60
KEYCODE_TAB
61
KEYCODE_SPACE
62
KEYCODE_SYM
63
KEYCODE_EXPLORER
64
KEYCODE_ENVELOPE
65
KEYCODE_ENTER
66
KEYCODE_DEL
67
KEYCODE_GRAVE
68
KEYCODE_MINUS
69
KEYCODE_EQUALS
70
KEYCODE_LEFT_BRACKET
71
KEYCODE_RIGHT_BRACKET
72
KEYCODE_BACKSLASH
73
KEYCODE_SEMICOLON
74
KEYCODE_APOSTROPHE
75
KEYCODE_SLASH
76
KEYCODE_AT
77
KEYCODE_NUM
78
KEYCODE_HEADSETHOOK
79
KEYCODE_FOCUS
80
KEYCODE_PLUS
81
KEYCODE_MENU
82
KEYCODE_NOTIFICATION
83
KEYCODE_SEARCH
84
TAG_LAST_ KEYCODE
85上次编辑于: 2022/10/22
15:36:15
贡献者: hyb1996
上一页
images - 图片处理下一页
media - 多媒体
新内容已就绪a
ocr - 文字识别 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: ocr.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档
自动化 - 控件操作自动化 - 坐标操作
app - 应用
base64
colors - 颜色
canvas - 画布
console -
控制台
crypto -
加解密与消息摘要
debug - 调试工具
device - 设备
dialogs -
对话框
engines -
脚本引擎
events -
事件与监听
floaty - 悬浮窗
files - 文件系统
globals -
全局变量与函数
http -
HTTP网络请求
images -
图片处理
keys - 按键模拟
media - 多媒体
module - 模块
ocr - 文字识别$ocr.create([options])
OCR.detect(image[, options])
OCR.release()
OCRResult.confidence
OCRResult.text
OCRResult.bounds
OCRResult.rotation
OCRResult.rotationConfidence
OCRResult.javaObject
OCRResult.clickCenter()
plugins - 插件
power_manager -
电源管理
sensors -
传感器
shell -
Shell命令
storages -
本地存储
settings -
设置
threads -
多线程
timers - 定时器
work_manager -
定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
ocr - 文字识别ocr - 文字识别2022年10月22日
此页内容
$ocr.create([options])OCR.detect(image[, options])OCR.release()
OCRResult.confidenceOCRResult.text
OCRResult.bounds
OCRResult.rotationOCRResult.rotationConfidenceOCRResult.javaObjectOCRResult.clickCenter()
# ocr - 文字识别Pro 9.2版本新增$ocr模块即光学文字识别,用于识别图片中的文字。该内置模块基于PaddleOCR实现,需要先在Auto.js
Pro的插件商店中下载官方PaddleOCR插件才能使用。打包时插件可一并打包到apk中,无需单独安装插件。
另外,官方提供了另一个基于谷歌MLKit的OCR插件,参见官方MLKitOCR插件
open in new window。提示
特别感谢Auto.js爱好者L(QQ: 2056968162,7Zip插件作者
open in new
window)提供的初始对接代码,并在后续提供了一些Bug修复和优化的帮助,大大节省了开发时间❤️。#
$ocr.create([options])options {object} 可选参数,选项option包括以下内容:
models {string}
模型,slim指定精度相对低但速度更快的模型,若不指定则为default模型,精度高一点但速度慢一点。也可直接指定自定义模型的绝对路径。
labelsFile {string}
模型的标签文件,默认为null,需要配合models字段使用。
cpuPowerMode {string}
CPU模式,默认为LITE_POWER_HIGH,可选值有:
LITE_POWER_HIGH 绑定大核运行模式。如果 ARM CPU 支持
big.LITTLE,则优先使用并绑定 Big
cluster,如果设置的线程数大于大核数量,则会将线程数自动缩放到大核数量。如果系统不存在大核或者在一些手机的低电量情况下会出现绑核失败,如果失败则进入不绑核模式。
LITE_POWER_LOW 绑定小核运行模式。如果 ARM CPU 支持
big.LITTLE,则优先使用并绑定 Little cluster,如果设置的线程数大于小核数量,则会将线程数自动缩放到小核数量。如果找不到小核,则自动进入不绑核模式。
LITE_POWER_FULL
大小核混用模式。线程数可以大于大核数量,当线程数大于核心数量时,则会自动将线程数缩放到核心数量。
LITE_POWER_NO_BIND 不绑核运行模式(推荐)。系统根据负载自动调度任务到空闲的
CPU 核心上。
LITE_POWER_RAND_HIGH 轮流绑定大核模式。如果 Big cluster
有多个核心,则每预测10次后切换绑定到下一个核心。
LITE_POWER_RAND_LOW 轮流绑定小核模式。如果 Little cluster
有多个核心,则每预测10次后切换绑定到下一个核心。
parallelThreads {number}
并行线程数,默认为4
useOpenCL {boolean}
是否使用OpenCL,默认为false
返回 {OCR} 返回新的OCR对象
根据给定选项,创建OCR对象,可用于文字识别。一般而已不必自定义参数,使用$ocr.create()即可创建有效的OCR对象。
一个简单的截图并识别文字例子如下:// 创建OCR对象,需要先在Auto.js Pro的插件商店中下载官方PaddleOCR插件。
let ocr = $ocr.create({
models: 'slim', // 指定精度相对低但速度更快的模型,若不指定则为default模型,精度高一点但速度慢一点
});requestScreenCapture();for (let i = 0; i < 5; i++) {
let capture = captureScreen(); // 检测截图文字并计算检测时间,首次检测的耗时比较长
// 检测时间取决于图片大小、内容、文字数量
// 可通过调整$ocr.create()的线程、CPU模式等参数调整检测效率
let start = Date.now();
let result = ocr.detect(capture);
let end = Date.now();
console.log(result); toastLog(`第${i + 1}次检测: ${end - start}ms`);
sleep(3000);
}ocr.release();有关资料参见PaddleOCR文档
open in new window。
# OCR$ocr.create()返回的对象,用于具体的文字识别。该对象不再需要时,需要调用release()函数释放资源。
#
OCR.detect(image[, options])image {Image} 图片,要识别文字的图片。
options {object} 可选参数,选项options包括以下内容:
max {number}
识别文本的数量上限,默认为1000
detectRotation {boolean}
是否检测文字旋转,默认为false
region {Array} OCR识别区域。是一个两个或四个元素的数组。(region[0],
region[1])表示区域的左上角;region[2]*region[3]表示区域的宽高。如果只有region只有两个元素,则区域为(region[0],
region[1])到图片右下角。如果不指定region选项,则识别区域为整张图片。此选项为9.3版本新增。
返回 {Array<OCRResult>}
文字识别结果的数组,包括可信度、文本内容、文本范围等对给定图片根据给定选项进行文字识别,将文字识别的结果作为数组返回。requestScreenCapture();
sleep(1000);let ocr = $ocr.create();let capture = captureScreen();
let result = ocr.detect(capture);
// 遍历结果,打印其文本
result.forEach(item => {
console.log(item.text, item.confidence);
});
// 过滤可信度0.9以上的文本
let filtered = result.filter(item => item.confidence > 0.9);
// 模糊搜索文字内容为"Auto.js"的文本结果
let autojs = filtered.find(item => item.text.includes("编辑"));
console.log(autojs);
// 若搜索到则打印其可信度、范围和中点位置并点击
if (autojs) {
console.log(`confidence = ${autojs.confidence}, bounds = ${autojs.bounds}, center = (${autojs.bounds.centerX()}, ${autojs.bounds.centerY()})`);
autojs.clickCenter();
}ocr.release();# OCR.release()
释放OCR资源,默认会在程序退出时自动释放,但请在不使用OCR及时释放以释放资源。
# OCRResult$ocr.detect()返回的数组的元素对象,包含了文字识别的可信度、文本内容、文本范围、文本旋转度以及文本旋转度的可信度等。
#
OCRResult.confidence{number}OCR文字的可信度,范围为[0, 1],越接近1表示结果越准确、可信。
# OCRResult.text
{string}OCR识别的文字内容。
#
OCRResult.bounds{Rect
open in new window}该识别文字在图片中的范围。
#
OCRResult.rotation{number}该识别文字在图片中的旋转角度,范围为[0,
360),一般取值为0和180度。该字段仅在detect时指定detectRotation为true时有效。
#
OCRResult.rotationConfidence{number}该识别文字的旋转角度可信度,范围为[0,
1]。该字段仅在detect时指定detectRotation为true时有效。
#
OCRResult.javaObject{object}OCR识别结果的原始Java对象。在官方PaddleOCR中没有什么用,在其他官方OCR中可能可以获取附加的额外信息,比如行、字段落、词语分割。
#
OCRResult.clickCenter()返回 {boolean}
在屏幕上点击OCR结果在图片中范围的中点位置,返回是否点击成功。实际上相当于click(result.bounds.centerX(), result.bounds.centerY())。
上次编辑于: 2022/11/16
13:00:43
贡献者: hyb1996
上一页
module - 模块下一页
plugins - 插件
新内容已就绪awork_manager - 定时与任务 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: https://pro.autojs.org/docs/zh/v8/timedTasks.html
Title: work_manager - 定时与任务 | Auto.js Pro文档 • Size: 72831 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档app - 应用
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
media - 多媒体
module - 模块
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器
work_manager - 定时与任务$work_manager.addDailyTask(task)
$work_manager.addWeeklyTask(task)
$work_manager.addDisposableTask(task)
$work_manager.addIntentTask(task)
$work_manager.removeTimedTask(id)
$work_manager.removeIntentTask(id)
$work_manager.getTimedTask(id)
$work_manager.getIntentTask(id)
$work_manager.queryTimedTasks([options])
$work_manager.queryIntentTasks([options])
TimedTask.id
TimedTask.scriptPath
TimedTask.millis
TimedTask.delay
TimedTask.interval
TimedTask.loopTimes
TimedTask.actionui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
work_manager - 定时与任务2022年10月22日
此页内容
$work_manager.addDailyTask(task)$work_manager.addWeeklyTask(task)$work_manager.addDisposableTask(task)$work_manager.addIntentTask(task)$work_manager.removeTimedTask(id)$work_manager.removeIntentTask(id)$work_manager.getTimedTask(id)$work_manager.getIntentTask(id)$work_manager.queryTimedTasks([options])$work_manager.queryIntentTasks([options])TimedTask.idTimedTask.scriptPathTimedTask.millisTimedTask.delayTimedTask.intervalTimedTask.loopTimesTimedTask.action
# work_manager - 定时与任务
该模块用于管理定时任务,用于在某些时间或某些事件触发时自动运行脚本。正如Auto.js Pro内置的定时任务功能一样,打包的脚本也可以使用这些函数来创建定时任务。
添加定时任务时建议加上申请忽略电池优化的代码,防止被Android限制在后台运行。参见电池管理 - PowerManager
open in new window。if (!$power_manager.isIgnoringBatteryOptimizations()) {
console.log("未开启忽略电池优化");
$power_manager.requestIgnoreBatteryOptimizations();
}注意
由于各系统的限制,定时任务不能一定保证准时运行,请尽量将Auto.js Pro加入各种白名单和允许自启动权限。参见Don't kill my app
open in new window。# $work_manager.addDailyTask(task)task {Object} 用于描述此定时任务的配置,包括:
path {string} 需要运行的脚本的绝对路径
time {number} | {string} | {Date}
此定时任务每天运行的时间,支持时间戳、字符串和Date对象
delay {number}
任务开始前的延迟,单位毫秒,默认为0;如果延时较长,则此参数并不可靠,建议勿用此参数控制大于30s的延迟
loopTimes {number} 任务循环次数,默认为1
interval {number}
任务循环间隔,单位毫秒,默认为0;如果间隔较长,则此参数并不可靠,建议勿用此参数控制大于30s的间隔
返回 {TimedTask}新增一个每日运行一次的定时任务。其中时间参数会只保留每天的时间,忽略年月日。
例如创建一个每日下午1点14分运行的定时任务:console.log($work_manager.addDailyTask({
path: "/sdcard/脚本/test.js",
time: new Date(0, 0, 0, 13, 14, 0),
delay: 0,
loopTimes: 1,
interval: 0,
}));# $work_manager.addWeeklyTask(task)task {Object}
path {string} 需要运行的脚本的绝对路径
time {number} | {string} | {Date}
此定时任务每天运行的时间,支持时间戳、字符串和Date对象
daysOfWeek {string[]}
每周几运行,参数包括:['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']
或
['一', '二', '三', '四', '五', '六', '日']delay {number}
任务开始前的延迟,单位毫秒,默认为0;如果延时较长,则此参数并不可靠,建议勿用此参数控制大于30s的延迟
loopTimes {number} 任务循环次数,默认为1
interval {number}
任务循环间隔,单位毫秒,默认为0;如果间隔较长,则此参数并不可靠,建议勿用此参数控制大于30s的间隔
返回 {TimedTask}新增一个按星期运行的定时任务。
例如创建一个每周一周二下午1点14分运行5次的定时任务log($work_manager.addWeeklyTask({
path: "/sdcard/脚本/test.js",
// 时间戳为Mon Jun 21 2021 13:14:00 GMT+0800 (中国标准时间),事实上只有13:14:00的参数起作用
time: 1624252440000,
daysOfWeek: ['一', '二'],
delay: 0,
loopTimes: 5,
interval: 10
}));# $work_manager.addDisposableTask(task)
task {Object}
path {string} 需要运行的脚本的绝对路径
time {number} | {string} | {Date}
此定时任务开始运行的时间,支持时间戳、字符串和Date对象(9.3以上版本可以用这个字段代替date)
date {number} | {string} | {Date}
同time,由于一个失误,原本这个字段应该是time(9.2以之前版本需要用这个字段指定时间)
delay {number}
任务开始前的延迟,单位毫秒,默认为0;如果延时较长,则此参数并不可靠,建议勿用此参数控制大于30s的延迟
loopTimes {number} 任务循环次数,默认为1
interval {number}
任务循环间隔,单位毫秒,默认为0;如果间隔较长,则此参数并不可靠,建议勿用此参数控制大于30s的间隔
返回 {TimedTask}此函数会新增一个一次性的定时任务,任务在执行一次后将在定时任务中自动删除。
例如创建一个2021年5月21日13点14分运行的定时任务。log($work_manager.addDisposableTask({
path: "/sdcard/脚本/test.js",
date: new Date(2021, 5, 21, 13, 14, 0),
}));
# $work_manager.addIntentTask(task)task {Object}
path {string} 需要运行的脚本的绝对路径
action {string} 需要监听的事件的广播的Action名称
delay {number}
任务开始前的延迟,单位毫秒,默认为0;如果延时较长,则此参数并不可靠,建议勿用此参数控制大于30s的延迟
loopTimes {number} 任务循环次数,默认为1
interval {number}
任务循环间隔,单位毫秒,默认为0;如果间隔较长,则此参数并不可靠,建议勿用此参数控制大于30s的间隔
返回 {TimedTask}新增一个广播定时任务,会在特定事件(广播)发生时运行。
其中最关键的参数是广播事件的Action。系统在发生特定事件(比如电量变化)时会发出特定Action的广播,参见广播Action。
例如创建一个在电量发生变化时运行脚本的定时任务:log($work_manager.addIntentTask({
path: "/sdcard/脚本/test.js",
action: Intent.ACTION_BATTERY_CHANGED,
}));
# $work_manager.removeTimedTask(id)id {number} 定时任务的id
返回 {boolean} 是否删除成功通过id删除按时间运行的定时任务。
# $work_manager.removeIntentTask(id)id {number} 定时任务的id
返回 {boolean} 是否删除成功通过id删除按事件运行的定时任务。
# $work_manager.getTimedTask(id)id {number} 定时任务的id
返回 {TimedTask}通过id获取按时间运行的定时任务。
# $work_manager.getIntentTask(id)id {number}定时任务的id
返回 {TimedTask}通过id获取按事件运行的定时任务。
例如:// 添加一个手机电量变化就触发的定时任务
let id = $work_manager.addIntentTask({
path: "/sdcard/脚本/test.js",
action: Intent.ACTION_BATTERY_CHANGED,
delay: 0,
loopTimes: 1,
interval: 0
});
// 通过id找到该定时任务
let task = $work_manager.getIntentTask(id.id);
// 打印该定时任务所运行脚本的路径
log(task.scriptPath);
#
$work_manager.queryTimedTasks([options])options {Object} 查询参数,可选。不填时,查询到所有按时间运行的定时任务
path {string} 定时任务脚本的路径
返回 {TimedTask[]} 查找到的定时任务数组通过脚本路径查找按时间运行的定时任务,或者查询所有按时间运行的定时任务。
例如:let jsPath = "/sdcard/脚本/test.js";
// 添加一个每周日下午1点13分运行的定时任务,循环运行5次脚本,间隔5000毫秒
let task = $work_manager.addWeeklyTask({
path: jsPath,
time: 1624252440000,
daysOfWeek: ['sunday'],
delay: 0,
loopTimes: 5,
interval: 5000
});
// 按脚本路径查找定时任务
let tasks = $work_manager.queryTimedTasks({
path: jsPath
});
// 删除查找到的所有定时任务
tasks.forEach(t => {
console.log("删除: ", t);
log($work_manager.removeTimedTask(t.id));
});#
$work_manager.queryIntentTasks([options])options {Object} 查询参数,可选;不填时,查询到所有按事件运行的定时任务
path {string} 定时任务脚本的路径
action {string} 广播名称
返回 {TimedTask[]} 查找到的定时任务数组通过脚本路径或监听广播查找按广播运行的定时任务,或者查询所有按广播运行的定时任务。
例如://添加一个手机电量变化就触发的定时任务
let task = $work_manager.addIntentTask({
path: "/sdcard/脚本/test.js",
action: Intent.ACTION_BATTERY_CHANGED,
delay: 0,
loopTimes: 1,
interval: 0
});
// 查找所有的触发事件定时任务
let tasks = $work_manager.queryIntentTasks();
// 打印所有查找到的定时任务的触发事件
tasks.forEach(t => {
console.log(t.action);
});
# TimedTask
表示一个定时任务对象,包含了此定时任务的基本信息。
#
TimedTask.id{number}此定时任务的唯一id,用于查找定时任务。
# TimedTask.scriptPath{string}此定时任务的所执行脚本的路径。
# TimedTask.millis{number}此定时任务的执行时间的时间戳,单位为毫秒。
# TimedTask.delay{number}此定时任务所设置的延迟,
# TimedTask.interval{number}此定时任务循环的间隔。
# TimedTask.loopTimes{number}此定时任务循环的次数。
# TimedTask.action{string}此定时任务的触发事件(只有广播定时任务才有该参数)。
# 广播Action
可以在Android文档Intent: Action
open in new
window中找到大多数Android系统自带的Intent
Action;一些系统组件也会自定义自己的Action,比如网络连接变化时触发的Action是ConnectivityManager.CONNECTIVITY_ACTION(使用时需要导入ConnectivityManager)。这些Action通常附带一些额外参数,可以通过$engines.myEngine().execArgv.intent获取广播的参数,参见广播参数。
以下列出一些常见的广播Action:广播名
说明
org.autojs.autojs.action.startup
Auto.js 启动时
Intent.ACTION_BOOT_COMPLETED
开机时
Intent.ACTION_SCREEN_OFF
熄屏时
Intent.ACTION_SCREEN_ON
亮屏时
Intent.ACTION_USER_PRESENT
屏幕解锁时
Intent.ACTION_BATTERY_CHANGED
电量变化时
Intent.ACTION_POWER_CONNECTED
电源连接时
Intent.ACTION_POWER_DISCONNECTED
电源断开时
ConnectivityManager.CONNECTIVITY_ACTION
网络连接变化时
Intent.ACTION_PACKAGE_ADDED
新应用安装时
Intent.ACTION_PACKAGE_REMOVED
应用卸载时
Intent.ACTION_PACKAGE_REPLACED
应用更新时
Intent.ACTION_HEADSET_PLUG
耳机拔插时
Intent.ACTION_CONFIGURATION_CHANGED
某些设置(屏幕方向、地区等)更改时
Intent.ACTION_TIME_TICK
每分钟一次示例:// 添加一个Auto.js启动时触发的定时任务(在打包中软件也可以使用)
console.log($work_manager.addIntentTask({
path: "/sdcard/脚本/test.js",
action: "org.autojs.autojs.action.startup",
}));// 添加一个网络状态变化时触发的定时任务
let ConnectivityManager = android.net.ConnectivityManager;
console.log($work_manager.addIntentTask({
path: "/sdcard/脚本/conn_test.js",
action: ConnectivityManager.CONNECTIVITY_ACTION,
}));
# 广播参数 按广播执行的定时任务被执行时,我们可以通过$engines.myEngine().execArgv.intent获取到intent对象,再通过Android文档查阅intent对象的参数,从而获取这些参数。
例如电量变化的广播中,查询文档BatteryManager
open in new
window可以知道通过EXTRA_LEVEL参数获取具体电量。
// 因电量变化而执行的定时任务脚本
let intent = $engines.myEngine().execArgv.intent;
if (!intent) {
console.log("请设置定时任务 - 电量变化时来运行此脚本");
exit();
}
let BatteryManager = android.os.BatteryManager;
let level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
console.log("电量为", level);# Bug
截止8.7.1版本,Auto.js Pro可能在触发定时任务时执行两次,将在8.7的后续版本中修复。
上次编辑于:
贡献者: hyb1996
上一页
timers - 定时器
timers - 定时器 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: https://pro.autojs.org/docs/zh/v8/timers.html
Title: timers - 定时器 | Auto.js Pro文档 • Size: 32923 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档app - 应用
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
media - 多媒体
module - 模块
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器setInterval(callback, delay[,
...args])
setTimeout(callback, delay[,
...args])
setImmediate(callback[,
...args])
clearInterval(id)
clearTimeout(id)
clearImmediate(id)
work_manager - 定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
timers - 定时器2022年10月22日
此页内容
setInterval(callback, delay[,
...args])
setTimeout(callback, delay[,
...args])
setImmediate(callback[,
...args])
clearInterval(id)clearTimeout(id)clearImmediate(id)
# timers
- 定时器Stability: 2 - Stabletimers 模块暴露了一个全局的 API,用于在某个未来时间段调用调度函数。 因为定时器函数是全局的,所以使用该 API 无需调用 timers.
Auto.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API,除了它使用了一个不同的内部实现,它是基于 Android
Looper-Handler消息循环机制构建的。其实现机制与Node.js比较相似。
例如,要在5秒后发出消息"hello":setTimeout(function(){
toast("hello")
}, 5000);需要注意的是,这些定时器仍然是单线程的。如果脚本主体有耗时操作或死循环,则设定的定时器不能被及时执行,例如:setTimeout(function(){
//这里的语句会在15秒后执行而不是5秒后
toast("hello")
}, 5000);
//暂停10秒
sleep(10000);
再如:setTimeout(function(){
//这里的语句永远不会被执行
toast("hello")
}, 5000);
//死循环
while(true);
# setInterval(callback, delay[, ...args])
callback {Function} 当定时器到点时要调用的函数。
delay {number} 调用 callback 之前要等待的毫秒数。
...args {any} 当调用 callback 时要传入的可选参数。预定每隔 delay 毫秒重复执行的 callback。 返回一个用于 clearInterval() 的 id。
当 delay 小于 0 时,delay 会被设为 0。
# setTimeout(callback, delay[, ...args])
callback {Function} 当定时器到点时要调用的函数。
delay {number} 调用 callback 之前要等待的毫秒数。
...args {any} 当调用 callback 时要传入的可选参数。预定在 delay 毫秒之后执行的单次 callback。 返回一个用于 clearTimeout() 的 id。
callback 可能不会精确地在 delay 毫秒被调用。 Auto.js 不能保证回调被触发的确切时间,也不能保证它们的顺序。 回调会在尽可能接近所指定的时间上调用。
当 delay 小于 0 时,delay 会被设为 0。
# setImmediate(callback[, ...args])callback {Function} 在Looper循环的当前回合结束时要调用的函数。
...args {any} 当调用 callback 时要传入的可选参数。预定立即执行的 callback,它是在 I/O 事件的回调之后被触发。 返回一个用于 clearImmediate() 的 id。
当多次调用 setImmediate() 时,callback 函数会按照它们被创建的顺序依次执行。 每次事件循环迭代都会处理整个回调队列。
如果一个立即定时器是被一个正在执行的回调排入队列的,则该定时器直到下一次事件循环迭代才会被触发。
setImmediate()、setInterval() 和 setTimeout() 方法每次都会返回表示预定的计时器的id。 它们可用于取消定时器并防止触发。
# clearInterval(id)id {number} 一个 setInterval() 返回的 id。取消一个由 setInterval() 创建的循环定时任务。
例如://每5秒就发出一次hello
var id = setInterval(function(){
toast("hello");
}, 5000);
//1分钟后取消循环
setTimeout(function(){
clearInterval(id);
}, 60 * 1000);
# clearTimeout(id)id {number} 一个 setTimeout() 返回的 id。取消一个由 setTimeout() 创建的定时任务。
# clearImmediate(id)id {number} 一个 setImmediate() 返回的 id。取消一个由 setImmediate() 创建的 Immediate 对象。
上次编辑于:
贡献者: hyb1996
上一页
threads - 多线程下一页
work_manager - 定时与任务
阅读须知 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: https://pro.autojs.org/docs/zh/v8/
Title: 阅读须知 | Auto.js Pro文档 • Size: 24421 • Last Modified:
Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知input([i, ]text)API文档app - 应用
app - 应用
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
media - 多媒体
module - 模块
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器
work_manager - 定时与任务ui
- 用户界面ui入门介绍
基础布局与控件
其他布局与控件
api文档
自定义控件
使用Web编写界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
阅读须知2022年10月22日
此页内容
input([i, ]text)
# 阅读须知
本文档为第一代API文档,也即Auto.js
Pro的默认引擎(Rhino犀牛引擎)的文档。如果你从来没有听说过什么第一代API,犀牛引擎,Node.js引擎,那么说明你来对文档了。查看基于Node.js的API(第二代API)的文档请在菜单栏切换第二代API文档。# API稳定性
由于Auto.js Pro处于活跃的更新和开发状态,API可能随时有变动,我们用Stability来标记模块、函数的稳定性。这些标记包括:Stability: 0 - Deprecated弃用的函数、模块或特性,在未来的更新中将很快会被移除或更改。应该在脚本中移除对这些函数的使用,以免后续出现意料之外的问题。
Stability: 1 - Experimental实验性的函数、模块或特性,在未来的更新中可能会更改或移除。应该谨慎使用这些函数或模块,或者仅用作临时或试验用途。
Stability: 2 - Stable稳定的函数、模块或特性,在未来的更新中这些模块已有的函数一般不会被更改,会保证后向兼容性。# 如何阅读本文档
先看一个例子,下面是基于控件的操作模拟的章节中input函数的部分说明。
#
input([i, ]text)i {number} 表示要输入的为第i + 1个输入框
text {string} 要输入的文本
input表示函数名,括号内的[i, ]text为函数的参数。下面是参数列表,"number"表示参数i的类型为数值,"string"表示参数text的类型为字符串。
例如input(1, "啦啦啦"),执行这个语句会在屏幕上的第2个输入框处输入"啦啦啦"。
方括号[ ]表示参数为可选参数。也就是说,可以省略i直接调用input。例如input("嘿嘿嘿"),按照文档,这个语句会在屏幕上所有输入框输入"嘿嘿嘿"。
调用有可选参数的函数时请不要写上方括号。
上次编辑于:
贡献者: hyb1996
zip - 压缩与解压 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: https://pro.autojs.org/docs/zh/v8/zip.html
Title: zip - 压缩与解压 | Auto.js Pro文档 • Size: 71673 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档app - 应用
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
media - 多媒体
module - 模块
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器
work_manager - 定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压$zip.zipDir(dir, dest[,
options])
$zip.zipFile(file, dest[,
options])
$zip.zipFiles(fileList, dest[,
options])
$zip.unzip(zipFile, dest[,
options])
$zip.open(file)
ZipFile.getPath()
ZipFile.isValidZipFile()
ZipFile.setPassword(password)
ZipFile.isEncrypted()
ZipFile.addFile(file[, options])
ZipFile.addFiles(fileList,
options)
ZipFile.addFolder(folder[,
options])
ZipFile.removeFile(file)
ZipFile.extractFile(file,
dest[, options, newFileName])
ZipFile.extractAll(dest{,
options})
ZipFile.getFileHeader(file)
ZipFile.getFileHeaders()进阶和Java交互
zip - 压缩与解压2022年10月22日
此页内容
$zip.zipDir(dir, dest[,
options])
$zip.zipFile(file, dest[,
options])
$zip.zipFiles(fileList, dest[,
options])
$zip.unzip(zipFile, dest[,
options])
$zip.open(file)ZipFile.getPath()ZipFile.isValidZipFile()ZipFile.setPassword(password)ZipFile.isEncrypted()ZipFile.addFile(file[,
options])
ZipFile.addFiles(fileList,
options)
ZipFile.addFolder(folder[,
options])
ZipFile.removeFile(file)ZipFile.extractFile(file, dest[,
options, newFileName])
ZipFile.extractAll(dest{,
options})
ZipFile.getFileHeader(file)ZipFile.getFileHeaders()
# zip -
压缩与解压Stability: 2 - StableZip模块用于处理文件的压缩和解压,并支持加密压缩。zip功能来自zip4j
open in new window,可阅读相关文档获取更多信息。# $zip.zipDir(dir, dest[, options])dir {string} 需要压缩的文件夹路径,如果文件夹下有子文件夹均会一并压缩
dest {string} 压缩后的压缩包存放路径
options {object} 可选参数,选项option包括以下内容,完整的选项参见压缩选项:
password {string}
加密压缩的密码。如果设置密码但不设置加密方法,则加密方法默认为AES
compressionMethod {string}
压缩方式,COMP_STORE为仅打包不压缩,
COMP_DEFLATE为压缩(默认)
encryptionMethod {string}
加密方法,ENC_NO_ENCRYPTION为不加密(默认),ENC_METHOD_STANDARD为标准机密,
ENC_METHOD_AES为AES加密
compressionLevel {number}
压缩级别,0~9,0为不压缩,9为最好压缩(速度较慢)。在8.7以前版本,默认为0不压缩;在8.7以后,该值默认为5(正常压缩)
aesKeyStrength {string}
AES加密强度,包括AES_STRENGTH_128,AES_STRENGTH_192,AES_STRENGTH_256readHiddenFiles {boolean}
压缩文件夹时是否包含隐藏文件。如果为true,则在将文件夹添加到zip时将包含隐藏文件
includeRootFolder {boolean}
设置标志以指示添加文件的父文件夹是否将包含在ZIP中。如果为true,则添加文件的父文件夹将包含在ZIP中。默认true
rootFolderInZip {string}
设置压缩包首目录的文件夹名称,如果没有首目录,则创建这个首目录压缩文件夹下所有文件/文件夹,生成到目标路径dest。
一个简单的压缩文件夹例子。// 需压缩文件路径
let dir = "./zipExample2/";
// 压缩后文件存放路径
if (!$files.exists(dir)) {
// 文件夹不存在 创建文件夹
$files.create(dir);
}
// 创建一个文件,自己可多放几个文件或文件夹运行看效果
$files.create($files.join(dir, "test.js"));
// 压缩后文件存放路径
let zipFile = $files.join(dir, "未加密压缩.zip");
// 删除同名文件
$files.remove(zipFile);
// 压缩
$zip.zipDir(dir, zipFile);
log("压缩完成,压缩包路径:" + zipFile);
加密压缩例子// 需压缩文件路径
let dir = "./zipExample2/";
// 压缩后文件存放路径
if (!$files.exists(dir)) {
// 文件夹不存在 创建文件夹
$files.create(dir);
}
// 创建一个文件,自己可多放几个文件或文件夹运行看效果
$files.create($files.join(dir, "test.js"));
// 压缩包存放路径
let encryptedZipFile = $files.join(dir, "加密压缩.zip");
$files.remove(encryptedZipFile); // 删除同名文件
// 压缩
$zip.zipDir(dir, encryptedZipFile, {
password: "Auto.js Pro" // 压缩密码
compressionLevel: 5, // 压缩级别
aesKeyStrength: 'AES_STRENGTH_256', // 加密方法
readHiddenFiles: false, // 隐藏文件不添加进压缩包
includeRootFolder: false, //不添加文件夹父目录进压缩包
rootFolderInZip: "测试" // 为压缩包添加一个父目录
});
log("加密压缩完成,压缩包路径:" + encryptedZipFile);
# $zip.zipFile(file, dest[, options])file {string} 需要压缩的单文件路径。
dest {string} 压缩后的压缩包存放路径
options {object} 选项参见参见压缩选项
压缩单文件file到路径dest。
let path = "./zipExample/test.js";
if (!$files.exists(path)) {
$files.create(path);
}
let zipFilePath = "./zipExample/test.zip";
$zip.zipFile(path, zipFilePath);
log("单文件压缩完成,压缩包路径:" + zipFilePath);# $zip.zipFiles(fileList, dest[,
options])fileList {string[]} 需压缩的多个文件路径的数组
dest {string} 压缩目标路径
options {object} 选项参见压缩选项
压缩多个文件fileList到路径dest。fileList中不能包含文件夹。
let dir = "./zipExample3/";
if (!$files.exists(dir)) {
$files.create(dir);
}
let fileList = ["file1.js", "file2.js", "file3.js"].map(p => $files.join(dir, p));
fileList.forEach(file => {
$files.create(file);
});let zipMultiFile = $files.join(dir, "多文件压缩.zip");
$files.remove(zipMultiFile); // 删除同名文件
$zip.zipFiles(fileList, zipMultiFile); // 压缩
log("多文件压缩完成,压缩包路径:" + zipMultiFile);# $zip.unzip(zipFile, dest[, options])zipFile {string} 需解压的压缩包文件路径
dest {string} 解压后的文件夹目录
options {object} 解压选项,可选,参见解压选项
解压zip文件。如果文件夹dest不存在则创建该文件夹并将内容解压到里面;如果dest已经存在,则在dest下面创建一个和zipFile文件同名的文件夹,并将内容解压到里面。
// 准备一个加密的压缩包
let dir = "./zipExample2/";
if (!$files.exists(dir)) {
$files.create(dir);
}
// 压缩后文件存放路径
let encryptedZipFile = $files.join(dir, "加密压缩.zip");
$files.remove(encryptedZipFile); // 删除同名文件
// 压缩
$zip.zipDir(dir, encryptedZipFile, {
password: "Auto.js Pro" // 压缩密码
});$zip.unzip(encryptedZipFile, './zipExample5', {
password: 'Auto.js Pro' // 解压密码
});
log("加密zip解压成功,解压路径:" + "./zipExample5/");#
$zip.open(file)file {string} 压缩包文件路径
返回 {ZipFile} ZipFile对象打开一个zip文件,返回ZipFile对象,可对该对象进行进一步的zip操作。
# ZipFile$zip.open()返回的对象,用于在压缩包中增删文件、获取文件头信息、解压等。
# ZipFile.getPath()返回 {string} 返回路径获取当前压缩包的路径。let path = "./test.zip";
let zipFile = $zip.open(path);
log(zipFile.getPath();
// 输出路径 "./test.zip"
# ZipFile.isValidZipFile()返回 {boolean} 是否是有效压缩包获取当前压缩包是否是一个有效的压缩包。
如果选择的路径不是一个压缩包或该文件不存在,均返回false。
# ZipFile.setPassword(password)password {string} 设置密码如果文件是一个加密的压缩包,必须用此函数设置正确的解压密码,才能解压出加密的文件。
未设置密码尝试解压加密的压缩包将抛出异常,选择的压缩包文件不存在使用本函数将抛出ZipException。
# ZipFile.isEncrypted()返回 {boolean} 是否压缩包加密获取当前压缩包是否是加密压缩包。
# ZipFile.addFile(file[, options])file {string} 本地文件路径
options {object} 压缩选项,可选,参见压缩选项在压缩包中添加指定文件。let zipFile = $zip.open("./app.apk");
zipFile.addFile(file);
# ZipFile.addFiles(fileList, options)
fileList {string[]} 要添加的本地文件路径的数组
options {object} 压缩选项,可选,参见压缩选项在压缩包中添加多个文件。
# ZipFile.addFolder(folder[, options])
folder {string} 文件夹路径
options {object} 压缩选项,可选,参见压缩选项在压缩包中添加指定文件夹。注意
注意不要添加压缩包的父目录,否则可能造成循环无限添加!一个备份脚本的简单例子:let zipFile = "/sdcard/scripts.zip";
//指定压缩包文件
let zip = $zip.open(zipFile);
log("开始备份,取决与你的脚本数量");
// 向压缩包添加当前文件夹
zip.addFolder("./");
log("备份完成,压缩包路径为:" + zipFile);# ZipFile.removeFile(file)file {string} 要删除的文件删除zip文件内的指定文件。此方法首先找到文件头,然后删除文件;如果文件不存在,则此方法引发异常。
如果zip文件是分割后的zip文件,则此方法会抛出异常,原因是zip规范不允许更新拆分的zip档案。let zipFile = $zip.open("./app.apk");
zipFile.removeFile("res/drawable/logo.png");
#
ZipFile.extractFile(file, dest[, options, newFileName])file {string} 要解压的文件
dest {string} 解压文件的目标路径
options {Object} 解压选项,可选。参见解压选项
newFileName {string} 解压后文件的新名字,可选.从压缩包文件中提取特定文件到目标路径。如果目标路径无效,则此方法将引发异常。
# ZipFile.extractAll(dest{, options})dest {string} 解压路径
options {Object} 解压选项,可选。参见解压选项解压所有文件到目标路径dest。let zip = $zip.open("./test.zip");
zip.addFiles(["./test.js", "./test.txt"]);
zip.extractAll("./test");# ZipFile.getFileHeader(file)file {string} 压缩包内指定文件路径
返回 {FileHeader
open in new window}获取压缩包内指定文件的文件头信息。文件头信息包括校验值,是否加密,注释等。
# ZipFile.getFileHeaders()返回 {Array<FileHeader
open in new window>}获取压缩包内所有文件的文件头信息。文件头信息包括校验值,是否加密,注释等。
# 压缩选项
options {object} 包括:aesKeyStrength {string}
AES加密强度,包括AES_STRENGTH_128,AES_STRENGTH_192,AES_STRENGTH_256compressionLevel {number}
压缩级别,0~9,0为不压缩,9为最好压缩(速度较慢)。在8.7以前版本,默认为0不压缩;在8.7以后,该值默认为5(正常压缩)
compressionMethod {string}
压缩方式,COMP_STORE为仅打包不压缩,
COMP_DEFLATE为压缩(默认)
defaultFolderPath {string} 压缩或添加文件时,指定文件在压缩包的默认文件夹位置
encryptionMethod {string}
加密方法,ENC_NO_ENCRYPTION为不加密(默认),ENC_METHOD_STANDARD为标准机密,
ENC_METHOD_AES为AES加密
fileNameInZip {string} 压缩或添加文件时,指定文件在压缩包中的路径、名称
includeRootFolder {boolean}
设置标志以指示添加文件的父文件夹是否将包含在ZIP中。如果为true,则添加文件的父文件夹将包含在ZIP中。默认true
password {string} 加密压缩的密码。如果设置密码但不设置加密方法,则加密方法默认为AES
readHiddenFiles {boolean}
压缩文件夹时是否包含隐藏文件。如果为true,则在将文件夹添加到zip时将包含隐藏文件
rootFolderInZip {string}
设置压缩包首目录的文件夹名称,如果没有首目录,则创建这个首目录# 解压选项
options {object} 包括:ignoreAttribute {string[]} 解压文件写入磁盘时,要忽略的文件属性,包括:
alls 所有属性
archive 压缩包属性
dateTime 时间
hidden 是否隐藏
readOnly 是否只读
system 是否为系统文件上次编辑于:
贡献者: hyb1996
上一页
WebSocketautomator与其他函数 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: ../../v8/automator/api.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档
自动化 - 控件操作入门介绍
选择器
控件和控件集合
automator与其他函数auto([mode])
auto.waitFor()
auto.setMode(mode)
auto.setFlags(flags)
auto.service
auto.windows
auto.root
auto.rootInActiveWindow
auto.setWindowFilter(filter)
auto.windowRoots
click(text[, i])
click(left, top, bottom,
right)
longClick(text[, i]))
scrollUp([i])
scrollDown([i])
setText([i, ]text)
input([i, ]text)
automator.takeScreenshot()
automator.switchToInputMethod(packageName)
automator.headsetHook()
auto.clearCache()
RectRect.left
Rect.right
Rect.top
Rect.bottom
Rect.centerX()
Rect.centerY()
Rect.width()
Rect.height()
Rect.contains(r)
Rect.intersect(r)自动化 - 坐标操作
app - 应用
base64
colors - 颜色
canvas - 画布
console -
控制台
crypto -
加解密与消息摘要
debug - 调试工具
device - 设备
dialogs -
对话框
engines -
脚本引擎
events -
事件与监听
floaty - 悬浮窗
files - 文件系统
globals -
全局变量与函数
http -
HTTP网络请求
images -
图片处理
keys - 按键模拟
media - 多媒体
module - 模块
ocr - 文字识别
plugins - 插件
power_manager -
电源管理
sensors -
传感器
shell -
Shell命令
storages -
本地存储
settings -
设置
threads -
多线程
timers - 定时器
work_manager -
定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
入门介绍
automator与其他函数automator与其他函数2022年10月27日
此页内容
auto([mode])
auto.waitFor()
auto.setMode(mode)auto.setFlags(flags)auto.service
auto.windows
auto.root
auto.rootInActiveWindowauto.setWindowFilter(filter)auto.windowRoots
click(text[, i])
click(left, top, bottom,
right)
longClick(text[, i]))scrollUp([i])
scrollDown([i])
setText([i, ]text)input([i, ]text)
automator.takeScreenshot()automator.switchToInputMethod(packageName)automator.headsetHook()auto.clearCache()RectRect.left
Rect.right
Rect.top
Rect.bottom
Rect.centerX()
Rect.centerY()
Rect.width()
Rect.height()
Rect.contains(r)Rect.intersect(r)# automator与其他函数
#
auto([mode])mode {string} 模式检查无障碍服务是否已经启用,如果没有启用则抛出异常并跳转到无障碍服务启用界面;同时设置无障碍模式为mode。mode的可选值为:fast
快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
normal 正常模式,默认。如果不加mode参数,则为正常模式。 建议使用auto.waitFor()和auto.setMode()代替该函数,因为auto()函数如果无障碍服务未启动会停止脚本;而auto.waitFor()则会在在无障碍服务启动后继续运行。
示例:auto("fast");示例2:auto();#
auto.waitFor()
检查无障碍服务是否已经启用,如果没有启用则跳转到无障碍服务启用界面,并等待无障碍服务启动;当无障碍服务启动后脚本会继续运行。 因为该函数是阻塞的,因此除非是有协程特性,否则不能在ui模式下运行该函数,建议在ui模式下使用auto()函数。
#
auto.setMode(mode)mode {string} 模式设置无障碍模式为mode。mode的可选值为:fast
快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件查看和操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
normal 正常模式,默认。#
auto.setFlags(flags)
[v4.1.0新增]flags {string} | {Array} 一些标志,来启用和禁用某些特性,包括:
findOnUiThread
使用该特性后,选择器搜索时会在主进程进行。该特性用于解决线程安全问题导致的次生问题,不过目前貌似已知问题并不是线程安全问题。
useUsageStats
使用该特性后,将会以"使用情况统计"服务的结果来检测当前正在运行的应用包名(需要授予"查看使用情况统计"权限)。如果觉得currentPackage()返回的结果不太准确,可以尝试该特性。
useShell
使用该特性后,将使用shell命令获取当前正在运行的应用的包名、活动名称,但是需要root权限。启用有关automator的一些特性。例如:auto.setFlags(["findOnUiThread", "useShell"]);#
auto.service
[v4.1.0新增]{AccessibilityService
open in new window}获取无障碍服务。如果无障碍服务没有启动,则返回null。
参见AccessibilityService
open in new window。
#
auto.windows
[v4.1.0新增]{Array}当前所有窗口(AccessibilityWindowInfo
open in new
window)的数组,可能包括状态栏、输入法、当前应用窗口,弹出窗口、悬浮窗、分屏应用窗口等。可以分别获取每个窗口的布局信息。
该函数需要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
open in new window),返回值为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以下,则始终返回当前活跃的窗口的布局根元素的数组。
# automator
automator提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。部分函数可以直接作为全局函数使用。
#
click(text[, i])text {string} 要点击的文本
i {number} 如果相同的文本在屏幕中出现多次,则i表示要点击第几个文本, i从0开始计算返回是否点击成功。当屏幕中并未包含该文本,或者该文本所在区域不能点击时返回false,否则返回true。
该函数可以点击大部分包含文字的按钮。例如微信主界面下方的"微信", "联系人", "发现", "我"的按钮。 通常与while同时使用以便点击按钮直至成功。例如:while(!click("扫一扫"));当不指定参数i时则会尝试点击屏幕上出现的所有文字text并返回是否全部点击成功。
i是从0开始计算的, 也就是,
click("啦啦啦", 0)表示点击屏幕上第一个"啦啦啦",
click("啦啦啦", 1)表示点击屏幕上第二个"啦啦啦"。
文本所在区域指的是,从文本处向其父视图寻找,直至发现一个可点击的部件为止。# click(left, top, bottom, right)left {number} 要点击的长方形区域左边与屏幕左边的像素距离
top {number} 要点击的长方形区域上边与屏幕上边的像素距离
bottom {number} 要点击的长方形区域下边与屏幕下边的像素距离
right {number} 要点击的长方形区域右边与屏幕右边的像素距离注意,该函数一般只用于录制的脚本中使用,在自己写的代码中使用该函数一般不要使用该函数。
点击在指定区域的控件。当屏幕中并未包含与该区域严格匹配的区域,或者该区域不能点击时返回false,否则返回true。 有些按钮或者部件是图标而不是文字(例如发送朋友圈的照相机图标以及QQ下方的消息、联系人、动态图标),这时不能通过click(text, i)来点击,可以通过描述图标所在的区域来点击。left,
bottom, top, right描述的就是点击的区域。
至于要定位点击的区域,可以在悬浮窗使用布局分析工具查看控件的bounds属性。
通过无障碍服务录制脚本会生成该语句。
#
longClick(text[, i]))text {string} 要长按的文本
i {number} 如果相同的文本在屏幕中出现多次,则i表示要长按第几个文本, i从0开始计算返回是否点击成功。当屏幕中并未包含该文本,或者该文本所在区域不能点击时返回false,否则返回true。
当不指定参数i时则会尝试点击屏幕上出现的所有文字text并返回是否全部长按成功。
#
scrollUp([i])i {number} 要滑动的控件序号找到第i+1个可滑动控件上滑或左滑。返回是否操作成功。屏幕上没有可滑动的控件时返回false。 另外不加参数时scrollUp()会寻找面积最大的可滑动的控件上滑或左滑,例如微信消息列表等。
参数为一个整数i时会找到第i +
1个可滑动控件滑动。例如scrollUp(0)为滑动第一个可滑动控件。
#
scrollDown([i])i {number} 要滑动的控件序号找到第i+1个可滑动控件下滑或右滑。返回是否操作成功。屏幕上没有可滑动的控件时返回false。 另外不加参数时scrollUp()会寻找面积最大的可滑动的控件下滑或右滑。
参数为一个整数i时会找到第i +
1个可滑动控件滑动。例如scrollUp(0)为滑动第一个可滑动控件。
#
setText([i, ]text)i {number} 表示要输入的为第i + 1个输入框
text {string} 要输入的文本返回是否输入成功。当找不到对应的文本框时返回false。 不加参数i则会把所有输入框的文本都置为text。例如setText("测试")。
这里的输入文本的意思是,把输入框的文本置为text,而不是在原来的文本上追加。
#
input([i, ]text)i {number} 表示要输入的为第i + 1个输入框
text {string} 要输入的文本返回是否输入成功。当找不到对应的文本框时返回false。 不加参数i则会把所有输入框的文本追加内容text。例如input("测试")。
# automator.takeScreenshot()
[Pro 8.8.0新增
open in new window]]返回 {Image}使用无障碍权限截图,返回一个Image对象。
相比起images模块申请截图权限截图,该函数不需要额外权限,但是有以下限制:截图频率限制。系统限制截图最多一秒一次,否则抛出异常
需要Android 11及以上版本
$auto.waitFor();
let capture = $automator.takeScreenshot();
$images.save(capture, "../capture.png");# automator.switchToInputMethod(packageName)
[Pro 8.8.0新增
open in new window]packageName {string} 输入法包名
返回 {boolean}切换到指定输入法,返回是否成功。失败的情况有以下可能:指定包名的输入法不存在或未启用
系统返回切换输入法失败此函数需要Android 11及以上。// 切换到搜狗输入法
$automator.switchToInputMethod('com.sohu.inputmethod.sogou')
#
automator.headsetHook()
[Pro 8.8.0新增
open in new window]返回 {boolean}模拟耳机键,返回是否执行成功。用于挂断、接听电话,播放、暂停音乐。
#
auto.clearCache()
[v9.0.14新增] 清空无障碍缓存。当屏幕上的控件已经出现但是选择器始终无法找到该控件,可能是缓存没有刷新,此时可调用auto.clearCache()来清空控件缓存。另外,从9.0版本开始,findOne()等函数在长时间找不到时也会自动清空缓存。
# RectUiObject.bounds(),
UiObject.boundsInParent()返回的对象。表示一个长方形(范围)。
# Rect.left
{number}长方形左边界的x坐标、
# Rect.right
{number}长方形右边界的x坐标、
# Rect.top
{number}长方形上边界的y坐标、
#
Rect.bottom{number}长方形下边界的y坐标、
#
Rect.centerX()返回 {number}长方形中点x坐标。
#
Rect.centerY()返回 {number}长方形中点y坐标。
#
Rect.width()返回 {number}长方形宽度。通常可以作为控件宽度。
#
Rect.height()返回 {number}长方形高度。通常可以作为控件高度。
#
Rect.contains(r)r {Rect}返回是否包含另一个长方形r。包含指的是,长方形r在该长方形的里面(包含边界重叠的情况)。
#
Rect.intersect(r)r {Rect}返回是否和另一个长方形相交。
上次编辑于: 2022/10/27
13:15:37
贡献者: hyb1996
上一页
控件和控件集合新内容已就绪a
入门介绍 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: ocr.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档
自动化 -
控件操作入门介绍
选择器
控件和控件集合
automator与其他函数自动化 -
坐标操作
app -
应用
base64
colors - 颜色
canvas - 画布
console - 控制台
crypto - 加解密与消息摘要
debug - 调试工具
device - 设备
dialogs - 对话框
engines - 脚本引擎
events - 事件与监听
floaty - 悬浮窗
files - 文件系统
globals - 全局变量与函数
http - HTTP网络请求
images - 图片处理
keys
- 按键模拟
media
- 多媒体
module - 模块
ocr -
文字识别
plugins - 插件
power_manager - 电源管理
sensors - 传感器
shell - Shell命令
storages - 本地存储
settings - 设置
threads - 多线程
timers - 定时器
work_manager - 定时与任务ui -
用户界面util -
工具
WebSocket
zip -
压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
入门介绍入门介绍2022年10月27日# 入门介绍
基于控件的操作指的是选择屏幕上的控件,获取其信息或对其进行操作。对于一般软件而言,基于控件的操作对不同机型有很好的兼容性;但是对于游戏而言,由于游戏界面并不是由控件构成,无法采用本章节的方法,也无法使用本章节的函数。有关游戏脚本的编写,请参考自动化 - 坐标操作。
基于控件的操作依赖于无障碍服务,因此最好在脚本开头使用auto()函数来确保无障碍服务已经启用。如果运行到某个需要权限的语句无障碍服务并没启动,则会抛出异常并跳转到无障碍服务界面。这样的用户体验并不好,因为需要重新运行脚本,后续会加入等待无障碍服务启动并让脚本继续运行的函数。
您也可以在脚本开头使用"auto";表示这个脚本需要无障碍服务,但是不推荐这种做法,因为这个标记必须在脚本的最开头(前面不能有注释或其他语句、空格等),我们推荐使用auto()函数来确保无障碍服务已启用。
上次编辑于: 2022/10/27
13:15:37
贡献者: hyb1996
下一页
选择器
新内容已就绪a
选择器 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: ocr.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档
自动化 - 控件操作入门介绍
选择器selector()
UiSelector.algorithm(algorithm)
UiSelector.text(str)
UiSelector.textContains(str)
UiSelector.textStartsWith(prefix)
UiSelector.textEndsWith(suffix)
UiSelector.textMatches(reg)
UiSelector.desc(str)
UiSelector.descContains(str)
UiSelector.descStartsWith(prefix)
UiSelector.descEndsWith(suffix)
UiSelector.descMatches(reg)
UiSelector.id(resId)
UiSelector.idContains(str)
UiSelector.idStartsWith(prefix)
UiSelector.idEndsWith(suffix)
UiSelector.idMatches(reg)
UiSelector.className(str)
UiSelector.classNameContains(str)
UiSelector.classNameStartsWith(prefix)
UiSelector.classNameEndsWith(suffix)
UiSelector.classNameMatches(reg)
UiSelector.packageName(str)
UiSelector.packageNameContains(str)
UiSelector.packageNameStartsWith(prefix)
UiSelector.packageNameEndsWith(suffix)
UiSelector.packageNameMatches(reg)
UiSelector.bounds(left,
top, right, bottom)
UiSelector.boundsInside(left,
top, right, bottom)
UiSelector.boundsContains(left,
top, right, bottom)
UiSelector.drawingOrder(order)
UiSelector.clickable([b =
true])
UiSelector.longClickable([b =
true])
UiSelector.checkable([b =
true])
UiSelector.selected([b =
true])
UiSelector.enabled([b =
true])
UiSelector.scrollable([b =
true])
UiSelector.editable([b =
true])
UiSelector.multiLine([b =
true])
UiSelector.findOne()
UiSelector.findOne(timeout)
UiSelector.findOnce()
UiSelector.findOnce(i)
UiSelector.find()
UiSelector.untilFind()
UiSelector.exists()
UiSelector.waitFor()
UiSelector.filter(f)
控件和控件集合
automator与其他函数自动化 - 坐标操作
app - 应用
base64
colors - 颜色
canvas - 画布
console -
控制台
crypto -
加解密与消息摘要
debug - 调试工具
device - 设备
dialogs -
对话框
engines -
脚本引擎
events -
事件与监听
floaty - 悬浮窗
files - 文件系统
globals -
全局变量与函数
http -
HTTP网络请求
images -
图片处理
keys - 按键模拟
media - 多媒体
module - 模块
ocr - 文字识别
plugins - 插件
power_manager -
电源管理
sensors -
传感器
shell -
Shell命令
storages -
本地存储
settings -
设置
threads -
多线程
timers - 定时器
work_manager -
定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
入门介绍
选择器选择器2022年10月27日
此页内容
selector()
UiSelector.algorithm(algorithm)UiSelector.text(str)UiSelector.textContains(str)UiSelector.textStartsWith(prefix)UiSelector.textEndsWith(suffix)UiSelector.textMatches(reg)UiSelector.desc(str)UiSelector.descContains(str)UiSelector.descStartsWith(prefix)UiSelector.descEndsWith(suffix)UiSelector.descMatches(reg)UiSelector.id(resId)UiSelector.idContains(str)UiSelector.idStartsWith(prefix)UiSelector.idEndsWith(suffix)UiSelector.idMatches(reg)UiSelector.className(str)UiSelector.classNameContains(str)UiSelector.classNameStartsWith(prefix)UiSelector.classNameEndsWith(suffix)UiSelector.classNameMatches(reg)UiSelector.packageName(str)UiSelector.packageNameContains(str)UiSelector.packageNameStartsWith(prefix)UiSelector.packageNameEndsWith(suffix)UiSelector.packageNameMatches(reg)UiSelector.bounds(left, top,
right, bottom)
UiSelector.boundsInside(left,
top, right, bottom)
UiSelector.boundsContains(left,
top, right, bottom)
UiSelector.drawingOrder(order)UiSelector.clickable([b =
true])
UiSelector.longClickable([b =
true])
UiSelector.checkable([b =
true])
UiSelector.selected([b =
true])
UiSelector.enabled([b =
true])
UiSelector.scrollable([b =
true])
UiSelector.editable([b =
true])
UiSelector.multiLine([b =
true])
UiSelector.findOne()UiSelector.findOne(timeout)UiSelector.findOnce()UiSelector.findOnce(i)UiSelector.find()UiSelector.untilFind()UiSelector.exists()UiSelector.waitFor()UiSelector.filter(f)
# 选择器
UiSelector即选择器,用于通过各种条件选取屏幕上的控件,再对这些控件进行点击、长按等动作。这里需要先简单介绍一下控件和界面的相关知识。 一般软件的界面是由一个个控件构成的,例如图片部分是一个图片控件(ImageView),文字部分是一个文字控件(TextView);同时,通过各种布局来决定各个控件的位置,例如,线性布局(LinearLayout)里面的控件都是按水平或垂直一次叠放的,列表布局(AbsListView)则是以列表的形式显示控件。
控件有各种属性,包括文本(text), 描述(desc), 类名(className),
id等等。我们通常用一个控件的属性来找到这个控件,例如,想要点击某聊天应用的聊天窗口的"发送"按钮,我们就可以通过他的文本属性为"发送"来找到这个控件并点击他,具体代码为:var sendButton = text("发送").findOne();
sendButton.click();
在这个例子中,
text("发送")表示一个条件(文本属性为"发送"),findOne()表示基于这个条件找到一个符合条件的控件,从而我们可以得到发送按钮sendButton,再执行sendButton.click()即可点击"发送"按钮。
用文本属性来定位按钮控件、文本控件通常十分有效。但是,如果一个控件是图片控件,比如Auto.js主界面右上角的搜索图标,他没有文本属性,这时需要其他属性来定位他。我们如何查看他有什么属性呢?首先打开悬浮窗和无障碍服务,点击蓝色的图标(布局分析),
可以看到以下界面:
之后我们点击搜索图标,可以看到他有以下属性:
我们注意到这个图标的desc(描述)属性为"搜索",那么我们就可以通过desc属性来定位这个控件,得到点击搜索图标的代码为:desc("搜索").findOne().click();可能心细的你可能注意到了,这个控件还有很多其他的属性,例如checked, className,
clickable等等,为什么不用这些属性来定位搜索图标呢?答案是,其他控件也有这些值相同的属性、尝试一下你就可以发现很多其他控件的checked属性和搜索控件一样都是false,如果我们用checked(false)作为条件,将会找到很多控件,而无法确定哪一个是搜索图标。因此,要找到我们想要的那个控件,选择器的条件通常需要是可唯一确定控件的。我们通常用一个独一无二的属性来定位一个控件,例如这个例子中就没有其他控件的desc(描述)属性为"搜索"。
另外,对于这个搜索图标而言,id属性也是唯一的,我们也可以用id("action_search").findOne().click()来点击这个控件。如果一个控件有id属性,那么这个属性很可能是唯一的,除了以下几种情况:
被混淆的控件ID,可能名称都是相同的,或者在版本之间有变化
列表中的控件,比如联系人列表等尽管id属性很方便,但也不总是最方便的,例如对于微信和网易云音乐,每次更新他的控件id都会变化,导致了相同代码对于不同版本的微信、网易云音乐并不兼容。
除了这些属性外,主要还有以下几种属性:className
类名。类名表示一个控件的类型,例如文本控件为"android.widget.TextView", 图片控件为"android.widget.ImageView"等。
packageName 包名。包名表示控件所在的应用包名,例如Auto.js
Pro界面的控件的包名为"org.autojs.autojspro"。
bounds 控件在屏幕上的范围。
drawingOrder 控件在父控件的绘制顺序。
indexInParent 控件在父控件的位置。
clickable 控件是否可点击。
longClickable 控件是否可长按。
checkable 控件是否可勾选。
checked 控件是否可已勾选。
scrollable 控件是否可滑动。
selected 控件是否已选择。
editable 控件是否可编辑。
visibleToUser 控件是否可见。
enabled 控件是否已启用。
depth 控件的布局深度。
有时候只靠一个属性并不能唯一确定一个控件,这时需要通过属性的组合来完成定位,例如className("ImageView").depth(10).findOne().click(),通过链式调用来组合条件。
通常用这些技巧便可以解决大部分问题,即使解决不了问题,也可以通过布局分析的"生成代码"功能来尝试生成一些选择器代码。接下来的问题便是对选取的控件进行操作,包括:
click()
点击。点击一个控件,前提是这个控件的clickable属性为true
longClick()
长按。长按一个控件,前提是这个控件的longClickable属性为true
setText()
设置文本,用于编辑框控件设置文本。
scrollForward(),
scrollBackward()
滑动。滑动一个控件(列表等), 前提是这个控件的scrollable属性为true
exits()
判断控件是否存在
waitFor()
等待控件出现
这些操作包含了绝大部分控件操作。根据这些我们可以很容易写出一个"刷屏"脚本(代码仅为示例,请不要在别人的群里测试,否则容易被踢):while(true){
className("EditText").findOne().setText("刷屏...");
text("发送").findOne().clicK();
}
上面这段代码也可以写成:while(true){
className("EditText").setText("刷屏...");
text("发送").clicK();
} 如果不加findOne()而直接进行操作,则选择器会找出所有符合条件的控件并操作。
另外一个比较常用的操作的滑动。滑动操作的第一步是找到需要滑动的控件,例如要滑动QQ消息列表则在悬浮窗布局层次分析中找到AbsListView,这个控件就是消息列表控件,如下图:
长按可查看控件信息,注意到其scrollable属性为true,并找出其id为"recent_chat_list",从而下滑QQ消息列表的代码为:id("recent_chat_list").className("AbsListView").findOne().scrollForward();
scrollForward()为向前滑,包括下滑和右滑。
选择器的入门教程暂且要这里,更多信息可以查看下面的文档和选择器进阶。
#
selector()返回 {UiSelector}创建一个新的选择器。但一般情况不需要使用该函数,因为可以直接用相应条件的语句创建选择器。 由于历史遗留原因,本不应该这样设计(不应该让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} 控件文本
返回 {UiSelector} 返回选择器自身以便链式调用为当前选择器附加控件"text等于字符串str"的筛选条件。
控件的text(文本)属性是文本控件上的显示的文字,例如微信左上角的"微信"文本。
# UiSelector.textContains(str)str {string} 要包含的字符串为当前选择器附加控件"text需要包含字符串str"的筛选条件。 这是一个比较有用的条件,例如QQ动态页和微博发现页上方的"大家都在搜...."的控件可以用textContains("大家都在搜").findOne()来获取。
# UiSelector.textStartsWith(prefix)prefix {string} 前缀为当前选择器附加控件"text需要以prefix开头"的筛选条件。 这也是一个比较有用的条件,例如要找出Auto.js脚本列表中名称以"QQ"开头的脚本的代码为textStartsWith("QQ").find()。
# UiSelector.textEndsWith(suffix)suffix {string} 后缀为当前选择器附加控件"text需要以suffix结束"的筛选条件。
# UiSelector.textMatches(reg)reg {string} | {Regex} 要满足的正则表达式。为当前选择器附加控件"text需要满足正则表达式reg"的条件。
有关正则表达式,可以查看正则表达式 - 菜鸟教程
open in new window。 需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
# UiSelector.desc(str)str {string} 控件文本
返回 {UiSelector} 返回选择器自身以便链式调用为当前选择器附加控件"desc等于字符串str"的筛选条件。
控件的desc(描述,全称为Content-Description)属性是对一个控件的描述,例如网易云音乐右上角的放大镜图标的描述为搜索。要查看一个控件的描述,同样地可以借助悬浮窗查看。
desc属性同样是定位控件的利器。
# UiSelector.descContains(str)str {string} 要包含的字符串为当前选择器附加控件"desc需要包含字符串str"的筛选条件。
# UiSelector.descStartsWith(prefix)prefix {string} 前缀为当前选择器附加控件"desc需要以prefix开头"的筛选条件。
# UiSelector.descEndsWith(suffix)suffix {string} 后缀为当前选择器附加控件"desc需要以suffix结束"的筛选条件。
# UiSelector.descMatches(reg)reg {string} | {Regex} 要满足的正则表达式。为当前选择器附加控件"desc需要满足正则表达式reg"的条件。
有关正则表达式,可以查看正则表达式 - 菜鸟教程
open in new window。 需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
# UiSelector.id(resId)resId {string}
控件的id,以"包名:id/"开头,例如"com.tencent.mm:id/send_btn"。也可以不指定包名,这时会以当前正在运行的应用的包名来补全id。例如id("send_btn"),在界面想当于id("com.tencent.mobileqq:id/send_btn")。
为当前选择器附加"id等于resId"的筛选条件。
控件的id属性通常是可以用来确定控件的唯一标识,如果一个控件有id,那么使用id来找到他是最好的方法。要查看屏幕上的控件的id,可以开启悬浮窗并使用界面工具,点击相应控件即可查看。若查看到的控件id为null,
表示该控件没有id。另外,在列表中会出现多个控件的id相同的情况。例如微信的联系人列表,每个头像的id都是一样的。此时不能用id来唯一确定控件。
在QQ界面经常会出现多个id为"name"的控件,在微信上则每个版本的id都会变化。对于这些软件而言比较难用id定位控件。
# UiSelector.idContains(str)str {string} id要包含的字符串为当前选择器附加控件"id包含字符串str"的筛选条件。比较少用。
# UiSelector.idStartsWith(prefix)prefix {string} id前缀为当前选择器附加"id需要以prefix开头"的筛选条件。比较少用。
# UiSelector.idEndsWith(suffix)suffix {string} id后缀为当前选择器附加"id需要以suffix结束"的筛选条件。比较少用。
# UiSelector.idMatches(reg)reg {Regex | string} id要满足的正则表达式附加id需要满足正则表达式。 需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
idMatches("[a-zA-Z]+")# UiSelector.className(str)str {string} 控件文本
返回 {UiSelector} 返回选择器自身以便链式调用为当前选择器附加控件"className等于字符串str"的筛选条件。
控件的className(类名)表示一个控件的类别,例如文本控件的类名为android.widget.TextView。 如果一个控件的类名以"android.widget."开头,则可以省略这部分,例如文本控件可以直接用className("TextView")的选择器。
常见控件的类名如下:
android.widget.TextView
文本控件
android.widget.ImageView
图片控件
android.widget.Button
按钮控件
android.widget.EditText
输入框控件
android.widget.AbsListView
列表控件
android.widget.LinearLayout
线性布局
android.widget.FrameLayout
帧布局
android.widget.RelativeLayout
相对布局
android.widget.RelativeLayout
相对布局
android.support.v7.widget.RecyclerView
通常也是列表控件
# UiSelector.classNameContains(str)str {string} 要包含的字符串为当前选择器附加控件"className需要包含字符串str"的筛选条件。
# UiSelector.classNameStartsWith(prefix)prefix {string} 前缀为当前选择器附加控件"className需要以prefix开头"的筛选条件。
# UiSelector.classNameEndsWith(suffix)suffix {string} 后缀为当前选择器附加控件"className需要以suffix结束"的筛选条件。
# UiSelector.classNameMatches(reg)reg {string} | {Regex} 要满足的正则表达式。为当前选择器附加控件"className需要满足正则表达式reg"的条件。
有关正则表达式,可以查看正则表达式 - 菜鸟教程
open in new window。 需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
# UiSelector.packageName(str)str {string} 控件文本
返回 {UiSelector} 返回选择器自身以便链式调用为当前选择器附加控件"packageName等于字符串str"的筛选条件。
控件的packageName表示控件所属界面的应用包名。例如Auto.js Pro的包名为"org.autojs.autojspro", 那么Auto.js
Pro界面的控件的packageName为"org.autojs.autojspro"。 要查看一个应用的包名,可以用函数app.getPackageName()获取,例如toast(app.getPackageName("微信"))。
# UiSelector.packageNameContains(str)str {string} 要包含的字符串为当前选择器附加控件"packageName需要包含字符串str"的筛选条件。
# UiSelector.packageNameStartsWith(prefix)prefix {string} 前缀为当前选择器附加控件"packageName需要以prefix开头"的筛选条件。
# UiSelector.packageNameEndsWith(suffix)suffix {string} 后缀为当前选择器附加控件"packageName需要以suffix结束"的筛选条件。
# UiSelector.packageNameMatches(reg)reg {string} | {Regex} 要满足的正则表达式。为当前选择器附加控件"packageName需要满足正则表达式reg"的条件。
有关正则表达式,可以查看正则表达式 - 菜鸟教程
open in new window。
# UiSelector.bounds(left, top, right, bottom)left {number} 控件左边缘与屏幕左边的距离
top {number} 控件上边缘与屏幕上边的距离
right {number} 控件右边缘与屏幕左边的距离
bottom {number} 控件下边缘与屏幕上边的距离
一个控件的bounds属性为这个控件在屏幕上显示的范围。我们可以用这个范围来定位这个控件。尽管用这个方法定位控件对于静态页面十分准确,却无法兼容不同分辨率的设备;同时对于列表页面等动态页面无法达到效果,因此使用不推荐该选择器。
注意参数的这四个数字不能随意填写,必须精确的填写控件的四个边界才能找到该控件。例如,要点击QQ主界面的右上角加号,我们用布局分析查看该控件的属性,如下图:
可以看到bounds属性为(951, 67, 1080,
196),此时使用代码bounds(951, 67, 1080, 196).clickable().click()即可点击该控件。
# UiSelector.boundsInside(left, top, right, bottom)left {number} 范围左边缘与屏幕左边的距离
top {number} 范围上边缘与屏幕上边的距离
right {number} 范围右边缘与屏幕左边的距离
bottom {number} 范围下边缘与屏幕上边的距离为当前选择器附加控件"bounds需要在left, top, right, bottom构成的范围里面"的条件。
这个条件用于限制选择器在某一个区域选择控件。例如要在屏幕上半部分寻找文本控件TextView,代码为:var w = className("TextView").boundsInside(0, 0, device.width, device.height / 2).findOne();
log(w.text()); 其中我们使用了device.width来获取屏幕宽度,device.height来获取屏幕高度。
# UiSelector.boundsContains(left, top, right, bottom)left {number} 范围左边缘与屏幕左边的距离
top {number} 范围上边缘与屏幕上边的距离
right {number} 范围右边缘与屏幕左边的距离
bottom {number} 范围下边缘与屏幕上边的距离为当前选择器附加控件"bounds需要包含left, top, right, bottom构成的范围"的条件。
这个条件用于限制控件的范围必须包含所给定的范围。例如给定一个点(500, 300), 寻找在这个点上的可点击控件的代码为:var w = boundsContains(500, 300, 500, 300).clickable().findOne();
w.click();
# UiSelector.drawingOrder(order)order {number} 控件在父视图中的绘制顺序为当前选择器附加控件"drawingOrder等于order"的条件。
drawingOrder为一个控件在父控件中的绘制顺序,通常可以用于区分同一层次的控件。
但该属性在Android 7.0以上才能使用。
# UiSelector.clickable([b = true])b {Boolean} 表示控件是否可点击
为当前选择器附加控件是否可点击的条件。但并非所有clickable为false的控件都真的不能点击,这取决于控件的实现。对于自定义控件(例如显示类名为android.view.View的控件)很多的clickable属性都为false都却能点击。
需要注意的是,可以省略参数b而表示选择那些可以点击的控件,例如className("ImageView").clickable()表示可以点击的图片控件的条件,className("ImageView").clickable(false)表示不可点击的图片控件的条件。
# UiSelector.longClickable([b = true])b {Boolean} 表示控件是否可长按为当前选择器附加控件是否可长按的条件。
# UiSelector.checkable([b = true])b {Boolean} 表示控件是否可勾选为当前选择器附加控件是否可勾选的条件。勾选通常是对于勾选框而言的,例如图片多选时左上角通常有一个勾选框。
# UiSelector.selected([b = true])b {Boolean} 表示控件是否被选为当前选择器附加控件是否已选中的条件。被选中指的是,例如QQ聊天界面点击下方的"表情按钮"时,会出现自己收藏的表情,这时"表情按钮"便处于选中状态,其selected属性为true。
# UiSelector.enabled([b = true])b {Boolean} 表示控件是否已启用为当前选择器附加控件是否已启用的条件。大多数控件都是启用的状态(enabled为true),处于“禁用”状态通常是灰色并且不可点击。
# UiSelector.scrollable([b = true])b {Boolean} 表示控件是否可滑动为当前选择器附加控件是否可滑动的条件。滑动包括上下滑动和左右滑动。
可以用这个条件来寻找可滑动控件来滑动界面。例如滑动Auto.js的脚本列表的代码为:className("android.support.v7.widget.RecyclerView").scrollable().findOne().scrollForward();
//或者classNameEndsWith("RecyclerView").scrollable().findOne().scrollForward();
# UiSelector.editable([b = true])b {Boolean} 表示控件是否可编辑为当前选择器附加控件是否可编辑的条件。一般来说可编辑的控件为输入框(EditText),但不是所有的输入框(EditText)都可编辑。
# UiSelector.multiLine([b = true])b {Boolean} 表示文本或输入框控件是否是多行显示的为当前选择器附加控件是否文本或输入框控件是否是多行显示的条件。
# UiSelector.findOne()返回 {UiObject}根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件。如果找不到控件,当屏幕内容发生变化时会重新寻找,直至找到。 需要注意的是,如果屏幕上一直没有出现所描述的控件,则该函数会阻塞,直至所描述的控件出现为止。因此此函数不会返回null。
该函数本来应该命名为untilFindOne(),但由于历史遗留原因已经无法修改。如果想要只在屏幕上搜索一次而不是一直搜索,请使用findOnce()。
另外,如果屏幕上有多个满足条件的控件,findOne()采用深度优先搜索(DFS),会返回该搜索算法找到的第一个控件。注意控件找到的顺序有时会起到作用。
# UiSelector.findOne(timeout)timeout {number} 搜索的超时时间,单位毫秒
返回 {UiObject}
根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件;如果在timeout毫秒的时间内没有找到符合条件的控件,则终止搜索并返回null。
该函数类似于不加参数的findOne(),只不过加上了时间限制。
示例://启动Auto.js
launchApp("Auto.js");
//在6秒内找出日志图标的控件
var w = id("action_log").findOne(6000);
//如果找到控件则点击
if(w != null){
w.click();
}else{
//否则提示没有找到
toast("没有找到日志图标");
}# UiSelector.findOnce()返回 {UiObject}根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,如果找到符合条件的控件则返回该控件;否则返回null。
# UiSelector.findOnce(i)i {number} 索引根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,并返回第 i + 1 个符合条件的控件;如果没有找到符合条件的控件,或者符合条件的控件个数 < i,
则返回null。
注意这里的控件次序,是搜索算法深度优先搜索(DSF)决定的。
#
UiSelector.find()返回 {UiCollection}根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,找到所有满足条件的控件集合并返回。这个搜索只进行一次,并不保证一定会找到,因而会出现返回的控件集合为空的情况。 不同于findOne()或者findOnce()只找到一个控件并返回一个控件,find()函数会找出所有满足条件的控件并返回一个控件集合。之后可以对控件集合进行操作。
可以通过empty()函数判断找到的是否为空。例如:var c = className("AbsListView").find();
if(!c.empty()){
toast("找到啦");
}else{
toast("没找到╭(╯^╰)╮");
}
# UiSelector.untilFind()返回 {UiCollection}根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到找到至少一个满足条件的控件为止,并返回所有满足条件的控件集合。 该函数与find()函数的区别在于,该函数永远不会返回空集合;但是,如果屏幕上一直没有出现满足条件的控件,则该函数会保持阻塞。
# UiSelector.exists()返回 {Boolean}判断屏幕上是否存在控件符合选择器所确定的条件。例如要判断某个文本出现就执行某个动作,可以用:if(text("某个文本").exists()){
//要支持的动作
}# UiSelector.waitFor()
等待屏幕上出现符合条件的控件;在满足该条件的控件出现之前,该函数会一直保持阻塞。
例如要等待包含"哈哈哈"的文本控件出现的代码为:textContains("哈哈哈").waitFor();# UiSelector.filter(f)f {Function} 过滤函数,参数为UiObject,返回值为boolean为当前选择器附加自定义的过滤条件。
例如,要找出屏幕上所有文本长度为10的文本控件的代码为:var uc = className("TextView").filter(function(w){
return w.text().length == 10;
});上次编辑于: 2022/11/20
17:30:10
贡献者: hyb1996
上一页
入门介绍下一页
控件和控件集合
新内容已就绪a
入门介绍 | Auto.js Pro文档 This page was saved using WebZIP 7.1.2.1052 offline browser on 02/12/23 22:27:19.
Address: ocr.html
Title: app - 应用 | Auto.js Pro文档 • Size: 74412 • Last
Modified: Sun, 12 Feb 2023 12:58:09 GMT
Skip to content
Auto.js
Pro文档
Auto.js Pro
指南
第一代API文档
第二代API文档官网与相关链接官网与软件下载
open in new window官方博客
open in new window官方频道
open in new windowEnglish
简体中文指南阅读须知API文档
自动化 - 控件操作入门介绍
选择器
控件和控件集合UiObjectUiObject.click()
UiObject.clickCenter()
UiObject.longClick()
UiObject.setText(text)
UiObject.copy()
UiObject.cut()
UiObject.paste()
UiObject.setSelection(start,
end)
UiObject.scrollForward()
UiObject.scrollBackward()
UiObject.select()
UiObject.collapse()
UiObject.expand()
UiObject.show()
UiObject.scrollUp()
UiObject.scrollDown()
UiObject.scrollLeft()
UiObject.scrollRight()
UiObject.children()
UiObject.childCount()
UiObject.child(i)
UiObject.parent()
UiObject.bounds()
UiObject.boundsInParent()
UiObject.drawingOrder()
UiObject.id()
UiObject.text()
UiObject.findByText(str)
UiObject.findOne(selector)
UiObject.find(selector)
UiCollectionUiCollection.size()
UiCollection.get(i)
UiCollection.each(func)
UiCollection.empty()
UiCollection.nonEmpty()
UiCollection.find(selector)
UiCollection.findOne(selector)
automator与其他函数自动化 - 坐标操作
app - 应用
base64
colors - 颜色
canvas - 画布
console -
控制台
crypto -
加解密与消息摘要
debug - 调试工具
device - 设备
dialogs -
对话框
engines -
脚本引擎
events -
事件与监听
floaty - 悬浮窗
files - 文件系统
globals -
全局变量与函数
http -
HTTP网络请求
images -
图片处理
keys - 按键模拟
media - 多媒体
module - 模块
ocr - 文字识别
plugins - 插件
power_manager -
电源管理
sensors -
传感器
shell -
Shell命令
storages -
本地存储
settings -
设置
threads -
多线程
timers - 定时器
work_manager -
定时与任务ui
- 用户界面util - 工具
WebSocket
zip - 压缩与解压进阶和Java交互
Auto.js Pro
阅读须知
入门介绍
控件和控件集合控件和控件集合2022年10月27日
此页内容
UiObjectUiObject.click()UiObject.clickCenter()UiObject.longClick()UiObject.setText(text)UiObject.copy()UiObject.cut()
UiObject.paste()UiObject.setSelection(start,
end)
UiObject.scrollForward()UiObject.scrollBackward()UiObject.select()UiObject.collapse()UiObject.expand()UiObject.show()UiObject.scrollUp()UiObject.scrollDown()UiObject.scrollLeft()UiObject.scrollRight()UiObject.children()UiObject.childCount()UiObject.child(i)UiObject.parent()UiObject.bounds()UiObject.boundsInParent()UiObject.drawingOrder()UiObject.id()
UiObject.text()UiObject.findByText(str)UiObject.findOne(selector)UiObject.find(selector)
UiCollectionUiCollection.size()UiCollection.get(i)UiCollection.each(func)UiCollection.empty()UiCollection.nonEmpty()UiCollection.find(selector)UiCollection.findOne(selector)# 控件和控件集合
#
UiObject
UiObject表示一个控件,可以通过这个对象获取到控件的属性,也可以对控件进行点击、长按等操作。 获取一个UiObject通常通过选择器的findOne(),
findOnce()等函数,也可以通过UiCollection来获取,或者通过UiObject.child(),
UiObject.parent()等函数来获取一个控件的子控件或父控件。
#
UiObject.click()返回 {boolean}点击该控件,并返回是否点击成功。 如果该函数返回false,可能是该控件不可点击(clickable为false),当前界面无法响应该点击等(这种情况下可以使用clickCenter()代替)。
# UiObject.clickCenter()
[Pro 8.8.17新增
open in new window]返回 {boolean}
使用坐标点击该控件的中点,相当于click(uiObj.bounds().centerX(), uiObject.bounds().centerY())。
返回是否点击成功。
# UiObject.longClick()返回 {boolean}长按该控件,并返回是否点击成功。
如果该函数返回false,可能是该控件不可点击(longClickable为false),当前界面无法响应该点击等。
# UiObject.setText(text)text {string} 文本
返回 {boolean}设置输入框控件的文本内容,并返回是否设置成功。
该函数只对可编辑的输入框(editable为true)有效。
#
UiObject.copy()返回 {boolean}对输入框文本的选中内容进行复制,并返回是否操作成功。 该函数只能用于输入框控件,并且当前输入框控件有选中的文本。可以通过setSelection()函数来设置输入框选中的内容。
var et = className("EditText").findOne();
//选中前两个字
et.setSelection(0, 2);
//对选中内容进行复制
if(et.copy()){
toast("复制成功");
}else{
toast("复制失败");
}#
UiObject.cut()
对输入框文本的选中内容进行剪切,并返回是否操作成功。 该函数只能用于输入框控件,并且当前输入框控件有选中的文本。可以通过setSelection()函数来设置输入框选中的内容。
#
UiObject.paste()返回 {boolean}对输入框控件进行粘贴操作,把剪贴板内容粘贴到输入框中,并返回是否操作成功。//设置剪贴板内容为“你好”
setClip("你好");
var et = className("EditText").findOne();
et.paste();
# UiObject.setSelection(start, end)start {number} 选中内容起始位置
end {number} 选中内容结束位置(不包括)
返回 {boolean}对输入框控件设置选中的文字内容,并返回是否操作成功。 索引是从0开始计算的;并且,选中内容不包含end位置的字符。例如,如果一个输入框内容为"123456789",要选中"4567"的文字的代码为et.setSelection(3, 7)。
该函数也可以用来设置光标位置,只要参数的end等于start,即可把输入框光标设置在start的位置。例如et.setSelection(1, 1)会把光标设置在第一个字符的后面。
# UiObject.scrollForward()返回 {boolean}对控件执行向前滑动的操作,并返回是否操作成功。 向前滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考)。
# UiObject.scrollBackward()返回 {boolean}对控件执行向后滑动的操作,并返回是否操作成功。 向后滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考)。
#
UiObject.select()返回 {boolean}
对控件执行"选中"操作,并返回是否操作成功。"选中"和isSelected()的属性相关,但该操作十分少用。
# UiObject.collapse()返回 {boolean}对控件执行折叠操作,并返回是否操作成功。
#
UiObject.expand()返回 {boolean}对控件执行操作,并返回是否操作成功。
#
UiObject.show()
执行显示操作,并返回是否全部操作成功。
# UiObject.scrollUp()返回 {boolean}
执行向上滑的操作,并返回是否全部操作成功。(虽然有些控件看起来可以滑动,但调用scrollUp可能无效,可以用scrollBackward代替)
# UiObject.scrollDown()返回 {boolean}
执行向下滑的操作,并返回是否全部操作成功。(虽然有些控件看起来可以滑动,但调用scrollDown可能无效,可以用scrollForward代替)
# UiObject.scrollLeft()返回 {boolean}
执行向左滑的操作,并返回是否全部操作成功。(虽然有些控件看起来可以滑动,但调用scrollLeft可能无效,可以用scrollBackward代替)
# UiObject.scrollRight()返回 {boolean}
执行向右滑的操作,并返回是否全部操作成功。(虽然有些控件看起来可以滑动,但调用scrollRight可能无效,可以用scrollForward代替)
# UiObject.children()返回 {UiCollection}
返回该控件的所有子控件组成的控件集合。可以用于遍历一个控件的子控件,例如:className("AbsListView").findOne().children()
.forEach(function(child){
log(child.className());
});
# UiObject.childCount()返回 {number}返回子控件数目。
#
UiObject.child(i)i {number} 子控件索引
返回 {UiObject}返回第i+1个子控件。如果i>=控件数目或者小于0,则抛出异常。
需要注意的是,由于布局捕捉的问题,该函数可能返回null,也就是可能获取不到某个子控件。
遍历子控件的示例:var list = className("AbsListView").findOne();
for(var i = 0; i < list.childCount(); i++){
var child = list.child(i);
log(child.className());
}#
UiObject.parent()返回 {UiObject}返回该控件的父控件。如果该控件没有父控件,返回null。
#
UiObject.bounds()返回 {Rect
open in new window}返回控件在屏幕上的范围,其值是一个Rect
open in new window对象。
示例:var b = text("Auto.js").findOne().bounds();
toast("控件在屏幕上的范围为" + b); 如果一个控件本身无法通过click()点击,那么我们可以利用bounds()函数获取其坐标,再利用坐标点击。例如:
var b = desc("打开侧拉菜单").findOne().bounds();
click(b.centerX(), b.centerY());
//如果使用root权限,则用 Tap(b.centerX(), b.centerY());# UiObject.boundsInParent()返回 {Rect
open in new window}返回控件在父控件中的范围,其值是一个Rect
open in new window对象。
# UiObject.drawingOrder()返回 {number}返回控件在父控件中的绘制次序。该函数在安卓7.0及以上才有效,7.0以下版本调用会返回0。
#
UiObject.id()返回 {string}获取控件的id,如果一个控件没有id,则返回null。
#
UiObject.text()返回 {string}获取控件的文本,如果控件没有文本,返回""。
# UiObject.findByText(str)str {string} 文本
返回 {UiCollection}
根据文本text在子控件中递归地寻找并返回文本或描述(desc)包含这段文本str的控件,返回它们组成的集合。
该函数会在当前控件的子控件,孙控件,曾孙控件...中搜索text或desc包含str的控件,并返回它们组合的集合。
# UiObject.findOne(selector)selector {UiSelector}
返回 {UiObject}
根据选择器selector在该控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null。
例如,对于酷安动态列表,我们可以遍历他的子控件(每个动态列表项),并在每个子控件中依次寻找点赞数量和图标,对于点赞数量小于10的点赞://找出动态列表
var list = id("recycler_view").findOne();
//遍历动态
list.children().forEach(function(child){
//找出点赞图标
var like = child.findOne(id("feed_action_view_like"));
//找出点赞数量
var likeCount = child.findOne(id("text_view"));
//如果这两个控件没有找到就不继续了
if(like == null || likeCount == null){
return;
}
//判断点赞数量是否小于10
if(parseInt(likeCount.text()) < 10){
//点赞
like.click();
}
});
# UiObject.find(selector)selector {UiSelector}
返回 {UiCollection}
根据选择器selector在该控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回它们组合的集合。
#
UiCollection
UiCollection, 控件集合,
通过选择器的find(),
untilFind()方法返回的对象。
UiCollection"继承"于数组,实际上是一个UiObject的数组,因此可以使用数组的函数和属性,例如使用length属性获取UiCollection的大小,使用forEach函数来遍历UiCollection。
例如,采用forEach遍历屏幕上所有的文本控件并打印出文本内容的代码为:console.show();
className("TextView").find().forEach(function(tv){
if(tv.text() != ""){
log(tv.text());
}
});
也可以使用传统的数组遍历方式:console.show();
var uc = className("TextView").find();
for(var i = 0; i < uc.length; i++){
var tv = uc[i];
if(tv.text() != ""){
log(tv.text());
}
} UiCollection的每一个元素都是UiObject,我们可以取出他的元素进行操作,例如取出第一个UiObject并点击的代码为ui[0].click()。如果想要对该集合的所有元素进行操作,可以直接在集合上调用相应的函数,例如uc.click(),该代码会对集合上所有UiObject执行点击操作并返回是否全部点击成功。
因此,UiCollection具有所有UiObject对控件操作的函数,包括click(),
longClick(),
scrollForward()等等,不再赘述。
# UiCollection.size()返回 {number}返回集合中的控件数。
历史遗留函数,相当于属性length。
# UiCollection.get(i)i {number} 索引
返回 {UiObject}
返回集合中第i+1个控件(UiObject)。
历史遗留函数,建议直接使用数组下标的方式访问元素。
# UiCollection.each(func)func {Function} 遍历函数,参数为UiObject。遍历集合。
历史遗留函数,相当于forEach。参考forEach
open in new window。
# UiCollection.empty()返回 {boolean}返回控件集合是否为空。
# UiCollection.nonEmpty()返回 {boolean}返回控件集合是否非空。
# UiCollection.find(selector)selector {UiSelector}
返回 {UiCollection}
根据selector所确定的条件在该控件集合的控件、子控件、孙控件...中找到所有符合条件的控件并返回找到的控件集合。
注意这会递归地遍历控件集合里所有的控件以及他们的子控件。和数组的filter函数不同。
例如:var names = id("name").find();
//在集合
var clickableNames = names.find(clickable());# UiCollection.findOne(selector)selector {UiSelector}
返回 {UiObject}
根据选择器selector在该控件集合的控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null。
上次编辑于: 2022/10/27
13:15:37
贡献者: hyb1996
上一页
选择器下一页
automator与其他函数
新内容已就绪a