DEVELOPER HANDBOOK · 2026-10-02 引擎注册表实时生成

简单玩开发手册

一份跟着引擎走的文档:语法关键字、215 条内置中文指令(含英文别名)、运算符对照、运行时约定与 13 篇可运行示例——全部从当前版本函数注册表直接导出,与 App 编辑器长按词条看到的解释同源。

215+内置中文指令
216函数库分类条目
50语法关键字
13示例脚本

导读与运行环境

简单玩脚本 = 中文 DSL 与标准 Lua 双轨。写 找色(0,0,720,1280,"#FF0000",90),引擎自动翻译为 findColor(...);同一脚本里中英混写也完全合法。两种写法跑在同一个常驻 Lua 虚拟机上。

运行条件:Android 8.0+(API 26)· 基础功能免 Root(无障碍通道)· Root 为增强选项(evdev 多指并发/摇杆走位/免授权截屏)。脚本入口:悬浮球 → 编辑器 → ▶ 运行;工程页卡片「更新」可拉取云端分发脚本。调试输出在编辑器输出面板查看,提示函数为悬浮气泡。

中文 DSL 语法

局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
循环 i = 1 到 20
    局部变量 找到 = 找色(0, 0, 屏幕宽, 屏幕高, "#2F6FED", 90)
    如果 找到 那么
        点击(找到[1], 找到[2])
        跳出
    结束
    等待(500)
结束

块结构以 结束 收尾;变量用 局部变量 声明(缩进 2 空格);「如果…那么…否则…结束」「当…执行…结束」「循环…到…步长…结束」「函数…结束」「循环秒 N 执行…结束」等中英关键字等价。「找到/结果」类返回表可用下标 [1]/[2] 或 .X/.Y 取坐标;找图/找色命中自动落位全局表「找到」,配合 点击xy() 一步点击。代码标点请用英文半角(编辑器「输入设置 → 中文标点转英文」默认开启可自动纠正)。

语法关键字(50 个)

中文关键字与英文原生关键字等价,长按任意关键字均可查看同款解释。

关键字结构示例
如果如果 条件 那么 … 结束
如果 分数 >= 60 那么
    调试输出("及格")
结束
那么如果 条件 那么 … 结束
如果 温度 > 30 那么
    调试输出("太热了")
结束
否则如果 … 那么 … 否则 … 结束
如果 分数 >= 60 那么
    调试输出("及格")
否则
    调试输出("不及格")
结束
否则如果如果 … 那么 … 否则如果 条件 那么 … 结束
如果 分数 >= 90 那么
    调试输出("优秀")
否则如果 分数 >= 60 那么
    调试输出("及格")
否则
    调试输出("不及格")
结束
结束结束(块结束标记:如果/当/循环/函数/重复)
如果 条件 那么
    调试输出("hi")
结束  -- 这里的结束关闭上面的如果
当当 条件 执行 … 结束
局部变量 i = 0
当 i < 5 执行
    调试输出(i)
    i = i + 1
结束
执行当 条件 执行 … 结束
当 条件 执行
    等待(100)
结束
循环循环 变量 = 起始, 结束, 步长 … 结束
循环 i = 1, 5, 1 执行
    调试输出("第" + i + "次")
结束
到循环 变量 = 起始 到 结束 … 结束
循环 i = 1 到 10 执行
    调试输出(i)
结束
步长循环 变量 = 起始 到 结束 步长 增量 … 结束
循环 i = 10 到 1 步长 -2 执行
    调试输出(i)  -- 10, 8, 6, 4, 2
局部变量局部变量 名称 = 值
局部变量 计数 = 0
局部变量 名字 = "简单玩"
函数函数 名称(参数…) … 结束
函数 求和(a, b)
    返回 a + b
结束
调试输出(求和(3, 4))
返回返回 值
函数 双倍(x)
    返回 x * 2
结束
跳出跳出(立即退出循环)
循环 i = 1, 100 执行
    如果 i == 10 那么
        跳出
    结束
结束
并且条件1 并且 条件2(且)
如果 分数 >= 60 并且 考勤 >= 20 那么
    调试输出("通过")
结束
或者条件1 或者 条件2(或)
如果 角色 == "管理员" 或者 角色 == "老板" 那么
    调试输出("有权限")
结束
非非 条件(取反)
如果 非 已登录 那么
    调试输出("请先登录")
结束
真真(布尔 true)
局部变量 开 = 真
如果 开 那么
    调试输出("开着")
结束
假假(布尔 false)
局部变量 开 = 假
空空(nil,未赋值的变量)
局部变量 备注 = 空
如果 备注 == 空 那么
    调试输出("没有备注")
结束
调试输出调试输出(内容)
调试输出("你好,简单玩")
调试输出(1 + 2)
等待等待(毫秒)
等待(1000)  -- 暂停 1 秒
重复重复 … 直到 条件
局部变量 n = 0
重复
    n = n + 1
直到 n >= 5
直到重复 … 直到 条件(条件为真时结束)
重复
    等待(100)
    计数 = 计数 + 1
直到 计数 >= 10
循环无限循环无限 … 结束(挂机主循环首选)
循环无限
    找图点击(0, 0, 720, 1280, "怪物.png")
    等待(1000)
结束
循环次循环次 = 次数 … 结束(纯重复 N 次,无需用到计数变量)
循环次=3
    等待(1000)
结束  -- 共等待 3 秒
循环秒循环秒 = 秒数 … 结束(按真实时间循环,秒数可为小数;循环体内等待/耗时都计入)
循环秒=3
    点击(100, 100)
    等待(500)
结束  -- 真实 3 秒内循环
找到找到[X] / 找到[Y]=第一命中坐标,找到[个数]=命中数,找到[i][X]=第 i 个(找图/找色/找字命中后自动更新)
如果 找图(0, 0, 720, 1280, "按钮.png") 那么
    点击(找到[X], 找到[Y])
结束
ifif 条件 then … end
if x > 0 then
    print("positive")
end
thenif 条件 then … end
if ready then
    print("go")
end
elseif … then … else … end
if x > 0 then
    print("+")
else
    print("-")
end
elseifif … elseif 条件 then … end
if s >= 90 then
    print("A")
elseif s >= 60 then
    print("B")
else
    print("C")
end
endend(块结束标记)
function f()
    return 1
end
whilewhile 条件 do … end
local i = 0
while i < 5 do
    print(i)
    i = i + 1
end
dodo … end(代码块)
local x = 1
do
    local y = 2
end
forfor 变量 = 起始, 结束, 步长 do … end
for i = 1, 5, 1 do
    print(i)
end
infor 变量 in 迭代器 do … end
for k, v in pairs(t) do
    print(k, v)
end
functionfunction 名称(参数) … end
function add(a, b)
    return a + b
end
returnreturn 值
function double(x)
    return x * 2
end
locallocal 名称 = 值
local count = 0
local name = "lua"
breakbreak(退出循环)
for i = 1, 100 do
    if i == 10 then break end
end
and条件1 and 条件2(且)
if a > 0 and b > 0 then
    print("both")
end
or条件1 or 条件2(或)
if a > 0 or b > 0 then
    print("one")
end
notnot 条件(取反)
if not done then
    print("pending")
end
truetrue(真)
local on = true
if on then print("on") end
falsefalse(假)
local on = false
nilnil(空值)
local x = nil
if x == nil then print("none") end
repeatrepeat … until 条件
local n = 0
repeat
    n = n + 1
until n >= 5
untilrepeat … until 条件
repeat
    n = n + 1
until n >= 10
gotogoto 标签 ::标签::
for i = 1, 10 do
    if i == 3 then goto skip end
    print(i)
end
::skip::

运算符对照

引擎兼容标准 Lua 运算符:整除 //、幂 ^、位运算 & | ~ << >>(编辑器符号栏可一键插入)。中文显示名用于语法提示与符号面板,脚本中直接写符号。

符号中文名说明
+加号 +加法
-减号 -减法
*乘号 *乘法
除号 /除法
整除 //整除
%取模 %取模
^幂 ^幂
==等于 ==等于
~= 不等于 ~=不等于
<小于 <小于
>大于 >大于
<=小于等于 <=小于等于
>=大于等于 >=大于等于
=赋值 =赋值
..字符串拼接 ..字符串拼接
#取长度 #取长度
并且并且 and且
或者或者 or或
非非 not取反
&按位与 &按位与
|按位或 |按位或
~按位异或 ~按位异或
<<左移 <<左移
>>右移 >>右移

运行时约定

坐标表:命中返回 {X=, Y=},可 结果[1]/结果[2] 或 结果.结果[X] 取值;批量类返回带 个数/数量/长度 键。

路径:以 /res/ 开头的路径按当前工程内解析;其它绝对路径按设备真实路径。

线程:「启动线程」在独立 Lua 虚拟机运行(变量与主脚本隔离,互不读写),「停止线程」可打断;脚本停止用「停止运行」。

调试:调试输出/print 实时进输出面板;长按函数/关键字弹语法气泡(8 秒自动收起)。

内置示例脚本(13 篇 · 复制即跑)

与 App「首页 → 开始创作 → 示例」同一数据源,覆盖图色、控件、文件、网络、排序、递归等典型场景。

第一个脚本:输出日志 + 等待 + 气泡提示,跑通基础链路 · 示例_你好世界.lua-- ===== 你好,简单玩 =====
调试输出("你好,简单玩!")
等待(1000)
提示("第一个脚本运行成功")
调试输出("当前时间:", 取时间())
循环找色直到目标出现,最多尝试 20 次(每 500ms 一次) · 示例_等到按钮点击.lua-- ===== 等到按钮出现并点击 =====
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
-- 把 "#2F6FED" 换成你的目标颜色(可用截图工具取色)
循环 i = 1 到 20
  局部变量 找到 = 找色(0, 0, 屏幕宽, 屏幕高, "#2F6FED", 90)
  如果 找到 那么
    点击(找到[1], 找到[2])
    调试输出("已点击目标,坐标:", 找到[1], 找到[2])
    跳出
  结束
  等待(500)
结束
调试输出("循环结束")
条件等待:等一个颜色出现(加载完成),再等它消失(页面切换) · 示例_等待颜色.lua-- ===== 等到颜色出现 / 消失 =====
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
-- 等待「完成」按钮的蓝色出现(最多 10 秒)
如果 等到颜色(0, 0, 屏幕宽, 屏幕高, "#2F6FED", 10000, 90) 那么
  调试输出("目标颜色出现了")
否则
  调试输出("超时未出现")
  返回
结束

-- 等待某个遮罩颜色消失(最多 5 秒)
如果 等到颜色消失(0, 0, 屏幕宽, 屏幕高, "#1E1E1E", 5000, 90) 那么
  调试输出("遮罩已消失,可以继续操作")
结束
主色 + 偏移点组合定位,比单点找色更精确 · 示例_多点找色.lua-- ===== 多点找色 =====
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
-- 用截图工具的「多点」模式收集点:第一个是主色,其余是偏移点
局部变量 找到 = 多点找色("#FF6B6B", {{10, 0, "#FF6B6B"}, {0, 10, "#FFD93D"}, {-10, 0, "#FF6B6B"}}, 0, 0, 屏幕宽, 屏幕高, 90)
如果 找到 那么
  调试输出("图标定位:", 找到[1], 找到[2])
  点击(找到[1], 找到[2])
否则
  调试输出("未找到图标")
结束
按文本/ID 找控件并点击——不怕分辨率变化,比坐标稳定得多 · 示例_控件操作.lua-- ===== 控件操作 =====
-- 前提:无障碍服务已开启
如果 等待控件("同意", 5000) 那么
  点击控件("同意")
  调试输出("已点击「同意」")
结束

等待(800)
如果 控件存在("登录") 那么
  点击控件("登录")
结束

调试输出("当前应用:", 取当前应用())

-- 导出当前窗口控件树(调试时查看)
调试输出(控件树导出())
先截屏 → 滤掉背景色 → 再找图,大幅提高找图命中率 · 示例_滤色找图.lua-- ===== 滤色找图 =====
-- 步骤:截图工具里「保存原图」和「滤色预览」调好参数后参考此脚本
局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
captureScreen("res/原图.png")

-- 排除白色背景(保留其他颜色)
图片滤色("res/原图.png", "res/滤色图.png", "#FFFFFF", 90, "排除")

-- 在滤色图上找模板(模板先放到工程 res 目录)
局部变量 找到 = 找图(0, 0, 屏幕宽, 屏幕高, "res/模板.png", 85)
如果 找到 那么
  调试输出("模板位置:", 找到[1], 找到[2])
  点击(找到[1], 找到[2])
否则
  调试输出("未找到模板,请检查滤色参数")
结束
文件读写 + 分割文本 + 循环处理,典型的数据处理流程 · 示例_文本配置.lua-- ===== 文本与配置文件 =====
-- 读取配置(不存在则创建)
局部变量 内容 = 读文件("配置.txt")
如果 内容 == 空 那么
  写文件("配置.txt", "苹果,香蕉,橙子,葡萄")
  内容 = "苹果,香蕉,橙子,葡萄"
  调试输出("已创建默认配置")
结束

局部变量 列表 = 分割文本(内容, ",")
调试输出("共", 取表长度(列表), "项水果")

循环 i = 1 到 取表长度(列表)
  调试输出("第", i, "项:", 列表[i])
结束

调试输出("MD5:", MD5加密(内容))
随机点击 + 随机延时,让操作节奏更接近真人(防机械化检测) · 示例_随机操作.lua-- ===== 随机化操作 =====
局部变量 次数 = 随机整数(3, 8)
调试输出("本次执行", 次数, "次随机操作")
计时开始()

循环 i = 1 到 次数
  -- 在 (100, 300) 到 (500, 800) 区域内随机点
  随机点击(100, 300, 500, 800)
  随机延时(500, 1500)
结束

调试输出("完成,耗时:", 取耗时(), "毫秒")
GET / POST 请求,返回响应文本(需要网络) · 示例_http请求.lua-- ===== HTTP 请求(英文直调 httpRequest)=====
-- GET 请求
局部变量 响应 = httpRequest("https://httpbin.org/get")
如果 文本长度(响应) > 0 那么
  调试输出("GET 响应长度:", 文本长度(响应))
  调试输出("前 100 字:", 取文本片段(响应, 1, 100))
否则
  调试输出("GET 失败(网络不可用?)")
结束

-- POST 请求(第二个参数为请求体)
局部变量 结果 = httpRequest("https://httpbin.org/post", "name=简单玩&version=1")
调试输出("POST 响应长度:", 文本长度(结果))
电量 / 网络 / 方向 / 内存等环境检测,脚本开头做环境判断 · 示例_系统信息.lua-- ===== 系统信息 =====
调试输出("电量:", 取电池电量(), "%")
调试输出("网络:", 取网络类型())
调试输出("方向:", 取屏幕方向())
调试输出("星期:", 取星期())
调试输出("设备:", 取设备型号())
调试输出("系统:", 取系统版本())

局部变量 内存 = 取内存信息()
调试输出("可用内存:", 内存["可用内存"], "MB")

-- 示例:低电量时停止挂机
如果 取电池电量() < 20 那么
  调试输出("电量过低,停止任务")
结束
函数递归调用 + 返回值 + 循环打印,理解函数栈调用 · 示例_递归斐波那契.lua-- ===== 递归函数:斐波那契数列 =====
函数 斐波那契(n)
  如果 n <= 2 那么
    返回 1
  结束
  返回 斐波那契(n - 1) + 斐波那契(n - 2)
结束

-- 打印前 12 项(F(1)=1, F(2)=1, F(3)=2 ...)
循环 i = 1 到 12
  调试输出("F(" + i + ") = " + 斐波那契(i))
结束
调试输出("递归调用完成")
表(数组)操作 + 双层循环 + 相邻交换,元素间比较排序 · 示例_冒泡排序.lua-- ===== 冒泡排序 =====
局部变量 数据 = {5, 2, 9, 1, 7, 3, 8, 4, 6}
调试输出("排序前:", 合并文本(数据, ","))

局部变量 长度 = 取表长度(数据)
循环 i = 1 到 长度 - 1
  循环 j = 1 到 长度 - i
    如果 数据[j] > 数据[j + 1] 那么
      局部变量 临时 = 数据[j]
      数据[j] = 数据[j + 1]
      数据[j + 1] = 临时
    结束
  结束
结束

调试输出("排序后:", 合并文本(数据, ","))
自定义函数封装重复操作 + 多点找色精确定位 + 超时容错 · 示例_自动闯关.lua-- ===== 自动化闯关:函数封装 + 多点找色 =====
函数 找并点击(目标颜色, 偏移表)
  局部变量 屏幕宽, 屏幕高 = 取屏幕尺寸()
  循环 尝试 = 1 到 10
    局部变量 位置 = 多点找色(目标颜色, 偏移表, 0, 0, 屏幕宽, 屏幕高, 90)
    如果 位置 那么
      点击(位置[1], 位置[2])
      返回 真
    结束
    等待(500)
  结束
  调试输出("未找到目标:", 目标颜色)
  返回 假
结束

-- 主流程:依次通过关卡,任一步失败则退出
如果 找并点击("#FF5252", {{10, 0, "#FF0000"}, {0, 10, "#AA0000"}}) 那么
  等待(800)
  调试输出("第一关通过")
否则
  返回
结束

如果 找并点击("#4CAF50", {{8, 0, "#388E3C"}}) 那么
  等待(600)
  调试输出("第二关通过")
结束

调试输出("闯关脚本执行完毕")

内置函数大全

共 215 条中文指令,英文名为其别名、脚本中两种写法等价。数据源:FunctionLibrary / BuiltinDictionary / FunctionDocs 注册表,随版本自动更新。

调用其它脚本类 2 条

插入脚本runScript
插入脚本(脚本名)

插入并运行脚本

EXAMPLE
插入脚本("init")
移动悬浮球moveBubble
移动悬浮球(x, y, 透明度, 宽, 高)

移动悬浮球位置

EXAMPLE
移动悬浮球(100, 100, 100, 0, 0)

UI窗口类 16 条

显示窗体showForm
显示窗体(布局名)

显示 UI 窗体

EXAMPLE
显示窗体("主界面")
关闭窗体closeForm
关闭窗体()

关闭当前窗体

EXAMPLE
关闭窗体()
取控件值getControlValue
取控件值(控件ID)

获取控件值(复选框/单选框/开关返回整数 1/0,判断用 == 1 / == 0)

EXAMPLE
调试输出(取控件值("btn1"))
取控件属性
取控件属性(控件ID, 属性)

获取控件属性

EXAMPLE
取控件属性("btn1", "text")
设控件值setControlValue
设控件值(控件ID, 值)

设置控件值

EXAMPLE
设控件值("btn1", "新文本")
设控件属性setControlProperty
设控件属性(控件ID, 属性, 值)

设置控件属性

EXAMPLE
设控件属性("btn1", "text", "新文本")
绑定事件bindControlEvent
绑定事件(控件ID, 事件名, 回调)

绑定控件事件

EXAMPLE
绑定事件("btn1", "click", function() 提示("点击") end)
刷新控件refreshControl
刷新控件(控件ID)

刷新控件显示

EXAMPLE
刷新控件("btn1")
加载布局loadLayout
加载布局(布局名)

加载 UI 布局

EXAMPLE
加载布局("main")
列出布局listLayouts
列出布局()

返回布局名列表

EXAMPLE
调试输出(列出布局())
保存布局saveLayout
保存布局(布局名)

保存当前布局

EXAMPLE
保存布局("main")
加入表项addListItem
加入表项(控件ID, 索引, 文本)

添加列表项

EXAMPLE
加入表项("list1", -1, "新项")
删除表项removeListItem
删除表项(控件ID, 索引)

删除列表项

EXAMPLE
删除表项("list1", 0)
创建悬浮窗
创建悬浮窗(x, y, w, h, 背景透明度, 关闭毫秒, 标题, 文字, 字体色, 显示方式, 窗口透明度)

创建悬浮窗

EXAMPLE
创建悬浮窗(0, 0, 200, 100, 200, 0, "标题", "内容", "#FFFFFF", 0, 255)
更新悬浮窗文字
更新悬浮窗文字(标题, 文字)

更新悬浮窗文字

EXAMPLE
更新悬浮窗文字("标题", "新内容")
关闭悬浮窗
关闭悬浮窗(标题)

关闭悬浮窗

EXAMPLE
关闭悬浮窗("标题")

图色类 29 条

取色getColor
取色(x, y)

取屏幕像素颜色,返回 #RRGGBB

EXAMPLE
局部变量 c = 取色(100, 200)
找色findColor
找色(x1, y1, x2, y2, 颜色, 相似度)

区域内找颜色,返回坐标表或空

EXAMPLE
局部变量 p = 找色(0, 0, 720, 1280, "#FF0000", 90)
多点找色findMultiColor
多点找色(颜色, 偏移表, x1, y1, x2, y2, 相似度)

主色+偏移点组合精确找色

EXAMPLE
多点找色("#FF0000", {{10,0,"#00FF00"}}, 0, 0, 720, 1280, 90)
找色扩展findColorEx
找色扩展(x1, y1, x2, y2, 颜色, 相似度)

找所有匹配位置,返回坐标表

EXAMPLE
局部变量 列表 = 找色扩展(0, 0, 720, 1280, "#00FF00", 90)
比色compareColor
比色(x, y, 颜色, 相似度)

比较像素颜色是否匹配,返回真/假

EXAMPLE
如果 比色(100, 200, "#FFFFFF", 90) 那么
取色点个数getColorNum
取色点个数(x1, y1, x2, y2, 颜色, 相似度)

统计匹配像素数量

EXAMPLE
调试输出(取色点个数(0, 0, 720, 1280, "#FF0000", 90))
区域截图captureRegion
区域截图(x1, y1, x2, y2, 路径)

截取指定区域保存

EXAMPLE
区域截图(0, 0, 500, 800, "/res/图片/b.png")
找图findImage
找图(x1, y1, x2, y2, 图片, 相似度, 方向)

区域内找图片,命中返回坐标并落位找到表

EXAMPLE
如果 找图(0, 0, 720, 1280, "确定.png") 那么
    点击xy()
全分辨率找图findImageFull
全分辨率找图(x1, y1, x2, y2, 模板, 最小匹配点数, 指序, 按下毫秒)

多尺度智能特征匹配找图,可跨分辨率;传指序则命中一步点击(真/假),不传只返回位置表

EXAMPLE
如果 全分辨率找图(0, 0, 720, 1280, "图标", 10, 0) 那么 调试输出("已点击") 结束
找图全部findImageAll
找图全部(x1, y1, x2, y2, 图片, 相似度, 方向)

找所有命中位置,返回数组表

EXAMPLE
局部变量 结果 = 找图全部(0, 0, 720, 1280, "按钮.png")
滤色找图findImageFiltered
滤色找图(x1, y1, x2, y2, 图片, 颜色, 相似度, 方向)

滤色模板+找图一步完成

EXAMPLE
滤色找图(0, 0, 720, 1280, "/sdcard/icon.png", "#FFFFFF", 90, 0)
取图尺寸getImageSize
取图尺寸(路径)

返回图片宽和高

EXAMPLE
局部变量 {宽, 高} = 取图尺寸("/sdcard/a.png")
保持屏幕keepScreen
保持屏幕()

保持屏幕常亮

EXAMPLE
保持屏幕()
释放屏幕releaseScreen
释放屏幕()

取消屏幕常亮

EXAMPLE
释放屏幕()
释放图缓存releaseImageCache
释放图缓存()

释放图片内存缓存

EXAMPLE
释放图缓存()
等到颜色waitForColor
等到颜色(x1, y1, x2, y2, 颜色, 超时, 相似度)

等待颜色出现,超时返回假

EXAMPLE
等到颜色(0, 0, 720, 1280, "#FF0000", 5000)
等到颜色消失waitForColorGone
等到颜色消失(x1, y1, x2, y2, 颜色, 超时, 相似度)

等待颜色消失,超时返回假

EXAMPLE
等到颜色消失(0, 0, 720, 1280, "#FF0000", 5000)
等到图片waitForImage
等到图片(x1, y1, x2, y2, 图片, 超时, 相似度)

等待图片出现,超时返回假

EXAMPLE
等到图片(0, 0, 720, 1280, "按钮.png", 5000)
图片缩放resizeImage
图片缩放(路径, 宽, 高)

缩放图片到指定尺寸

EXAMPLE
图片缩放("/sdcard/a.png", 640, 480)
图片裁剪cropImage
图片裁剪(路径, x1, y1, x2, y2)

裁剪图片区域

EXAMPLE
图片裁剪("/sdcard/a.png", 0, 0, 200, 200)
图片转Base64imageToBase64
图片转Base64(路径)

图片转 Base64 字符串

EXAMPLE
局部变量 b = 图片转Base64("/sdcard/a.png")
取图片像素getImagePixel
取图片像素(路径, x, y)

取图片指定像素颜色

EXAMPLE
取图片像素("/sdcard/a.png", 100, 100)
取颜色分量getColorRgb
取颜色分量(颜色)

返回 {红,绿,蓝}

EXAMPLE
局部变量 {红,绿,蓝} = 取颜色分量("#FF0000")
取反色invertColor
取反色(颜色)

返回反色 #RRGGBB

EXAMPLE
取反色("#FF0000")
随机颜色randomColor
随机颜色()

返回随机 #RRGGBB

EXAMPLE
随机颜色()
多图查找findMultiImage
多图查找(图片表, x1, y1, x2, y2, 相似度)

依次找多张图,返回 {索引,x,y} 或 false

EXAMPLE
局部变量 r = 多图查找({"/sdcard/a.png", "/sdcard/b.png"}, 0, 0, 720, 1280)
多图查找全部findAllMultiImage
多图查找全部(图片表, x1, y1, x2, y2, 相似度, 方向)

每张图找所有命中,返回结果数组表

EXAMPLE
局部变量 结果 = 多图查找全部({"a.png","b.png"}, 0, 0, 720, 1280)
图片滤色filterImage
图片滤色(源图, 输出图, 颜色, 相似度, 模式)

按颜色滤色,模式: 保留/排除

EXAMPLE
图片滤色("/sdcard/a.png", "/sdcard/b.png", "#FFFFFF", 90, "保留")
找图点击tapImage
找图点击(x1, y1, x2, y2, 图片, 相似度, 方向)

找图+点击一步完成,命中返回真

EXAMPLE
找图点击(0, 0, 720, 1280, "怪物.png")

手指模拟类 23 条

点击tap
点击(x, y, 时长, 手指ID)

模拟点击;手指ID=0单指三级降级,>0多指evdev直写;需Root

EXAMPLE
点击(500, 800)
双击doubleTap
双击(x, y, 手指ID)

快速双击;手指ID=0单指三级降级,>0多指evdev直写;需Root

EXAMPLE
双击(500, 800)
长按longPress
长按(x, y, 时长, 手指ID)

按住指定毫秒;手指ID=0单指三级降级,>0多指evdev直写;需Root

EXAMPLE
长按(500, 800, 1000)
滑动swipe
滑动(x1, y1, x2, y2, 时长, 手指ID)

从起点滑到终点;手指ID=0单指三级降级,>0多指evdev直写;需Root

EXAMPLE
滑动(300, 1000, 300, 300, 500)
拖动drag
拖动(x1, y1, x2, y2, 时长, 手指ID=0, 是否弹起=0)

从起点拖到终点;手指ID=0单指三级降级,>0多指evdev直写;是否弹起=1挂指;需Root

EXAMPLE
拖动(300, 1000, 300, 300, 500)
手势轨迹gesture
手势轨迹({点表}, 时长)

按坐标序列画手势

EXAMPLE
手势轨迹({{100,100},{200,300}}, 500)
按键keyPress
按键(键码)

模拟按键

EXAMPLE
按键(4)  -- 4=返回键
返回键pressBack
返回键()

模拟返回键

EXAMPLE
返回键()
主页pressHome
主页()

模拟 Home 键

EXAMPLE
主页()
最近任务pressRecents
最近任务()

模拟最近任务键

EXAMPLE
最近任务()
音量加volumeUp
音量加()

音量+

EXAMPLE
音量加()
音量减volumeDown
音量减()

音量-

EXAMPLE
音量减()
输入文本inputText
输入文本(内容)

输入文本到当前焦点

EXAMPLE
输入文本("hello")
启动应用launchApp
启动应用(包名)

启动指定应用

EXAMPLE
启动应用("com.example.app")
关闭应用killApp
关闭应用(包名)

关闭指定应用

EXAMPLE
关闭应用("com.example.app")
取当前应用currentApp
取当前应用()

返回当前前台应用包名

EXAMPLE
调试输出(取当前应用())
随机点击randomTap
随机点击(x1, y1, x2, y2)

区域内随机位置点击

EXAMPLE
随机点击(0, 0, 720, 1280)
随机延时randomSleep
随机延时(最小, 最大)

随机等待毫秒

EXAMPLE
随机延时(100, 500)
贝塞尔手势bezierGesture
贝塞尔手势(点表, 时长)

贝塞尔曲线手势

EXAMPLE
贝塞尔手势({{100,100},{200,300}}, 600)
连点multiTap
连点(x, y, 次数, 手指ID)

连续点击多次;手指ID=0单指三级降级,>0多指evdev直写;需Root

EXAMPLE
连点(500, 800, 5)
单轮盘移动stickMove
单轮盘移动(轮心X, 轮心Y, 目标X, 目标Y, 按住毫秒, 选项表)

按住轮盘推到方向;可配避让/回中;需 Root

EXAMPLE
单轮盘移动(100, 2000, 150, 2005, 3000)
计算轮盘坐标calcStickPoint
计算轮盘坐标(中心X, 中心Y, 半径, 角度)

返回轮盘边缘落点 {X,Y}

EXAMPLE
计算轮盘坐标(100, 2000, 100, 45)
点击xytapXY
点击xy()

点击最近一次找图/找色命中的位置

EXAMPLE
如果 找图(0, 0, 720, 1280, "按钮.png") 那么
    点击xy()

OCR识字类 9 条

区域识字ocr
区域识字(x1, y1, x2, y2, 精度)

区域内 OCR 识别文字

EXAMPLE
局部变量 t = 区域识字(0, 0, 720, 1280, 90)
识字文本ocrText
识字文本(图片路径)

识别图片中文字

EXAMPLE
局部变量 t = 识字文本("/sdcard/a.png")
找字findText
找字(文字, x1, y1, x2, y2, 精度)

区域内找文字,返回坐标或空

EXAMPLE
局部变量 p = 找字("确定", 0, 0, 720, 1280)
区域找字findTextInRegion
区域找字(文字, x1, y1, x2, y2, 精度)

区域内精确找文字

EXAMPLE
区域找字("确定", 0, 0, 720, 1280)
找字扩展findTextEx
找字扩展(文字, x1, y1, x2, y2, 精度)

找所有匹配文字位置

EXAMPLE
找字扩展("确定", 0, 0, 720, 1280)
设置识别引擎setOcrEngine
设置识别引擎(引擎名)

切换 OCR 引擎

EXAMPLE
设置识别引擎("paddle")
取引擎列表getOcrEngines
取引擎列表()

返回可用 OCR 引擎列表

EXAMPLE
调试输出(取引擎列表())
取识字耗时ocrTiming
取识字耗时()

返回 总毫秒,检测毫秒,识别毫秒,冷加载毫秒

EXAMPLE
局部变量 t1,t2,t3,t4 = 取识字耗时()
识别坐标recognizeCoord
识别坐标(x1, y1, x2, y2)

区域内识别坐标数字文字,返回 X,Y 两个值(未识别返回 空;坐标同时落位 找到[X]/[Y])

EXAMPLE
局部变量 x, y = 识别坐标(0, 0, 720, 200)

文件类 21 条

读文件readFile
读文件(路径)

读取文件内容,失败返回空

EXAMPLE
局部变量 c = 读文件("/sdcard/a.txt")
写文件writeFile
写文件(路径, 内容, 模式)

写入文件;模式: 0=覆盖 1=第一行 2=追加

EXAMPLE
写文件("/sdcard/a.txt", "你好", 0)
删文件deleteFile
删文件(路径)

删除文件

EXAMPLE
删文件("/sdcard/a.txt")
建目录makeDir
建目录(路径)

创建目录

EXAMPLE
建目录("/sdcard/test")
删目录deleteDir
删目录(路径)

删除目录

EXAMPLE
删目录("/sdcard/test")
列目录listDir
列目录(路径)

列出目录内容

EXAMPLE
局部变量 f = 列目录("/sdcard")
文件存在fileExists
文件存在(路径)

检查文件是否存在,返回真/假

EXAMPLE
如果 文件存在("/sdcard/a.txt") 那么
重命名renameFile
重命名(旧路径, 新路径)

重命名文件

EXAMPLE
重命名("/sdcard/a.txt", "/sdcard/b.txt")
复制文件copyFile
复制文件(源, 目标)

复制文件

EXAMPLE
复制文件("/sdcard/a.txt", "/sdcard/b.txt")
移动文件moveFile
移动文件(源, 目标)

移动文件

EXAMPLE
移动文件("/sdcard/a.txt", "/sdcard/b.txt")
文件大小fileSize
文件大小(路径)

返回文件大小字节

EXAMPLE
调试输出(文件大小("/sdcard/a.txt"))
取文本行数textLineCount
取文本行数(路径)

统计 UTF-8 文本文件的行数,返回数字;文件不存在返回 0

EXAMPLE
调试输出(取文本行数("/sdcard/a.txt"))
取行文本getLineText
取行文本(路径, 行号)

读取文本文件第 N 行内容(行号从 1 开始);越界或文件不存在返回空文本

EXAMPLE
局部变量 行 = 取行文本("/sdcard/a.txt", 3)
删除行文本deleteLineText
删除行文本(路径, 行号)

删除文本文件第 N 行(行号从 1 开始)并保存回文件;成功返回真,越界/文件不存在/写入失败返回假

EXAMPLE
如果 删除行文本("/sdcard/a.txt", 3) 那么
    调试输出("已删除第 3 行")
结束
ZIP打包zipPack
ZIP打包(源目录, 目标ZIP路径)

压缩目录为 ZIP

EXAMPLE
ZIP打包("/sdcard/test", "/sdcard/test.zip")
ZIP解压zipUnpack
ZIP解压(ZIP路径, 目标目录)

解压 ZIP

EXAMPLE
ZIP解压("/sdcard/test.zip", "/sdcard/test")
取文件时间getFileTime
取文件时间(路径)

返回文件修改时间戳

EXAMPLE
调试输出(取文件时间("/sdcard/a.txt"))
路径拼接joinPath
路径拼接(目录, 文件名)

拼接路径

EXAMPLE
路径拼接("/sdcard", "test", "a.txt")
取文件名getFileName
取文件名(路径)

返回文件名

EXAMPLE
取文件名("/sdcard/test/a.txt")
取扩展名getFileExt
取扩展名(路径)

返回扩展名

EXAMPLE
取扩展名("/sdcard/a.txt")
取父目录getParentPath
取父目录(路径)

返回父目录

EXAMPLE
取父目录("/sdcard/test/a.txt")

文本类 40 条

JSON编码jsonEncode
JSON编码(数据)

数据转 JSON 字符串

EXAMPLE
JSON编码({名字="张三", 年龄=25})
JSON解码jsonDecode
JSON解码(字符串)

JSON 字符串转表

EXAMPLE
局部变量 t = JSON解码('{"a":1}')
XML解析xmlParse
XML解析(XML字符串)

XML 转表

EXAMPLE
局部变量 t = XML解析("<a>1</a>")
读配置iniRead
读配置(INI字符串)

解析 INI 文本为表

EXAMPLE
局部变量 t = 读配置(ini文本)
写配置iniWrite
写配置(路径, 表)

写入 INI 文件

EXAMPLE
写配置("/sdcard/a.ini", {section={key="val"}})
分割文本splitText
分割文本(文本, 分隔符)

按分隔符分割为数组

EXAMPLE
局部变量 列表 = 分割文本("a,b,c", ",")
合并文本joinText
合并文本(文本数组, 分隔符)

数组合并为字符串

EXAMPLE
合并文本({"a","b","c"}, ",")
去空白trimText
去空白(文本)

去除首尾空白

EXAMPLE
去空白("  hello  ")
文字过滤filterText
文字过滤(文本, 去除字符可选)

一参=只保留中文/字母/数字(清洗符号空白);二参=删除指定内容:类关键字「字母」「数字」「汉字/中文」「标点/符号」「空白/空格」可组合连写(如"字母数字"),也可混入具体字符逐字删除

EXAMPLE
局部变量 s = 文字过滤("jdi大125,几3万1", "字母数字")   -- "大,几万"
替换文本replaceText
替换文本(文本, 旧字, 新字)

替换文本中的字

EXAMPLE
替换文本("hello world", "world", "lua")
正则匹配regexMatch
正则匹配(文本, 正则式)

正则匹配返回真/假

EXAMPLE
正则匹配("abc123", "[0-9]+")
转小写lowerText
转小写(文本)

转小写

EXAMPLE
转小写("HELLO")
转大写upperText
转大写(文本)

转大写

EXAMPLE
转大写("hello")
格式化formatText
格式化(格式, ...)

格式化字符串

EXAMPLE
格式化("%s-%d", "abc", 123)
文本长度textLength
文本长度(文本)

返回字符数

EXAMPLE
文本长度("hello")
URL编码urlEncode
URL编码(文本)

URL 编码

EXAMPLE
URL编码("hello world")
URL解码urlDecode
URL解码(文本)

URL 解码

EXAMPLE
URL解码("hello%20world")
十六进制编码hexEncode
十六进制编码(文本)

文本转十六进制

EXAMPLE
十六进制编码("abc")
文本包含containsText
文本包含(文本, 子串)

检查子串是否存在

EXAMPLE
文本包含("hello", "ell")
取文本片段midText
取文本片段(文本, 起始, 长度)

截取子串

EXAMPLE
取文本片段("hello", 2, 3)
正则替换regexReplace
正则替换(文本, 正则, 替换为)

正则替换

EXAMPLE
正则替换("abc123", "[0-9]+", "X")
文本统计textCount
文本统计(文本, 目标)

统计目标出现次数

EXAMPLE
文本统计("abcabc", "bc")
反转文本reverseText
反转文本(文本)

反转字符串

EXAMPLE
反转文本("hello")
首字母大写capitalizeText
首字母大写(文本)

首字母转大写

EXAMPLE
首字母大写("hello")
填充文本padText
填充文本(文本, 长度, 填充字符)

填充到指定长度

EXAMPLE
填充文本("7", 4, "0")
取小数点后formatNumber
取小数点后(数字, 小数位)

格式化数字

EXAMPLE
取小数点后(3.14159, 2)
取字符前字符
取字符前字符(文本, 字符, 第N处)

取第N处字符前的文本

EXAMPLE
取字符前字符("a/b/c", "/", 2)
取字符后字符
取字符后字符(文本, 字符, 第N处)

取第N处字符后的文本

EXAMPLE
取字符后字符("a/b/c", "/", 2)
取字符间字符
取字符间字符(文本, 字符A, 字符B, 第N处)

取两字符之间的文本

EXAMPLE
取字符间字符("a[x]b[y]c", "[", "]", 1)
数组个数arrCount
数组个数(数组)

返回数组长度

EXAMPLE
数组个数({1,2,3})
数组加数据arrAdd
数组加数据(数组, 值1, 值2, …)

追加元素,返回新长度

EXAMPLE
数组加数据({1,2}, 3, 4)
数组删数据arrRemove
数组删数据(数组, 位置)

删除指定位置,返回剩余个数

EXAMPLE
数组删数据({1,2,3}, 2)
数组提取数据arrGet
数组提取数据(数组, 位置)

取指定位置的值

EXAMPLE
数组提取数据({1,2,3}, 2)
数组排序arrSort
数组排序(数组, 降序)

排序数组,返回新数组

EXAMPLE
数组排序({3,1,2}, 假)
字符转整数toNum
字符转整数(文本)

文本转整数,转不了返回0

EXAMPLE
字符转整数("1254")
整数转字符toStr
整数转字符(值)

整数转文本

EXAMPLE
整数转字符(1234)
字符转浮点数toFloat
字符转浮点数(文本)

文本转浮点,转不了返回0.0

EXAMPLE
字符转浮点数("12.5")
浮点数转字符floatToStr
浮点数转字符(值)

浮点转文本

EXAMPLE
浮点数转字符(12.5)
浮点数转整数floatToInt
浮点数转整数(值)

浮点转整数(四舍五入)

EXAMPLE
浮点数转整数(12.7)
整数转浮点数intToFloat
整数转浮点数(值)

整数转浮点

EXAMPLE
整数转浮点数(12)

流程控制类 6 条

计时开始startTimer
计时开始()

复位全局秒表从零计时(墙上时间,改系统时间会影响),配合 取耗时 使用

EXAMPLE
计时开始()
取耗时getElapsed
取耗时()

返回距上次 计时开始 的毫秒数;未调用过计时开始返回 0

EXAMPLE
调试输出("耗时:", 取耗时(), "毫秒")
延时到sleepUntil
延时到(时间戳)

睡到指定毫秒时间戳再继续(已过点立即返回真);停止脚本会中断并报「已停止」

EXAMPLE
延时到(时间戳() + 5000)
随机坐标randomPoint
随机坐标(x1, y1, x2, y2)

区域内随机坐标,返回 {x,y}

EXAMPLE
局部变量 {x,y} = 随机坐标(0, 0, 720, 1280)
重试执行safeExec
重试执行(函数, 次数)

失败自动重试

EXAMPLE
重试执行(function() 找图(...) end, 3)
停止运行stopScript
停止运行()

停止整个脚本运行

EXAMPLE
停止运行()

扩展类 60 条

调试输出print
调试输出(内容)

输出到调试面板

EXAMPLE
调试输出("hello")
调试变量debugVar
调试变量(内容)

输出到变量信息标签

EXAMPLE
调试变量(变量名)
等待sleep
等待(毫秒)

等待指定毫秒

EXAMPLE
等待(1000)
提示toast
提示(内容)

弹出提示 Toast

EXAMPLE
提示("hello")
写日志log
写日志(内容)

写入运行日志

EXAMPLE
写日志("hello")
输入对话框
输入对话框(标题, 提示)

弹出输入框,返回输入文本或空

EXAMPLE
局部变量 s = 输入对话框("输入", "请输入")
确认对话框
确认对话框(标题, 内容)

弹出确认框,返回真/假

EXAMPLE
如果 确认对话框("确认", "确定吗") 那么
POST
POST(地址, 请求头, 内容, 超时毫秒=10000)

POST 请求;超时毫秒可调(100~120000)

EXAMPLE
POST("https://api.example.com", "", "data", 15000)
打开网页openUrl
打开网页(网址)

系统浏览器打开链接

EXAMPLE
打开网页("https://www.baidu.com")
读网页内容fetchUrl
读网页内容(网址, 超时毫秒=10000)

HTTP GET 抓取网页 HTML

EXAMPLE
局部变量 s = 读网页内容("https://example.com")
下载文件
下载文件(URL, 保存路径)

下载文件到本地

EXAMPLE
下载文件("https://x.com/a.png", "/sdcard/a.png")
取时间getTime
取时间()

返回当前时间字符串

EXAMPLE
取时间()
时间戳timestamp
时间戳()

返回当前毫秒时间戳

EXAMPLE
时间戳()
取屏幕尺寸getScreenSize
取屏幕尺寸()

返回 宽,高

EXAMPLE
局部变量 {宽,高} = 取屏幕尺寸()
震动vibrate
震动(时长)

震动指定毫秒

EXAMPLE
震动(100)
执行shellshellExec
执行shell(命令, 是否root)

执行 Shell 命令

EXAMPLE
执行shell("ls /sdcard")
取设备码getDeviceId
取设备码()

返回设备唯一码

EXAMPLE
取设备码()
播放声音playSound
播放声音(路径)

播放音频文件

EXAMPLE
播放声音("/sdcard/a.mp3")
状态栏通知notify
状态栏通知(标题, 内容)

弹出状态栏通知

EXAMPLE
状态栏通知("标题", "内容")
剪贴板读readClipboard
剪贴板读()

读取剪贴板文本

EXAMPLE
局部变量 s = 剪贴板读()
剪贴板写writeClipboard
剪贴板写(文本)

写入剪贴板

EXAMPLE
剪贴板写("hello")
随机整数randomInt
随机整数(最小, 最大)

返回随机整数

EXAMPLE
随机整数(1, 100)
随机小数randomFloat
随机小数(最小, 最大)

返回随机浮点数

EXAMPLE
随机小数(0, 1)
随机文本randomString
随机文本(长度)

返回随机字符串

EXAMPLE
随机文本(8)
MD5加密md5
MD5加密(文本)

MD5 哈希

EXAMPLE
MD5加密("hello")
SHA1加密sha1
SHA1加密(文本)

SHA1 哈希

EXAMPLE
SHA1加密("hello")
Base64编码base64Encode
Base64编码(文本)

Base64 编码

EXAMPLE
Base64编码("hello")
Base64解码base64Decode
Base64解码(文本)

Base64 解码

EXAMPLE
Base64解码("aGVsbG8=")
时间戳转时间formatTimestamp
时间戳转时间(时间戳, 格式)

时间戳转可读时间

EXAMPLE
时间戳转时间(1700000000000, "年/月/日 时:分:秒")
取表长度tableCount
取表长度(表)

返回表元素个数

EXAMPLE
取表长度({a=1,b=2})
取电池电量getBattery
取电池电量()

返回 0~100

EXAMPLE
调试输出(取电池电量())
取网络类型getNetworkType
取网络类型()

返回 wifi/mobile/none

EXAMPLE
调试输出(取网络类型())
取设备型号getDeviceModel
取设备型号()

返回设备型号

EXAMPLE
调试输出(取设备型号())
取系统版本getAndroidVersion
取系统版本()

返回 Android 版本

EXAMPLE
调试输出(取系统版本())
取屏幕亮度getScreenBrightness
取屏幕亮度()

返回 0~255

EXAMPLE
调试输出(取屏幕亮度())
设置屏幕亮度setScreenBrightness
设置屏幕亮度(值)

设置亮度 0~255

EXAMPLE
设置屏幕亮度(128)
存储空间getStorageSpace
存储空间()

返回剩余 MB

EXAMPLE
调试输出(存储空间())
取屏幕密度getScreenDensity
取屏幕密度()

返回屏幕密度

EXAMPLE
调试输出(取屏幕密度())
震动模式vibratePattern
震动模式(毫秒数组, 重复次数)

自定义震动模式

EXAMPLE
震动模式({500,200}, -1)
语音播报speak
语音播报(文本)

TTS 朗读

EXAMPLE
语音播报("你好")
停止播报stopSpeak
停止播报()

停止 TTS

EXAMPLE
停止播报()
AES加密aesEncrypt
AES加密(文本, 密钥)

AES 加密返回 Base64

EXAMPLE
AES加密("hello", "key123")
AES解密aesDecrypt
AES解密(密文, 密钥)

AES 解密

EXAMPLE
AES解密(密文, "key123")
下拉通知栏pullNotification
下拉通知栏()

下拉通知栏

EXAMPLE
下拉通知栏()
关闭通知栏closeNotification
关闭通知栏()

关闭通知栏

EXAMPLE
关闭通知栏()
分屏切换toggleSplitScreen
分屏切换()

切换分屏

EXAMPLE
分屏切换()
剪贴板图片保存readClipboardImage
剪贴板图片保存(保存路径)

保存剪贴板图片

EXAMPLE
剪贴板图片保存("/sdcard/a.png")
锁屏lockScreen
锁屏()

锁屏(需激活设备管理器)

EXAMPLE
锁屏()
激活设备管理器openDeviceAdmin
激活设备管理器()

跳转系统设置激活

EXAMPLE
激活设备管理器()
读取通知getNotification
读取通知(关键词)

读取通知栏消息

EXAMPLE
局部变量 n = 读取通知("快递")
清空通知clearNotifications
清空通知()

清空所有通知

EXAMPLE
清空通知()
取定位getLocation
取定位()

返回 {经度,纬度,精度}

EXAMPLE
局部变量 {经度,纬度} = 取定位()
启动线程runAsync
启动线程(函数或代码, 完成回调?, 线程ID?)

后台线程执行;线程里跑脚本:启动线程(读文件("xxx.lua"), "ID");ID不传自动编号「线程N」;停止线程("ID")单独停

EXAMPLE
启动线程(读文件("task2.lua"), "下载任务")
停止线程stopThread
停止线程(线程ID?)

传ID停止指定线程;不传停止全部「启动线程」的异步任务

EXAMPLE
停止线程("下载任务") 或 停止线程()
取内存信息getMemoryInfo
取内存信息()

返回 {总内存,可用内存,低内存}

EXAMPLE
局部变量 {总内存,可用内存} = 取内存信息()
取息屏时间getScreenTimeout
取息屏时间()

返回息屏超时秒数

EXAMPLE
调试输出(取息屏时间())
取星期getWeekday
取星期()

返回星期一…星期日

EXAMPLE
调试输出(取星期())
取两个日期差dateDiff
取两个日期差(日期1, 日期2)

两个日期相差的自然日天数(日期2减日期1,正数=日期2更晚);兼容 yyyy-MM-dd HH:mm:ss 和 yyyy-MM-dd;按日历日对齐忽略时分秒;解析失败返回 0

EXAMPLE
调试输出(取两个日期差("2024-01-01", "2024-01-05"))  -- 输出 4
日期增加天数dateAddDays
日期增加天数(日期, 天数)

给日期加天数返回新日期字符串,格式与输入一致(含时分秒回带,纯日期回纯日期);天数可为负往前推;兼容两种日期格式;解析失败返回空文本

EXAMPLE
调试输出(日期增加天数("2024-01-01", 7))  -- 输出 2024-01-08
取屏幕方向getScreenOrientation
取屏幕方向()

返回 横屏/竖屏

EXAMPLE
调试输出(取屏幕方向())

无障碍类 8 条

控件存在nodeExists
控件存在(文本或id)

检查控件是否存在

EXAMPLE
如果 控件存在("确定") 那么
点击控件clickNode
点击控件(文本或id)

点击控件

EXAMPLE
点击控件("确定")
取控件文本getNodeText
取控件文本(文本或id)

获取控件文本

EXAMPLE
调试输出(取控件文本("标题"))
取控件坐标getNodeBounds
取控件坐标(文本或id)

返回 {x1,y1,x2,y2}

EXAMPLE
局部变量 b = 取控件坐标("确定")
控件输入setNodeText
控件输入(文本或id, 内容)

设置控件文本

EXAMPLE
控件输入("输入框", "hello")
等待控件waitForNode
等待控件(文本或id, 超时)

等待控件出现

EXAMPLE
等待控件("确定", 5000)
等待控件消失waitForNodeGone
等待控件消失(文本或id, 超时)

等待控件消失,超时返回假

EXAMPLE
等待控件消失("确定", 5000)
控件树导出dumpNodeTree
控件树导出()

导出当前窗口控件树文本

EXAMPLE
调试输出(控件树导出())

封装计算类 2 条

计算角度calcAngle
计算角度(起X, 起Y, 终X, 终Y)

返回角度 0~360

EXAMPLE
计算角度(100, 100, 300, 200)
计算直线距离calcDist
计算直线距离(起X, 起Y, 终X, 终Y)

返回两点距离

EXAMPLE
计算直线距离(100, 100, 300, 200)