@xxzhushou
2019-04-03T14:50:05.000000Z
字数 66259
阅读 505911
叉叉脚本
引擎版本:1.9.314
叉叉脚本使用 Lua 语言进行编写,支持Lua的所有语法与基本函数,配合叉叉脚本特有的函数命令,实现找图、找色、触摸等高级功能。
编写脚本前请先学习 lua 的基本语法。
Lua官方手册:http://www.lua.org/manual/5.1/
Lua中文开发手册:http://book.luaer.cn/
叉叉开发者平台:http://dev.xxzhushou.cn/
特别注意:
1.由于安全性方面的考虑,以下函数在叉叉脚本中不予以支持:
debub库所有函数、io.tmpfile、io.popen、os.execute、os.exit、os.remove、os.rename、os.tmpname
2.io.open的用法比较特殊,参数中不能填写具体路径,只能是文件名,比如:
io.open('aa.txt') 是正确的,io.open('../../../aa.txt')则运行会报错。
另外,io库支持公共文件夹,比如io.input('[public]xx.txt'),就会在[tengine]/public下读取xx.txt这个文件。
脚本文件格式支持说明:
叉叉助手/IPA精灵 | 开发助手 | 说明 | 生成方式 | |
---|---|---|---|---|
xsp0 | 不支持 | 支持 | 主要用于开发调试,没有加密处理 | IDE生成或者打包工具 |
xsp1 | 支持 | 支持 | 主要用于不开源的脚本免费分享,有加密处理 | 上传后台直接加密 |
xsp2 | 支持 | 不支持 | 在国内开发者平台上架后,下载到叉叉助手,动态加密 | 在用户下载时生成 |
*iOS可使用ifunbox等工具将脚本文件复制到设备
开发助手
Android:/sdcard/xsp/
iOS(开发助手版本>= 1.0.10):/var/mobile/Library/XXIDEHelper/xsp/
iOS(开发助手版本<1.0.10):/Library/ApplicationSupport/XXIDEHelper/xsp/
叉叉助手
Android:/sdcard/com.xxAssistant/script/
iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/LocalLuas/
iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/LocalLuas/
IPA精灵
IPA精灵:应用文件夹/Documents/Lua/LocalLuas
开发助手
Android(引擎版本>=1.7.2):/data/data/com.xxscript.idehelper/tengine/public
Android(引擎版本<1.7.2):/data/data/com.xxscript.idehelper/cache/tengine/public
iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp/public
iOS(开发助手版本<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp/public
叉叉助手
Android(引擎版本>=1.7.2):/data/data/com.xxAssistant/tengine/public
Android(引擎版本<1.7.2):/data/data/com.xxAssistant/cache/tengine/public
iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/Luas/Temp/public
iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/Luas/Temp/public
IPA精灵
IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/public
开发助手
Android(引擎版本>=1.7.2):/data/data/com.xxscript.idehelper/tengine/public
Android(引擎版本<1.7.2):/data/data/com.xxscript.idehelper/cache/tengine/public
iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp
iOS(开发助手<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp
叉叉助手
Android(引擎版本>=1.7.2):/data/data/com.xxAssistant/tengine/public
Android(引擎版本<1.7.2):/data/data/com.xxAssistant/cache/tengine/public
iOS(叉叉版本>=2.5.0):/var/mobile/Library/XXAssistant/Lua/Luas/Temp
iOS(叉叉版本<2.5.0):/Library/Application Support/XXAssistant/Lua/Luas/Temp
IPA精灵
IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/
开发助手
Android:/sdcard/com.xxscript.idehelper/tengine/log/user/脚本名.log
iOS:/tmp/user/脚本名.log
叉叉助手
Android:/sdcard/com.xxAssistant/tengine/log/user/脚本id.log
Android免Root:/sdcard/com.noroot/tengine/log/user/脚本id.log
iOS:/tmp/user/脚本id.log
叉叉小精灵
Android:/sdcard/小精灵包名/tengine/log/user/脚本id.log
IPA精灵
IPA精灵:应用文件夹/Document/Temp/脚本id.log
IPA精灵(开发版):应用文件夹/Document/Temp/脚本名.log
戳这里:https://www.zybuluo.com/xxzhushou/note/726742
戳这里:https://www.zybuluo.com/xxzhushou/note/755911
API接口 | 支持状态 | 说明 |
---|---|---|
isPrivateMode | 新增 | 返回值1、0;1-越狱/root环境;0-免越狱/免root环境; |
runApp 运行应用 | 不支持 | 无效,返回非0 |
closeApp 关闭应用 | 不支持 | 无效,无返回值 |
setWifiEnable 设置无线局域网开关 | 不支持 | 无效,返回false |
setAirplaneMode 设置飞行模式开关 | 不支持 | 无效,返回false |
setBTEnable 设置蓝牙开关 | 不支持 | 无效,返回false |
lockDevice 锁定设备 | 不支持 | 无效,无返回值 |
unlockDevice 解锁设备 | 不支持 | 无效,无返回值 |
deviceIsLock 设备锁定状态 | 不支持 | 无效,返回0-回未锁定 |
pressHomeKey 模拟主屏幕按键 | 不支持 | 无效,无返回值 |
doublePressHomeKey 双击HOME键 | 不支持 | 无效,无返回值 |
appIsRunning 检测应用是否运行 | 支持,有修改 | 参数包名是该游戏返回1-目标应用运行中,否则返回0-目标应用未运行 |
isFrontApp 判断是否为前台应用 | 支持,有修改 | 参数包名是该游戏返回1-在前台,否则返回0-不在前台 |
frontAppName 获取前台应用识别ID | 支持,有修改 | 只能返回重打包游戏的包名 |
其他接口 | 支持 |
函数功能:脚本使用触摸函数前必须调用,以指定应用程序以及坐标系
函数语法:
init(appid, rotate)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
appid | 文本型 | 目标程序的应用ID,当填写"0"时,自动使用当前运行的应用 |
rotate | 整数型 | 屏幕方向,0 - 竖屏, 1 - Home键在右边, 2 - Home键在左边 |
返回值:无
脚本实例:
init("com.apple.Music", 0); --以应用 "com.apple.Music" 竖屏初始化
init("0", 1); --以当前应用 Home 键在右初始化
函数功能:发送触摸事件
函数语法:
touchDown(index, x, y)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
index | 整数型 | 手指序号,用于多点触控中标记多只手指,分别控制它们的移动 |
x,y | 整数型 | 屏幕坐标 |
返回值:无
脚本实例:
touchDown(1, 150, 150) --ID为1的手指在坐标(150,150)处按下
mSleep(200) --延时200毫秒
touchUp(1, 150, 150) --ID为1的手指抬起
function tap(x, y)
touchDown(0, x, y);
mSleep(200);
touchUp(0, x, y);
end
tap(100,100); --调用:点击坐标为100,100的点
注意事项:
需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。
函数功能:发送触摸事件
函数语法:
touchMove(index, x, y)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
index | 整数型 | 手指序号,用于多点触控中标记多只手指,分别控制它们的移动 |
x,y | 整数型 | 屏幕坐标 |
返回值:无
脚本实例:
touchDown(1, 150, 550); --在 (150, 550) 按下
for i = 0, 200, 10 do --使用for循环连续滑动
touchMove(1, 150 + i, 550);
mSleep(150); --延迟
end
touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
touchDown(1, 100, 100); --ID为1的手指在 (100, 100) 按下
touchDown(2, 300, 500); --ID为2的手指在 (300, 500) 按下
mSleep(50);
for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离
touchMove(1, 200 - i, 400 - i);
touchMove(2, 300 + i, 500 + i);
mSleep(50);
end
touchUp(1, 200 - 100, 400 - 100);
touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指
注意事项:
需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。
函数功能:发送触摸事件
函数语法:
touchUp(index, x, y)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
index | 整数型 | 手指序号,用于多点触控中标记多只手指,分别控制它们的移动 |
x,y | 整数型 | 屏幕坐标 |
返回值:无
脚本实例:
touchDown(1, 150, 550); --在 (150, 550) 按下
for i = 0, 200, 10 do --使用for循环连续滑动
touchMove(1, 150 + i, 550);
mSleep(150); --延迟
end
touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
touchDown(1, 100, 100); --ID为1的手指在 (100, 100) 按下
touchDown(2, 300, 500); --ID为2的手指在 (300, 500) 按下
mSleep(50);
for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离
touchMove(1, 200 - i, 400 - i);
touchMove(2, 300 + i, 500 + i);
mSleep(50);
end
touchUp(1, 200 - 100, 400 - 100);
touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指
注意事项:
需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。
函数功能:调用该函数后,将等待用户完成一次或多次屏幕点击,并返回点击的坐标
函数语法:
results = catchTouchPoint(touchCount)
x,y = catchTouchPoint()
参数说明:
参数 | 类型 | 说明 |
---|---|---|
touchCount | 整数型 | 所需获取的 点/坐标 个数 |
返回值 | 类型 | 说明 |
---|---|---|
x,y | 整数型 | 单次点击时,返回该点击对应的屏幕坐标 |
results | table型 | 当touchCount参数有效时,将返回一个包含所有点击坐标的table |
脚本实例:
dialog("请点击屏幕一次", 0);
x,y = catchTouchPoint();
mSleep(1000);
dialog("x:"..x.." y:"..y, 0);
local results = catchTouchPoint(3);
for i = 1, #results do
sysLog("第"..i.."个坐标为:"..i..",x="..results[i].x..",y="..results[i].y);
end
注意事项:
1.此函数触发后将一直等待用户完成屏幕点击,并阻止脚本继续运行。
2.此函数获取到的坐标为竖屏坐标,横屏情况需要自行转换。
3.此函数有较小的延迟,连续点击时,请勿点击过快。
函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找
函数语法:
x, y = findColor(
{left, top, right, bottom},
color0,
degree,
hdir,
vdir,
priority
)
x, y = findColor(
{left, top, right, bottom},
"x0|y0|color0,x1|y1|color1(|degree1),x2|y2|color2(-offset2),...",
degree,
hdir,
vdir,
priority
)
x, y = findColor(
{left, top, right, bottom},
{
{x = x0, y = y0, color = color0},
{x = x1, y = y1, color = color1, (degree = degree1)},
{x = x2, y = y2, color = color2, (offset = offset2)},
...
},
degree,
hdir,
vdir,
priority
)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
left, top | 整数型 | [必填]寻找区域左上角顶点屏幕坐标 |
right, bottom | 整数型 | [必填]寻找区域右下角顶点屏幕坐标 |
x0,y0 | 整数型 | [必填]起始点坐标值,填写0,0时使用相对坐标体系,填写非0坐标则根据所填绝对坐标换算 |
color0 | 整数型 | [必填]起始点颜色的十六进制颜色值 |
x1,y1 | 整数型 | [选填]偏移位置的坐标值 |
color1 | 整数型 | [选填]偏移位置需要匹配颜色的十六进制颜色值 |
degree1 | 整数型 | [选填]偏移位置找色精度,范围:1 ~ 100,当是100时为完全匹配 |
offset1 | 整数型 | [选填]偏移位置找色偏色值,十六进制颜色值,当是000000时为完全匹配 |
degree | 整数型 | [必填]全局找色精度,范围:1 ~ 100,当是100时为完全匹配 |
hdir | 整数型 | [选填]水平搜索方向,0表示从左到右,1表示从右到左,默认为0 |
vdir | 整数型 | [选填]垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 |
priority | 整数型 | [选填]搜索优先级,0表示水平优先,1表示垂直优先,默认为0 |
说明:
1.起始点坐标值填写0,0时,偏移位置坐标值使用相对坐标;填写为非0,0的坐标时,则认为偏移位置坐标为绝对坐标,找色时,将根据填写的绝对坐标换算出的相对坐标进行寻找。
2.偏移位置颜色的偏色值或精度可任意选用,同时填写了偏色值和精度时,将以偏色为准,忽略精度值。
3.个别偏移位置颜色偏色值或精度优先于全局找色精度,全局找色精度对未指定偏色或精度的颜色有效。
返回值 | 类型 | 说明 |
---|---|---|
x,y | 整数型 | 找到的点坐标,如未找到则返回 -1,-1 |
脚本实例:
x, y = findColor({50, 50, 300, 300},0x112233)
if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
touchDown(1, x, y); --点击该点
mSleep(50)
touchUp(1, x, y);
else --如找不到符合条件的点
dialog("没找到你要的坐标呢",0);
end
使用以上方法找色时,常常会因为屏幕上有大量符合指定颜色的点而不能找到需要的坐标。该函数通过在寻找到一个符合指定颜色color的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的样式是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。
首先确定一个参照点:
颜色为 0x181F85,坐标为 (268, 802),下表序号1。
记录下来,继续寻找周边的几个参照点,以及与第一个参照点的相对坐标,分别为下表序号2~4:
现在我们找到了需要的所有参照点:
序号 | 颜色 | 坐标 | 相对坐标 |
---|---|---|---|
1 | 0x181F85 | (268, 802) | (0, 0) |
2 | 0x00BBFE | (297, 803) | (29, 1) |
3 | 0x0B6BBE | (371, 798) | (103, -4) |
4 | 0x150972 | (333, 811) | (65, 9) |
应用上述坐标写成多点找色脚本(以下4种任选1种):
x, y = findColor(
{0, 0, 639, 959},
"0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-0x050505,65|9|0x150972")
x, y = findColor(
{0, 0, 639, 959},
{
{x = 0, y = 0, color = 0x181F85},
{x = 29, y = 1, color = 0x00BBFE, degree = 90},
{x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},
{x = 65, y = 9, color = 0x150972}
})
x, y = findColor(
{0, 0, 639, 959},
"268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972")
x, y = findColor(
{0, 0, 639, 959},
{
{x = 268, y = 802, color = 0x181F85},
{x = 297, y = 803 color = 0x00BBFE, degree = 90},
{x = 371, y = 798 color = 0x0B6BBE, offset = 0x050505},
{x = 333, y = 811 color = 0x150972}
})
新旧多点找色API对比:
findColorInRegionFuzzy = function(tcolor, degree, x1, y1, x2, y2, hdir, vdir)
return findColor(
{x1, y1, x2, y2},
tcolor,
degree,
hdir or 0,
vdir or 0
)
end
findMultiColorInRegionFuzzy = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)
return findColor(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
findMultiColorInRegionFuzzy2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})
return findColor(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
关于搜索方向:
hdir | vdir | priority | 区域搜索路径 |
---|---|---|---|
0 | 0 | 0 | 左上角 右上角 左下角 右下角 |
0 | 0 | 1 | 左上角 左下角 右上角 右下角 |
0 | 1 | 0 | 左下角 右下角 左上角 右上角 |
0 | 1 | 1 | 左下角 左上角 右下角 右上角 |
1 | 0 | 0 | 右上角 左上角 右下角 左下角 |
1 | 0 | 1 | 右上角 右下角 左上角 左下角 |
1 | 1 | 0 | 右下角 左下角 右上角 左上角 |
1 | 1 | 1 | 右下角 右上角 左下角 左上角 |
注意事项:
1.未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。
2.该代码应用过程中,建议使用"保持屏幕"优化找色速度。
3.颜色值的十六进制文本中,其顺序为RGB。
4.相对坐标为偏移位置坐标相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。
5.使用此函数时精度参数设置过低或允许的偏色多大,会导致性能大幅下降。
6.支持引擎版本:1.8.30或更新
函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
point = findColors(
{left, top, right, bottom},
color0,
degree,
hdir,
vdir,
priority,
)
point = findColors(
{left, top, right, bottom},
"x0|y0|color0,x1|y1|color1(|degree1),x2|y2|color2(-offset2),...",
degree,
hdir,
vdir,
priority,
)
point = findColors(
{left, top, right, bottom},
{
{x = x0, y = y0, color = color0},
{x = x1, y = y1 color = color1, (degree = degree1)},
{x = x2, y = y2 color = color2, (offset = offset2)},
...
},
degree,
hdir,
vdir,
priority,
)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
left, top | 整数型 | [必填]寻找区域左上角顶点屏幕坐标 |
right, bottom | 整数型 | [必填]寻找区域右下角顶点屏幕坐标 |
x0,y0 | 整数型 | [必填]起始点坐标值,填写0,0时使用相对坐标体系,填写非0坐标则根据所填绝对坐标换算 |
color0 | 整数型 | [必填]起始点颜色的十六进制颜色值 |
x1,y1 | 整数型 | [选填]偏移位置的坐标值 |
color1 | 整数型 | [选填]偏移位置需要匹配颜色的十六进制颜色值 |
degree1 | 整数型 | [选填]偏移位置找色精度,范围:1 ~ 100,当是100时为完全匹配 |
offset1 | 整数型 | [选填]偏移位置找色偏色值,十六进制颜色值,当是000000时为完全匹配 |
degree | 整数型 | [必填]全局找色精度,范围:1 ~ 100,当是100时为完全匹配 |
hdir | 整数型 | [选填]水平搜索方向,0表示从左到右,1表示从右到左,默认为0 |
vdir | 整数型 | [选填]垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 |
priority | 整数型 | [选填]搜索优先级,0表示水平优先,1表示垂直优先,默认为0 |
说明:
1.起始点坐标值填写0,0时,偏移位置坐标值使用相对坐标;填写为非0,0的坐标时,则认为偏移位置坐标为绝对坐标,找色时,将根据填写的绝对坐标换算出的相对坐标进行寻找。
2.偏移位置颜色的偏色值或精度可任意选用,同时填写了偏色值和精度时,将以偏色为准,忽略精度值。
3.个别偏移位置颜色偏色值或精度优先于全局找色精度,全局找色精度对未指定偏色或精度的颜色有效。
返回值 | 类型 | 说明 |
---|---|---|
point | table类型 | 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空 |
返回的 table 为key-value的形式,如下:
point = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}
脚本实例:
point = findColors(
{0, 0, 639, 959},
0x181F85)
if #point ~= 0 then --如果找到符合条件的点
for var = 1, #point do
sysLog(point[var].x..":"..point[var].y)
end
end
point = findColors(
{0, 0, 639, 959},
"0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-050505,65|9|0x150972")
if #point ~= 0 then --如果找到符合条件的点
for var = 1, #point do
sysLog(point[var].x..":"..point[var].y)
end
end
point = findColors(
{0, 0, 639, 959},
{
{x = 0, y = 0, color = 0x181F85},
{x = 29, y = 1, color = 0x00BBFE, degree = 90},
{x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},
{x = 65, y = 9, color = 0x150972}
})
point = findColors(
{0, 0, 639, 959},
"268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972")
point = findColors(
{0, 0, 639, 959},
{
{x = 268, y = 802, color = 0x181F85},
{x = 297, y = 803, color = 0x00BBFE, degree = 90},
{x = 371, y = 798, color = 0x0B6BBE, offset = 0x050505},
{x = 333, y = 811, color = 0x150972}
})
新旧高级多点区域找色API对比:
findMultiColorInRegionFuzzyExt = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)
return findColors(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
findMultiColorInRegionFuzzyExt2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})
return findColors(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
注意事项:
1.高级区域多点找色函数目前最多支持返回99个。
2.支持引擎版本:1.8.30或更新
函数功能:在指定区域中,寻找符合指定颜色的坐标,模糊查找。(请使用findColor函数代替)
函数语法:
x, y = findColorInRegionFuzzy(color, degree, x1, y1, x2, y2,hdir,vdir)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
color | 整数型 | 将要找的十六进制颜色值 |
degree | 整数型 | 寻找精度,范围:1 ~ 100,当是100时为完全匹配 |
x1,y1 | 整数型 | 欲寻找的区域左上角顶点屏幕坐标 |
x2,y2 | 整数型 | 欲寻找的区域右下角顶点屏幕坐标 |
hdir | 整数型 | 水平搜索方向,0表示从左到右,1表示从右到左,默认为0 |
vdir | 整数型 | 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 |
返回值 | 类型 | 说明 |
---|---|---|
x,y | 整数型 | 找到的点坐标,如未找到则返回 -1,-1 |
脚本实例:
x, y = findColorInRegionFuzzy(0x112233, 100, 50, 50, 300, 300);
if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
touchDown(1, x, y); --点击该点
mSleep(50)
touchUp(1, x, y);
else --如找不到符合条件的点
dialog("没找到你要的坐标呢",0);
end
for deg = 100, 70, -1 do --使用 for 循环不断降低精确度
x, y = findColorInRegionFuzzy(0xffffff, deg, 50, 50, 300, 300);
if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点
touchDown(1, x, y); --点击该点
mSleep(50)
touchUp(1, x, y);
break; --跳出循环
end
end
dialog("噢天哪!还是没找到",0);
注意事项:
1.未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。
2.该代码应用过程中,建议使用"保持屏幕"优化找色速度。
函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找。(请使用findColor函数代替)
函数语法:
x, y = findMultiColorInRegionFuzzy(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
color | 整型 | 欲寻找的参照点颜色 |
posandcolor | 文本型 | 周边点颜色参数 |
degree | 整数型 | 寻找精度,范围:1 ~ 100,当是100时为完全匹配 |
x1, y1 | 整数型 | 欲寻找的区域左上角顶点屏幕坐标 |
x2,y2 | 整数型 | 欲寻找的区域右下角顶点屏幕坐标 |
hdir | 整数型 | 水平搜索方向,0表示从左到右,1表示从右到左,默认为0 |
vdir | 整数型 | 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 |
返回值 | 类型 | 说明 |
---|---|---|
x, y | 整数型 | 返回符合条件的参照点的坐标,如未找到则返回 -1,-1 |
脚本实例:
使用“区域模糊找色”函数时,常常会因为屏幕上有大量符合指定颜色的点而不能找到需要的坐标。该函数通过在寻找到一个符合指定颜色color的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的样式是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。
首先确定一个参照点:
颜色为 0x181F85,坐标为 (268, 802),下表序号1。
记录下来,继续寻找周边的几个参照点,以及与第一个参照点的相对坐标,分别为下表序号2~4:
现在我们找到了需要的所有参照点:
序号 | 颜色 | 坐标 | 相对坐标 |
---|---|---|---|
1 | 0x181F85 | (268, 802) | (0, 0) |
2 | 0x00BBFE | (297, 803) | (29, 1) |
3 | 0x0B6BBE | (371, 798) | (103, -4) |
4 | 0x150972 | (333, 811) | (65, 9) |
应用上述坐标写成多点找色脚本:
x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE,103|-4|0x0B6BBE,65|9|0x150972", 100, 0, 0, 639, 959);
注意事项:
1.posandcolor 参数中的坐标为相对坐标。
2.颜色值的十六进制文本中,其顺序为RGB。
3.相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。
4.使用此函数时精度参数设置过低,会导致性能大幅下降。
函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找。(请使用findColor函数代替)
函数语法:
x, y = findMultiColorInRegionFuzzy2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
color | 整型 | 欲寻找的参照点颜色 |
posandcolor | table型 | 周边点颜色参数 |
degree | 整数型 | 寻找精度,范围:1 ~ 100,当是100时为完全匹配 |
x1, y1 | 整数型 | 欲寻找的区域左上角顶点屏幕坐标 |
x2,y2 | 整数型 | 欲寻找的区域右下角顶点屏幕坐标 |
hdir | 整数型 | 水平搜索方向,0表示从左到右,1表示从右到左,默认为0 |
vdir | 整数型 | 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 |
返回值 | 类型 | 说明 |
---|---|---|
x, y | 整数型 | 返回符合条件的参照点的坐标,如未找到则返回 -1,-1 |
脚本实例:
该函数是区域多点找色函数findMultiColorInRegionFuzzy的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。
x, y = findMultiColorInRegionFuzzy2(0x181F85, {{x=29, y=1, color=0x00BBFE},{x=103,y=- 4,color=0x0B6BBE},{x=65,y=9,color=0x150972}}, 100, 0, 0, 639, 959)
函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
point = findMultiColorInRegionFuzzyExt(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
color | 整型 | 欲寻找的参照点颜色 |
posandcolor | 文本型 | 周边点颜色参数 |
degree | 整数型 | 寻找精度,范围:1 ~ 100,当是100时为完全匹配 |
x1, y1 | 整数型 | 欲寻找的区域左上角顶点屏幕坐标 |
x2,y2 | 整数型 | 欲寻找的区域右下角顶点屏幕坐标 |
hdir | 整数型 | 水平搜索方向,0表示从左到右,1表示从右到左,默认为0 |
vdir | 整数型 | 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 |
返回值 | 类型 | 说明 |
---|---|---|
point | table类型 | 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空 |
返回的 table 为key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}
脚本实例:
point = findMultiColorInRegionFuzzyExt(0xcf0000,"-37|3|0x942814,-38|20|0xeba62d,1|54|0xf2b054,28|22|0x8a5707", 90, 97, 220, 903, 701)
if #point ~= 0 then --如果找到符合条件的点
for var = 1,#point do
sysLog(point[var].x..":"..point[var].y)
end
end
注意事项:
1.高级区域多点找色函数目前最多支持返回99个点。
函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找
函数语法:
point = findMultiColorInRegionFuzzyExt2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
color | 整型 | 欲寻找的参照点颜色 |
posandcolor | table型 | 周边点颜色参数 |
degree | 整数型 | 寻找精度,范围:1 ~ 100,当是100时为完全匹配 |
x1, y1 | 整数型 | 欲寻找的区域左上角顶点屏幕坐标 |
x2,y2 | 整数型 | 欲寻找的区域右下角顶点屏幕坐标 |
hdir | 整数型 | 水平搜索方向,0表示从左到右,1表示从右到左,默认为0 |
vdir | 整数型 | 垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 |
返回值 | 类型 | 说明 |
---|---|---|
point | table类型 | 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空 |
返回的 table 为为key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}
脚本实例:
该函数是高级区域多点找色函数findMultiColorInRegionFuzzyExt的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。
point = findMultiColorInRegionFuzzyExt2(0xcf0000, {{x=-37,y=3,color=0x942814},{x=-38,y=20,color=0xeba62d},{x=1,y=54,color=0xf2b054},{x=28,y=22,color=0x8a5707}}, 90, 97, 220, 903, 701)
if #point ~= 0 then
for var = 1,#point do
sysLog(point[var].x..":"..point[var].y)
end
end
注意事项:
1.高级区域多点找色函数目前最多支持返回99个点。
函数功能:获取屏幕某点颜色值
函数语法:
color = getColor(x, y)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
x,y | 整数型 | 将获取颜色值的屏幕坐标 |
返回值 | 类型 | 说明 |
---|---|---|
color | 整数型 | 该点的十进制颜色值RGB |
脚本实例:
if getColor(100, 100) == 0xffffff then
touchDown(1, 100, 100);
touchUp(1, 100, 100);
end
注意事项:
getColor函数获得的颜色值十六进制文本中,实际顺序为RGB
函数功能:获取屏幕某点颜色值R,G,B 值。
函数语法:
color_r, color_g, color_b = getColorRGB(x, y)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
x,y | 整数型 | 将获取颜色值的屏幕坐标 |
返回值 | 类型 | 说明 |
---|---|---|
color_r, color_g, color_b | 整数型 | 该点颜色的RGB值 |
脚本实例:
r,g,b = getColorRGB(100,100); --获取该点的R,G,B值
if r > 200 and b < 150 then --判断颜色强度
touchDown(1,100,100);
touchUp(1,100,100);
end
function isColor(x,y,c,s) --x,y为坐标值,c为颜色值,s为相似度,范围0~100。
local fl,abs = math.floor,math.abs
s = fl(0xff*(100-s)*0.01)
local r,g,b = fl(c/0x10000),fl(c%0x10000/0x100),fl(c%0x100)
local rr,gg,bb = getColorRGB(x,y)
if abs(r-rr)<s and abs(g-gg)<s and abs(b-bb)<s then
return true
end
return false
end
if isColor(963, 961, 0x7b593f,90) then touchDown(963, 961)
mSleep(50)
touchUp(963, 961)
end
函数功能:在指定区域中,寻找指定的图案,返回其左上角顶点坐标,支持模糊查找。
函数语法:
x, y = findImageInRegionFuzzy(picpath, degree, x1, y1, x2, y2, alpha)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
picpath | 文本型 | 将要寻找的图片文件名(需要预先存放于脚本中res文件夹) |
degree | 整数型 | 寻找精度,范围:1 ~ 100,当是100时为完全匹配 |
x1,y1 | 整数型 | 欲寻找的区域左上角顶点屏幕坐标 |
x2,y2 | 整数型 | 欲寻找的区域右下角顶点屏幕坐标 |
alpha | 整数型 | 忽略的颜色值(透明色) 若无请填 0 |
返回值 | 类型 | 说明 |
---|---|---|
x,y | 整数型 | 找到的图片的左上角顶点坐标,如未找到则返回 -1,-1 |
脚本实例:
x, y = findImageInRegionFuzzy("test_alpha.png", 100, 0, 0, 320, 480, 0xffffff);
if x ~= -1 and y ~= -1 then --忽略背景色白色的情况下找到符合条件的图片则点击
touchDown(1, x, y);
mSleep(50)
touchUp(1, x, y);
else --如果没找到符合条件的
dialog("没找到 ╮(╯▽╰)╭",0);
end
函数功能:截取屏幕中指定区域的图像并生成指定格式的图片文件
函数语法:
snapshot(picname, x1, y1, x2, y2, quality)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
picname | 文本型 | 截图保存的文件名 |
x1,y1 | 整数型 | 欲截取的区域左上角顶点屏幕坐标 |
x2,y2 | 整数型 | 欲截取的区域右下角顶点屏幕坐标 |
quality | 数字型 | 当截图格式选为jpg时,可用此参数控制图片质量,此参数值为大于0且小于等于1的值 |
返回值:无
脚本实例:
current_time = os.date("%Y-%m-%d", os.time());
snapshot(current_time..".png", 0, 0, 1079, 1919); --截图并以当前时间戳命名
snapshot('[public]'..i..".jpg", 0, 0, 1079, 1919, 0.9); --使用jpg格式截图,质量为0.9
注意事项:
1.保存图片的格式可为 bmp, jpg, png,推荐选择 png。
2.截图时,如使用全屏截图,右下角顶点坐标最大为当前分辨率最大值,否则会出现越界错误。
3.默认图片路径为脚本私有文件夹,文件相同将会被覆盖
4.本文实例中 os.date 与 os.time 为 Lua 基本库函数,请查阅附录 Lua 操作系统函数库。
5.".." 为字符串连接操作符,可以将字符串变量、常量连接在一起。
6.截图保存路径:
- 开发助手
Android:/data/data/com.xxscript.idehelper/tengine/public
iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp
iOS(开发助手<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp
- 叉叉助手
android: /data/data/com.xxAssistant/tengine/public
iOS(叉叉版本>=2.5.0):/var/mobile/Library/XXAssistant/Lua/Luas/Temp
iOS(叉叉版本<2.5.0):/Library/Application Support/XXAssistant/Lua/Luas/Temp
- IPA精灵
IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/
7.公共目录路径:
- 开发助手
Android:/data/data/com.xxscript.idehelper/tengine/public
iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp/public
iOS(开发助手版本<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp/public
- 叉叉助手
Android: /sdcard/com.xxAssistant/tengine/public
iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/Luas/Temp/public
iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/Luas/Temp/public
- IPA精灵
IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/public
8.引擎1.3.0版本增加对公共目录[public]访问支持,截图方向跟随init
函数功能:函数功能:在脚本中保持当前屏幕内容不变,多次调用取色、找色、截图、找图等函数时,直接调用保持的屏幕内容。该函数主要用于优化找图找色函数的效率。
函数语法:
keepScreen(flag)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
flag | 逻辑型 | 保持开关 |
返回值:无
脚本实例:
keepScreen(true);
for k = 1, 640, 10 do
for j = 1, 960, 10 do
--格式化颜色为十六进制文本
color = string.format("%X", getColor(k, j));
--输出系统日志
sysLog("("..k..", "..j..") Color: "..color..".");
end
end
keepScreen(false);
函数功能:向输入框中输入文本
函数语法:
inputText(string)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 将输入的文本以及控制字符 |
返回值:无
脚本实例:
touchDown(1,150,150); --点击输入框获取焦点(假设已知输入框坐标150,150)
mSleep(50)
touchUp(1,150,150);
mSleep(1000);
inputText("#CLEAR#") --删除输入框中的文字(假设输入框中已存在文字)
mSleep(1000);
inputText("Welcome.#ENTER#"); --在输入框中输入字符串"Welcome."并回车
注意事项:
1.使用该函数前,必须先点击输入框获取焦点(指使当前的输入光标停留在某一输入框中)。
2.iOS系统上,该函数不支持第三方输入法(指百度输入法、搜狗输入法等),请切换到系统内置输入法方可使用,对于弹出的窗口,需要先初始化再使用该函数,例如 App Store登录窗口(该窗口识别ID 为"com.apple.springboard"),安卓则无此限制。
3.可使用控制字符,包括 \n、\r、#ENTER#、#CLEAR#;#CLEAR#表示清空,需要注意的是,#ENTER#并非支持在所有应用中使用。
函数功能:加载自定义的点阵字库
函数语法:
index = createOcrDict(dict)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
dict | 文本型/table型 | 字库名,如:dict.txt,需放置于脚本内 res 目录;或table型字库编码 |
返回值 | 类型 | 说明 |
---|---|---|
index | 整数型 | 字库标识,由 createOcrDict 函数返回值生成,ocrText第一个参数需要用到此值 |
脚本实例:
lines = {}
lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'
lines[2] = 'FFFFFC$l$0.0.42$21'
lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'
lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'
lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'
lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26'
local dict = createOcrDict(lines)
--或者可以写成这样的形式 local dict = createOcrDict("dict.txt")
result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果
sysLog('result: ' .. result)
results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标
for k,v in pairs(results) do
sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
end
注意事项:
1.ocr函数不支持多分辨率,不受setScreenScale影响
2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录
3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。
函数功能:识别屏幕上的文字。
函数语法:
result = ocrText(index, x1, y1, x2, y2, {"c0-c1"} , sim, flag, dir)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
index | 整数型 | 字库标识,由 createOcrDict 函数返回值生成 |
x1, y1 | 整数型 | 识别区域左上角顶点屏幕坐标 |
x2, y2 | 整数型 | 识别区域右下角顶点屏幕坐标 |
c0, c1 | 文本型 | 偏色范围,由字库制作中获取,需要与制作字库时所设值保持一致,多组偏色用,分割 |
sim | 整数型 | 精确度,范围 0 - 100 |
flag | 整数型 | 表示选择返回结果的类型, 0 == 字符串形式返回识别结果,1 == table形式返回识别到的结果及其坐标 |
dir | 整数型 | 选填项,表示识别方向,0 == 区域内全部搜索,1 == 横向搜索, 2 ==竖向搜索, 忽略此项则默认为0 |
返回值 | 类型 | 说明 |
---|---|---|
result | 文本型/table型 | 返回识别结果/返回识别到的结果及其坐标 |
脚本实例:
lines = {}
lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'
lines[2] = 'FFFFFC$l$0.0.42$21'
lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'
lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'
lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'
lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26'
local dict = createOcrDict(lines)
--或者可以写成这样的形式 local dict = createOcrDict("dict.txt")
result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果
sysLog('result: ' .. result)
results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标
for k,v in pairs(results) do
sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
end
注意事项:
1.ocr函数不支持多分辨率,不受setScreenScale影响
2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录
3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。
函数功能:载入高级文字识别字库,并指定检测方式
函数语法:
ocr, msg = createOCR({
type = "tesseract",
mode = mode,
path = path,
lang = lang
})
参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | 文本型 | [必填]文字识别类型,暂只支持tesseract,更多ocr引擎逐步支持中 |
mode | 整数型 | [选填]引擎识别模式(参见下表),默认3 |
path | 文本型 | [选填]字库路径,不填默认使用eng字库路径;官方字库扩展路径、自定义路径见下方说明 |
lang | 文本型 | [选填]字库语言文件名称,不填则默认eng(只支持一般的中英+数字+标点符号) |
path 自定义字库,有两种路径选择:
对于自定义字库,有以下几种路径选择:
1. 内置到xsp的res目录下,直接指定res路径:"res/"
2. 下载到public目录下,指定[public]和子路径:"[public]downloads/tessdata/"
3. 使用开发助手/叉叉助手的字库扩展,指定[external]即可:"[external]"
特别注意:下载到public目录的字库路径,traineddata的上层目录必须命名为tessdata
lang 字库语言文件:
1. lang 为.traineddata字库文件名,叉叉助手、开发助手中可下载的字库语言文件有:
chi_sim 简体中文字库
chi_tra 繁体中文字库
eng_ext 英文增强版字库
eng 内置默认精简版中英数字标点字库,免下载可用
2. 识别要求不高或识别数据比较标准,也可以path和lang都不填,使用默认字库eng,只支持一般的中英+数字+标点符号。
字库与语言配置样例:
1. path & lang均不填: 使用内置eng字库
2. path = [external] & lang = eng_ext/chi_sim/chi_tra:叉叉提供的字库扩展(需下载)
3. path = "res/" & lang = dictname(dictname:xsp打包中res目录字库文件名)
引擎识别模式 | 说明 |
---|---|
0 | 仅执行Tesseract,速度最快 |
1 | 仅进行Cube处理,较慢但准确 |
2 | 结合Tesseract和Cube处理,最准确 |
3 | 根据字库配置自动选择 |
返回值 | 类型 | 说明 |
---|---|---|
ocr | 文本型 | ocr实例,创建失败时ocr为nil |
msg | 文本型 | 创建成功返回版本号,创建失败返回错误信息 |
脚本实例:
local ocr, msg = createOCR({
type = "tesseract", -- 指定tesseract引擎
path = "[external]", -- 使用开发助手/叉叉助手的扩展字库,不填默认使用eng字库路径
lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)
})
if ocr ~= nil then
-- ocr 创建成功,使用该实例进行后续识别操作(参见下面函数文档)
sysLog("createOCR succeed: Tesseract-OCR v" .. msg)
else
-- ocr 创建失败,根据msg提示调整
sysLog("createOCR failed: " .. tostring(msg))
end
训练字库:
请参阅:【如何使用Tesseract-OCR(v3.02.02)训练字库】
注意事项:
支持引擎版本:1.8.10或更新
引擎内置Tesseract-OCR版本:3.02.02
函数功能:使用已载入的高级文字识别字库进行识别
函数语法:
local code, text = ocr:getText({
psm = psm,
rect = {x1, y1, x2, y2},
diff = {diff},
data = data,
whitelist = whitelist,
blacklist = blacklist
})
参数说明:
参数 | 类型 | 说明 |
---|---|---|
psm | 整数型 | [选填]int: page segmentation mode(参见下表),默认6 |
rect | table | [必填]{x1, y1, x2, y2} 屏幕的识别范围,越准确越好 |
diff | table | [必填]{"颜色1-误差1", "颜色2-误差2", ...} 色值范围,可以提供多个,供二值化使用 |
data | table | [选填]二值化二维数组,1代表有效数据,其余代表无效数据) |
whitelist | 文本型 | [选填]仅识别为白名单中的字符 |
blacklist | 文本型 | [选填]识别时需排除的字符(对识别时易相互混淆的字符进行排除) |
psm选项 | 说明 |
---|---|
0 | 仅检测方向和文本 |
1 | 自动检测方向和文本(OSD) |
2 | 自动检测,但不进行OSD或OCR处理 |
3 | 自动PSM模式(但不含OSD) |
4 | 所识别图片的字体大小不一 |
5 | 所识别图片当作整块竖向文字区域 |
6 | 所识别图片当作整块横向文字区域 (默认值) |
7 | 所识别图片当作一行文字 |
8 | 所识别图片当作单个词语 |
9 | 所识别图片当作单个圆型围绕的词语 |
10 | 所识别图片当作单个英文/数字字符 |
11 | 尽可能识别更多的字符(无顺序要求) |
12 | 分散稀疏的OSD检测 |
返回值 | 类型 | 说明 |
---|---|---|
code | 整数型 | code = 0: 识别成功;code < 0: 识别失败 |
text | 文本型 | 识别出的字符串(末尾可能有多余的换行或空格),识别失败时,text为对应的错误提示 |
脚本实例:
local ocr, msg = createOCR({
type = "tesseract", -- 指定tesseract引擎
path = "[external]", -- 使用开发助手/叉叉助手的扩展字库
lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)
})
if ocr ~= nil then
string.trim = function(s)
return s:match'^%s*(.*%S)' or ''
end
local code, text = 0, ""
mSleep(1000)
-- 识别屏幕图像内容(例如5/5s设备的当前时间显示)
code, text = ocr:getText({
rect = {249, 6, 249 + 144, 6 + 29},
diff = {"0x000000-0x101010"}, -- 时间颜色为纯黑
whitelist = "0123456789APM:" -- 添加所有可能出现的字符作为白名单
})
-- 输出示例:"code = 0, text = 5:24 PM" (末尾可能有多余换行符,为正常结果,可以参考trim处理)
sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
mSleep(1000)
-- 识别二值化二维数组(单个字符)
code, text = ocr:getText({
psm = 10, -- 所识别图片当作单个英文/数字字符
data = {
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,0,0,0,0,0,0,0,0},
{0,1,0,1,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,1,1,0,0,0,0,0},
{1,0,1,1,0,0,0,0,1,1,1,0,0,0},
{0,1,0,1,0,0,0,0,0,0,1,1,0,0},
{1,1,1,0,0,0,0,0,0,0,1,1,0,0},
{1,0,0,0,0,0,0,0,0,0,1,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,1,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,1,0,0,0,0,0,0,0,1,0,0,0},
{0,1,1,1,0,1,0,0,1,1,1,0,0,0},
{0,0,0,1,1,1,0,1,1,0,0,0,0,0},
{0,0,0,0,0,0,1,0,1,0,0,0,0,0}
},
whitelist = "0123456789" -- 添加白名单为数字类型
})
-- 输出示例:"code = 0, text = 6"
sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
mSleep(1000)
-- 识别二值化二维数组(多个字符)
code, text = ocr:getText({
psm = 7, -- 所识别图片当作一行文字
data = {
{1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0},
{1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0},
{1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0},
{1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1},
{0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0},
{0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0}
},
whitelist = "0123456789"
})
-- 输出示例:"code = 0, text = 53"
sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
else
sysLog("createOCR failed: " .. tostring(msg))
end
特别说明
diff = {"C1-D1", "C2-D2", …} 设置的意义是,当区域内任意一个颜色值Cxy,满足条件 min(Ci - Di, 0x000000) ≤ Cxy ≤ max(Ci + Di, 0xffffff),i = 1, 2, … 的时候,这个位置的颜色就是有效颜色(0xffffff),否则,都是无效颜色(0x000000)。这个处理过程称为二值化,经过这样处理后的二值化数据,提交给OCR识别会更加精确。
注意事项:
支持引擎版本:1.8.10或更新
函数功能:主动释放OCR字库,避免内存峰值过高导致被系统强杀
函数语法:
ocr:release()
参数说明:
使用到字库较大的情况下,为避免内存峰值过高导致被系统强杀,请在OCR使用完毕时调用API释放ocr,否则只能依赖lua的gc自动清理。
脚本实例:
local ocr, msg = createOCR({
type = "tesseract", -- 指定tesseract引擎
path = "[external]", -- 使用开发助手/叉叉助手的扩展字库
lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)
})
local code, text = ocr:getText({
rect = {249, 6, 249 + 144, 6 + 29},
diff = {"0x000000-0x101010"},
whitelist = "0123456789APM:"
})
-- ocr使用完毕,为避免内存峰值过高导致被系统强杀(主要是使用到字库较大的情况下)
-- 建议及时手动释放ocr
ocr:release()
注意事项:
支持引擎版本:1.8.11或更新
函数功能:对当前屏幕指定范围的图像二值化,并转换为table,得到的结果通过去噪或者矩阵运算后,可以提供给ocr:getText()识别成文字
函数语法:
colorTbl = binarizeImage({
rect = {x1, y1, x2, y2},
diff = {diff}
})
参数说明:
参数 | 类型 | 说明 |
---|---|---|
rect | table | [必填]{x1, y1, x2, y2} 屏幕二值化的识别范围,越准确越好 |
diff | table | [必填]{"颜色1-误差1", "颜色2-误差2", ...} 色值范围,可以提供多个,供二值化使用 |
返回值 | 类型 | 说明 |
---|---|---|
colorTbl | 文本型 | 图像二值化后的table |
脚本实例:
colorTbl = binarizeImage({
rect = {30, 80, 53, 101},
diff = {"0xf7d363-0x1f1f1f", "0xefaa29-0x1f1f1f"}
})
-- 输出colorTbl每一行测试转换结果
for _, row in pairs(colorTbl) do
sysLog(table.concat(row, ','))
end
--[[
colorTbl格式类似这样:
{
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,0,0,0,0,0,0,0,0},
{0,1,0,1,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,1,1,0,0,0,0,0},
{1,0,1,1,0,0,0,0,1,1,1,0,0,0},
{0,1,0,1,0,0,0,0,0,0,1,1,0,0},
{1,1,1,0,0,0,0,0,0,0,1,1,0,0},
{1,0,0,0,0,0,0,0,0,0,1,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,1,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,1,0,0,0,0,0,0,0,1,0,0,0},
{0,1,1,1,0,1,0,0,1,1,1,0,0,0},
{0,0,0,1,1,1,0,1,1,0,0,0,0,0},
{0,0,0,0,0,0,1,0,1,0,0,0,0,0}
}
]]--
-- 对colorTbl结果进行可选的去噪或者矩阵运算纠正等处理
-- (假设处理函数是denoising)
colorTbl = denoising(colorTbl)
local ocr, msg = createOCR({
type = "tesseract"
})
-- 使用ocr识别新的colorTbl
local code, text = ocr:getText({
data = colorTbl,
psm = 10 -- 单个字符模式识别
})
sysLog("code = " .. tostring(code) .. ", text = " .. text)
-- 输出结果:code = 0, text = 6
注意事项:
支持引擎版本:1.8.30或更新
函数功能:打开一个应用程序。
函数语法:
flag = runApp(appid)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
appid | 文本型 | 应用程序的应用ID |
返回值 | 类型 | 说明 |
---|---|---|
flag | 整数型 | 0 == 应用启动成功;非0 == 应用启动失败 |
脚本实例:
r = runApp("com.apple.Music");
mSleep(10 * 1000); --等待程序响应
if r == 0 then
closeApp("com.apple.Music");
else
toast("启动应用失败");
end
注意事项:
1.runApp函数需要系统响应时间,响应时间根据机型有所不同,调用此函数需做好延迟或判断。
函数功能:关闭一个应用程序。
函数语法:
closeApp(appid)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
appid | 文本型 | 应用程序的应用ID |
返回值:无
脚本实例:
r = runApp("com.apple.Music");
mSleep(10 * 1000); --等待程序响应
if r == 0 then
closeApp("com.apple.Music");
else
toast("启动应用失败");
end
函数功能:检测应用是否运行
函数语法:
flag = appIsRunning(appid)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
appid | 文本型 | 目标应用程序的应用ID |
返回值 | 类型 | 说明 |
---|---|---|
flag | 整数型 | 0 - 目标应用未运行;1 - 目标应用运行中 |
脚本实例:
flag = appIsRunning("com.xxAssistant"); --检测叉叉助手是否在运行
if flag == 0 then
runApp("com.xxAssistant") --运行叉叉助手
end
注意事项:
此函数将判断目标应用的运行状态,目标应用前台运行或者后台运行返回值都为 1。
函数功能:根据应用ID判断应用是否处于前台。
函数语法:
flag = isFrontApp(appid)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
appid | 文本型 | 待检测的应用程序的应用ID |
返回值 | 类型 | 说明 |
---|---|---|
flag | 整数型 | 0 == 不在前台运行;1 == 在前台运行 |
脚本实例:
while true do
isfront = isFrontApp("com.xxAssistant"); --前台状态
if isfront == 1 then
break
end
toast("请打开叉叉助手");
mSleep(3000)
end
函数功能:获取前台应用程序的应用ID。
函数语法:
appid = frontAppName()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
appid | 文本型 | 返回前台应用程序的应用ID,若无应用处于前台,则返回空字符串 |
脚本实例:
appid = frontAppName();
if appid ~= "com.apple.mobilesafari" then
dialog("请打开 Safari 再运行该脚本!", 5);
mSleep(3000);
lua_exit();
end
函数功能:显示一个自定义的界面,用来接收用户相关的自定义配置。
函数语法:
ret,results = showUI(ui_json)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
ui_json | 文本型 | 自定义界面json格式字符串,或UI目录下的json文件名称 |
返回值 | 类型 | 说明 |
---|---|---|
ret | 整数型 | 返回用户按下的按钮 0 - 取消;1 - 确定 |
results | table类型 | 返回用户输入的多项数据 |
脚本界面通过json格式存储 ,以下是一个包含所有控件及其属性的例子:
{
"style" : "default",
"config" : "save_111.dat",
"width" : 700,
"height" : 1080,
"cancelname" : "Cancel",
"okname" : "Let's Rock",
"cancelscroll" : true,
"countdown":10,
"views" : [
{
"text" : "基本设置",
"type" : "Page",
"views" : [
{
"align" : "center",
"color" : "0,0,225",
"size" : 30,
"bg" : "0,0,0", //RGB格式规定标签的背景色,不指定为透明
"text" : "设置:这是一行文本",
"type" : "Label"
},
{
"id" : "RadioGroup1",
"list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
"select" : "0",
"size" : 30,
"type" : "RadioGroup",
"orientation" : "vertical" //选项排布方式为竖排
},
{
"align" : "left",
"color" : "0,100,0",
"id" : "Edit1",
"kbtype" : "number",
"prompt" : "这是提示文本",
"size" : 25,
"text" : "这是预输入文本",
"type" : "Edit"
},
{
"id" : "CheckBoxGroup1",
"list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
"select" : "3@5",
"size" : 30,
"type" : "CheckBoxGroup",
"orientation" : "horizontal" //选项排布方式为智能横排
},
{
"id" : "ComboBox1",
"list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7",
"select" : "1",
"size" : 30,
"type" : "ComboBox"
},
{
"src" : "b.png", //这是来源为本地文件的图片
"type" : "Image"
},
{
"src" : "http://www.baidu.com/img/bdlogo.png", //这是来源为网络地址的图片
"type" : "Image"
}
]
},
{
"text" : "水平布局",
"type" : "Page",
"views" : [
{
"color" : "100,100,100",
"size" : 30,
"text" : "以下是水平布局排列的三个控件",
"type" : "Label"
},
{
"height" : 300,
"width" : 700,
"id" : "group1",
"type" : "LinearLayout", //这是LinearLayout控件
"valign" : "top",
"views" : [
//从这里开始是LinearLayout控件内部的子控件,不可嵌套LinearLayout控件,可添加LinearLayout、Page以外的所有控件
{
"color" : "100,100,100",
"size" : 30,
"text" : "选择",
"type" : "Label",
"width" : 100
//LinearLayout控件内部的子控件均需要指定一个width属性,不指定则无法显示
},
{
"id" : "checkboxgroup2",
"list" : "选项1,选项2,选项3",
"select" : "2@3@",
"type" : "CheckBoxGroup",
"width" : 180
},
{
"id" : "4",
"list" : "选项1,选项2,选项3,选项4,选项5",
"select" : "1",
"size" : 20,
"type" : "ComboBox",
"width" : 250
}
]
},
{
"color" : "100,100,100",
"size" : 30,
"text" : "以下是一张默认布局方式的图片,水平布局可与普通布局样式联合使用",
//这里是一个Label,跟上面的LinearLayout同层级
"type" : "Label",
"width" : 100
},
{
"src" : "b.png",
"type" : "Image"
},
{
"color" : "100,100,100",
"size" : 30,
"text" : "以下又是一个水平布局区域",
//这里也是一个Label,跟上面的LinearLayout同层级
"type" : "Label"
},
{
//在同层级的情况下,可以多个LinearLayout联合使用,以下是第二个LinearLayout控件中的内容
"height" : 400,
"width" : 700,
"id" : "group1",
"type" : "LinearLayout",
"valign" : "top",
"views" : [
{
"color" : "100,100,100",
"size" : 30,
"text" : "右边是一张图片",
"type" : "Label",
"width" : 150
},
{
"src" : "b.png",
"type" : "Image",
"width" : "400"
}
]
}
]
},
{
"text" : "跳转示例",
"type" : "Page",
"views" : [
{
"color" : "100,110,200",
"extra" : [ //附加属性指定
{
"goto" : "http://www.baidu.com", //跳转到网址
"text" : "阅读原文"
},
{
"goto" : "qq", //跳转到QQ咨询
"text" : "1602127440"
}
],
"size" : 30,
"text" : "阅读原文 QQ:1602127440",
"type" : "Label"
}
]
},
{
"text" : "V1.6.7更新",
"type" : "Page",
"views" : [
{
"align" : "left",
"color" : "0,0,0",
"size" : 40,
"text" : "标签",
"type" : "Label",
"bg" : "100,100,100"
},
{
"id" : "web",
"url" : "http://www.baidu.com",
"type" : "WebView",
"height" : 500,
"width" : 800
},
{
"id" : "line",
"type" : "Line",
"color" : "0,0,255",
"height" : 7,
"width" : 800
}
]
}
]
}
创建一个界面,需要包含style和views两个参数。
界面控件:
界面包含有8种控件:标签 Label,单选框 RadioGroup,编辑框 Edit,多选框CheckBoxGroup,下拉框 ComboBox,图片 Image,页面Page,水平布局LinearLayout。
例如一个标签控件的例子:
{
"type": "Label",
"text": "设置",
"size": 25,
"align": "center",
"color": "0,0,255"
}
标签 Label 一共有六种属性:
文本/标题/text
必填,一般来用显示说明文字或者标题,该控件没有任何返回值,只用作显示。此类型可支持多行显示,在字符串中插入 \n 可以进行换行,例如:\"测试\n测试 1\n测试2\"
数值/字体大小/size
如果不指定该属性,则默认值为 15。
文本/对齐方式/align
对齐方式 align 可取值为:左对齐 left,右对齐 right,居中 center。
文本/字体颜色/color
字体颜色 color 使用RGB十进制数值,以英文半角逗号分割。
文本/背景颜色/bg
背景颜色 bg 使用RGB十进制数值,以英文半角逗号分割;或输入图片文件名以使用图片文件。
附加属性/extra,指定了该标签内部分文本的属性。
支持多种类型的跳转 goto,对应跳转类型的属性类别为url、qq;跳转网址 url:属性类别中直接输入该url; 跳转QQ:属性类别填写"qq"。
单选框 RadioGroup 一共有四种属性:
文本/ID/id
必填,全局唯一,用来标示控件
文本/可选项目标题 /list
可选项目标题 list 用英文半角逗号分割。
文本/字体颜色/color
字体颜色 color 使用RGB十进制数值,以英文半角逗号分割。
文本/默认选中项编号/select
默认选中项编号 select 只允许填写一个,序号从 0 开始,与可选项目标题中的顺序保持一致。
文本/分行显示控制/orientation
用于控制多个选项的排布方式,填写horizontal为水平方向智能排版,填写vertical为全部选项竖排,不水平排版,不填写则默认为水平方向智能排版
数值/字体大小/size
如果不指定该属性,则默认值为 30。
编辑框 Edit 一共有七种属性:
文本/ID/id
必填,全局唯一,用来标示控件
文本/编辑框提示文本/prompt
编辑框提示文本prompt为编辑框中无任何内容时显示的底色文本。
文本/编辑框默认内容/text
界面载入时已经存在于编辑框中的文本。
文本/对齐方式/align
文本/字体颜色/color
文本/键盘类型/kbtype
设置获取焦点时弹出的键盘类型,number ascii default
数值/字体大小/size
如果不指定该属性,则默认值为15
多选框 CheckBoxGroup,又称作检查框,一共有三种属性:
文本/ID/id
必填,全局唯一,用来标示控件
文本/可选项目标题/list
文本/默认选中项编号/select
默认选中项编号 select 允许填写一个或多个,填写多个时以 @ 分割编号。
文本/字体颜色/color
字体颜色 color 使用RGB十进制数值,以英文半角逗号分割。
文本/分行显示控制/orientation
用于控制多个选项的排布方式,填写horizontal为水平方向智能排版,填写vertical为全部选项竖排,不水平排版,不填写则默认为水平方向智能排版
数值/字体大小/size
如果不指定该属性,则默认值为 30。
下拉框 ComboBox,一共有四种属性:
文本/ID/id
必填,全局唯一,用来标示控件
文本/可选项目标题/list 多个项目标题之间以” ,”分割
数值/字体大小/size
如果不指定该属性,则默认值为 30。
文本/默认选中项编号/select
默认选中项编号 select 只允许填写一个,序号从 0 开始
图片 Image,放置一个图片到 UI 上,属性:
路径/插入图片的路径/src 可以是本地路径或者网络路径
例如:"type":"Image","src":"http://www.baidu.com" 或者"src":"1.png"
页面 Page,生成一个独立页面到UI上,该页面可自由添加若干个控件,在上一级页面有Tab的页面索引,可点击切换页面,一共有两个属性:
文本/Tab标题/text
数组/控件容器/views
(要特别注意的是,如果存在Page控件,那么别的同级控件都就只能是Page控件,否则会导致UI解析出错,返回长度为0的字符串作为结果。)
WebView页面 WebView,在UI上规定一个范围,作为webview展示区域,可显示任意url网页内容,共有四种种属性:
文本/ID/id
必填,全局唯一,用来标示控件
文本/地址/url
指定该webview区域展示的目标地址
数字/宽度/width
指定展示区域的宽度
数字/高度/height
指定展示区域的高度
直线 line,在UI上放置一条直线,共有四种种属性:
文本/ID/id
必填,全局唯一,用来标示控件
文本/颜色/color
使用RGB十进制数值,以英文半角逗号分割。
数字/宽度/width
指定线条长度
数字/高度/height
指定线条粗细
以上九种控件均可重复使用,这个界面的样式 style 为 default,即默认样式,这个样式下的控件将会自动排列,不需要指定其坐标。部分控件带有id参数,id不可重复,需要注意的是,涉及到用户操作的控件,其id参数为必填项。
{
"id" : "group1",
"width" : 1780,
"height" : 600,
"type" : "LinearLayout",
"views" : [
{
"color" : "100,110,200",
"size" : 30,
"text" : "标题栏",
"type" : "Label",
"width" : 100
},
{
"id" : "checkboxgroup2",
"list" : "选项1,选项2,选项3",
"select" : "2@3@",
"type" : "CheckBoxGroup",
"width" : 250
},
{
"id" : "4",
"list" : "选项1,选项2,选项3,选项4,选项5",
"select" : "1",
"size" : 20,
"type" : "ComboBox",
"width" : 210
}
]
}
另一种界面style样式为 custom,当界面样式被指定为这种,则必须指定每个控件的 rect 属性以调整控件的尺寸以及位置,例如:
{
"type": "Edit", "size": 15, "align": "left",
"prompt": "提示文字",
"text": "默认文字",
"color": "255,0,0",
"rect": "0,0,100,40"
}
函数功能:获取json文件中的内容
函数语法:
content = getUIContent(string)
参数说明:
参数、返回值 | 类型 | 说明 |
---|---|---|
string | 文本型 | 脚本UI目录下json文件名称 |
content | 文本型 | 所获取的json文件内容 |
脚本实例:
--ui.json文件内具体内容如下
{
"style": "default",
"config": "save.dat",
"width": 400,
"height": 300,
"cancelname": "Quit",
"okname": "Let's Rock!",
"views": [
{
"type": "Page",
"text": "settings",
"views": [
{
"type": "Label",
"text": "Settings",
"size": 25,
"align": "center",
"color": "0,0,255",
}
]
}
]
}
--lua文件中示例如下
local bb = require("badboy")
local json = bb.getJSON()
ret,results=showUI("ui.json"); --显示未更改的UI界面
content = getUIContent("ui.json") --获得文件ui.json的内容
lua_value = json.decode(content) --对获取到的json字符串解码
lua_value.width = 500 --将ui窗口宽度赋值为500
lua_value.height = 400 --将ui窗口宽度赋值为450
showUI(json.encode(lua_value)) --重新编码json字符串,窗口将按照新设定的尺寸显示
注意事项:
1.badboy是专为叉叉脚本开发的开源工具库,具体使用方法参照对应章节
函数功能:重置UI默认选项
函数语法:
resetUIConfig(file)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
file | 文本型 | 需要重置的UI配置文件,例"save.dat" |
返回值:无
脚本实例:
ret,results = showUI("ui.json")
mSleep(500)
resetUIConfig("save_111.dat")
mSleep(500)
toast("UI默认选项已重置")
mSleep(2500)
ret,results = showUI("ui.json")
注意事项:
支持引擎版本:1.7.4或更新
函数功能:获取设备屏幕的分辨率,用来判断坐标系的使用。
函数语法:
width,height = getScreenSize()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
width | 整数型 | 获取到的屏幕宽度 |
height | 整数型 | 获取到的屏幕高度 |
注意事项:
统一为竖直(Home 键在下方时)屏幕的宽度和高度。
函数功能:设置当前脚本开发环境的屏幕分辩率,使脚本适配不同分辩率的设备。
函数语法:
setScreenScale(width, height, scale)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
width | 整数型 | 脚本开发时使用的设备宽度 |
height | 整数型 | 脚本开发时使用的设备高度 |
scale | 整数型 | 返回坐标缩放参数, 默认为0; 0 - 返回的坐标进行反向缩放,1 - 返回的坐标不缩放 |
该函数使脚本根据开发环境的屏幕分辩率和当前使用环境分辨率自动将脚本里XY坐标进行等比换算
受影响命令包括:
脚本实例:
假设一名作者在540*960分辨率的手机中开发了脚本,要在720*1280的设备中运行
setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同
touchDown(0, 100, 200) --此处实际点击坐标为:100*(720/540),200*(1280/960)
mSleep(50)
touchMove(0, 100, 200) --此处实际移动坐标为:100*(720/540),200*(1280/960)
mSleep(50)
touchUp(0, 100, 200)
x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE", 100, 0, 0, 400, 600)
--此处实际查找范围为坐标(0,0)到(400*720/540,600*1280/960),同时坐标偏移也进行换算,即匹配首点x,y坐标后,再比对(x+29*720/540,y+1*1280/960)这个坐标是否为"0x00BBFE"
if x~=-1 then
touchDown(0, x, y) --第三参数为0或省略情况下返回的坐标为经过反向缩放的坐标,
mSleep(100)
touchUp(0, x, y)
end
注意事项:
1.通分辨率取色要点:取色点周边颜色相近为佳,由于字体或图形边缘线的点就很可能由于缩放而消失,导致找色失败。
2.只适用等比例分辨率:例如540*960,720*1280都是9:16就可通用,而540*960与400*800的一般不通用。
3.在最小分辨率开发,同比例的大分辨可用。例如:540*960下开发的脚本,在720*1280可用,反过来,一般不能通用。
函数功能:显示从1970年到现在经过的毫秒数
函数语法:
t = mTime()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
t | 整数型 | 表示从1970年到现在经过的毫秒数 |
脚本实例:
sysLog('mTime:' .. mTime())
函数功能:获取GMT时区从1970年到现在经过的秒数
函数语法:
t = getNetTime()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
t | 整数型 | 表示网络时间GMT时区从1970年到现在经过的秒数,无网络情况下返回值为0 |
脚本实例:
sysLog("NetTime:" .. getNetTime())
函数功能:模拟用户点击主屏幕按键的操作。
函数语法:
pressHomeKey()
参数说明:
返回值:无
函数功能:模拟用户双击HOME键的操作,用于打开后台。
函数语法:
doublePressHomeKey()
参数说明:
返回值:无
脚本实例:
doublePressHomeKey();
函数功能:模拟用户点击导航栏按键的操作,仅安卓适用
函数语法:
ret = pressKey(keyname,mode)
参数说明:
参数/返回值 | 类型 | 说明 |
---|---|---|
keyname | 文本型 | 必填参数,为'BACK','MENU'和'HOME'三项之一 |
mode | 逻辑型 | 可选参数,控制是否长按,true表示长按,false表示不长按 |
ret | 文本型 | 返回值为0时表示成功 |
脚本实例:
ret = pressKey('BACK',false)
函数功能:设置无线局域网开关
函数语法:
setWifiEnable(flag)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
flag | 逻辑型 | 打开WIFI - true; 关闭WIFI - false |
返回值 | 类型 | 说明 |
---|---|---|
ret | 逻辑型 | 开关设置变更前的状态 false - 关闭;true - 开启 |
脚本实例:
setWifiEnable(true); --打开 Wifi
setWifiEnable(false); --关闭 Wifi
函数功能:设置飞行模式开关
函数语法:
setAirplaneMode(flag)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
flag | 逻辑型 | 打开飞行模式 - true;关闭飞行模式 - false |
返回值 | 类型 | 说明 |
---|---|---|
ret | 逻辑型 | 开关设置变更前的状态 false - 关闭;true - 开启 |
脚本实例:
setAirplaneMode(true); --打开 飞行模式
setAirplaneMode(false); --关闭 飞行模式
函数功能:设置蓝牙开关
函数语法:
setBTEnable(flag)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
flag | 逻辑型 | 打开蓝牙 - true;关闭蓝牙 - false |
返回值 | 类型 | 说明 |
---|---|---|
ret | 逻辑型 | 开关设置变更前的状态 false - 关闭;true - 开启 |
脚本实例:
setBTEnable(true); --打开 蓝牙
setBTEnable(false); --关闭 蓝牙
函数功能:锁定设备并关闭屏幕,仅支持iOS。
函数语法:
lockDevice()
参数说明:
返回值:无
脚本实例:
lockDevice();
lua_exit();
函数功能:解除屏幕锁定状态,仅支持iOS。
函数语法:
unlockDevice()
参数说明:
返回值:无
脚本实例:
flag = deviceIsLock(); --判断屏幕锁定状态
if flag == 0 then
dialog("未锁定",3);
else
unlockDevice(); --解锁
end
注意事项:
1.如果设备设置了锁屏密码,则此函数只能唤醒屏幕。
函数功能:判断当前设备的屏幕锁定状态
函数语法:
flag = deviceIsLock()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
flag | 整数型 | 0 == 表示设备未锁定;非0 == 表示设备已锁定 |
脚本实例:
flag = deviceIsLock(); --判断屏幕锁定状态
if flag == 0 then
dialog("未锁定",3);
else
unlockDevice(); --解锁
end
函数功能:使手机振动一次。
函数语法:
vibrator()
参数说明:
返回值:无
脚本实例:
for var = 1,5 do
vibrator(); --振动
mSleep(1000); --持续 1 秒
end
注意事项:
1.使用此函数需在移动设备设置里打开震动选项。
函数功能:重置系统空闲时间,阻止自动锁屏,保持屏幕常亮。
函数语法:
resetIDLETimer()
参数说明:
返回值:无
脚本实例:
while true do
mSleep(30 * 1000); --等待 30 秒
resetIDLETimer(); --重置锁屏计时
end
注意事项:
安卓暂不支持此功能。
函数功能:取消屏幕比例缩放设置,一般与setScreenScale配套使用。
函数语法:
resetScreenScale()
参数说明:
返回值:无
脚本实例:
setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同
resetScreenScale() --取消缩放
函数功能:在后台播放指定的声音文件
函数语法:
playAudio(file)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
file | 文本型 | 音频文件名,支持mp3 |
返回值:无
脚本实例:
playAudio("music.mp3") -- 播放音乐文件music.mp3
mSleep(5000)
stopAudio() --停止播放音频文件
注意事项:
1.如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。
2.用于播放的音乐文件需置于脚本对应的res文件夹内。
函数功能:停止正在播放的音频
函数语法:
stopAudio()
参数说明:
返回值:无
脚本实例:
playAudio("music.mp3") -- 播放音乐文件music.mp3
mSleep(5000)
stopAudio() --停止播放音频文件
注意事项:
如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。
函数功能:规定时间之后,调用指定的函数,同时把参数输入
函数语法:
setTimer(time,func,arg1,arg2,...)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
time | 数字型 | 当前时间到调用函数的时间间隔,毫秒 |
func | 函数 | 需要调用的函数名称 |
arg1,arg2,... | 变量 | 调用指定的函数时需要输入的参数,不定项 |
返回值:无
脚本实例:
--每隔2000毫秒toast提示一次a+b+c的结果
function func(a,b,c)
toast(a+b+c)
a=a+1
b=b+1
c=c+1
setTimer(2000,func,a,b,c)
end
setTimer(2000,func,0,1,2)
--等待运行
mSleep(2000)
mSleep(2000)
mSleep(2000)
mSleep(2000)
mSleep(2000)
注意事项:
1.如定义了一段时间运行的函数,需在函数调用之前预留充裕的时间。
2.支持引擎版本:1.7.4或更新
函数功能:设置系统参数,脚本API行为受这些参数决定
函数语法:
setSysConfig(key,value)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
key | 文本型 | 要设置的系统参数项目 |
value | 文本型 | 该API行为的控制选项 |
返回值:无
可设置系统参数:
设置项目(key) | 控制选项说明(value) |
---|---|
isLogFile:令系统日志sysLog写入到文件中 | 0 - 关闭,1 - 开启 |
脚本实例:
--设置开启将API:系统日志sysLog写入到文件。
setSysConfig("isLogFile","1")
--设置关闭将API:系统日志sysLog写入到文件。
setSysConfig("isLogFile","0")
日志文件路径
开发助手
Android:/sdcard/com.xxscript.idehelper/tengine/log/user/脚本名.log
iOS:/tmp/user/脚本名.log
叉叉助手
Android:/sdcard/com.xxAssistant/tengine/log/user/脚本id.log
Android免Root:/sdcard/com.noroot/tengine/log/user/脚本id.log
iOS:/tmp/user/脚本id.log
叉叉小精灵
Android:/sdcard/小精灵包名/tengine/log/user/脚本id.log
IPA精灵
IPA精灵:应用文件夹/Document/Temp/脚本id.log
IPA精灵(开发版):应用文件夹/Document/Temp/脚本名.log
注意事项:
1.支持引擎版本:1.9.00或更新.
2.安卓叉叉小精灵应用内可直接查看日志,小精灵需更新到1.0.8或以上。
函数功能:发送系统等待事件。
函数语法:
mSleep(interval)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
interval | 整数型 | 单位为毫秒,脚本暂停执行的时间长度 |
脚本实例:
mSleep(5000);
touchDown(1, 200, 300); --按下
mSleep(3000); --延迟 3 秒
touchUp(1, 200, 300); --抬起
注意事项:
1.延迟函数一般是用来模拟人在界面上的操作,因此要考虑人在各种情况下的延迟、界面加载时的响应时间。
2.延迟间隔不可过短,当 interval <= 50 ms 时,延迟精确度大幅下降,当 interval <= 16 ms 时,实际延迟约在16 ms左右。
3.请勿将此函数用于长时间的精确计时。
4.1 秒 (s) = 1000 毫秒 (ms)。
函数功能:以HUD方式显示提示信息。
函数语法:
toast(text)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
text | 文本型 | 提示信息,将在设备屏幕上以HUD形式显示,2秒后消失 |
返回值:无
脚本实例:
toast("欢迎使用叉叉脚本!");
mSleep(1000);
toast("本脚本仅供演示toast函数效果。\n提示信息可以换行。");
注意事项:
该函数所产生的提示信息将以HUD形式显示在屏幕上,该函数所产生的提示信息可能会影响当前屏幕的找色,请合理使用。
函数功能:弹出提示信息
函数语法:
dialog(text, time)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
text | 文本型 | 提示信息,将在设备屏幕上以弹窗形式显示 |
time | 整数型 | 提示信息显示的时间,不限时间请填0 |
返回值:无
脚本实例:
dialog("欢迎使用叉叉脚本!", 5);
mSleep(1000);
dialog("本脚本仅供演示对话框的用法。\n提示信息可以换行。",0);
注意事项:
1.time 参数时间设置过短有可能因出现时间太短看不清楚。
2.该函数仅供呈现提示信息给用户,不可接收返回值。
3.该函数所产生的提示窗口显示的时候会影响当前屏幕取色,请在合理的位置使用该函数。
4.关于转义字符:\n 为换行,请查阅 Lua 转义字符表。
5.time 参数可省略,如省略将按 0 处理。
函数功能:弹出提示信息,并提供 1 ~ 3 个按钮给用户选择。
函数语法:
choice = dialogRet(text, cbtn, btn1, btn2, time)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
Text | 文本型 | 提示信息 |
cbtn | 文本型 | 默认按钮标题,不需要请填 "" |
btn1 | 文本型 | 可选按钮 1,不需要请填 "" |
btn2 | 文本型 | 可选按钮 2,不需要请填 "" |
time | 整数型 | 提示信息显示的时间,不限时间请填 0 |
返回值 | 类型 | 说明 |
---|---|---|
choice | 整数型 | 返回用户按下按钮的序号 cbtn == 0;btn1 == 1;btn2 == 2;如用户在规定显示时间内未进行选择,返回值为 -1 |
脚本实例:
choice = dialogRet("请选择您的屏幕方向:", "横屏", "竖屏", "", 0);
choice = dialogRet("请选择您的屏幕方向:", "HOME键在下", "HOME键在左", "HOME键在右", 0);
dialogRet("请花30秒仔细阅读该许可协议。", "", "", "", 30);
注意事项:
1.请勿将三个按钮都设置为空,再将 time 参数设置为 0,这样将造成出现无法消失也没有按钮的 对话框,造成设备无法进行其它操作,只能重启。
函数功能:弹出提示信息,并提供 1 ~ 2 个编辑框给用户输入。
函数语法:
text_a,text_b = dialogInput(title, format, btn)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
title | 文本型 | 提示标题 |
format | 文本型 | 编辑框中浅色的提示文字 |
btn | 文本型 | 确认按钮标题 |
返回值 | 类型 | 说明 |
---|---|---|
text_a,text_b | 文本型 | 返回用户输入的文本 |
脚本实例:
text_a = dialogInput("请输入循环副本的次数", "在这里输入次数", "确认");
mSleep(1000);
text_a, text_b = dialogInput("请输入使用的设置方案","在这里输入方案编号#在这里输入次数","确认");
mSleep(1000);
if text_b ~= "" and text_a ~= "" then --如果均已填写
dialog("打本信息:"..text_b.." 次数 "..text_a.." 。", 5);
mSleep(1000);
else --未填写完整
dialog("请完整填写打本的设置信息", 5);
mSleep(1000);
lua_exit()
end
注意事项:
1.使用该函数都要对用户输入的数据进行一定的检查,例如要求非空、长度不得少于。
2.需要注意使用双编辑框时,函数返回的两个字符串顺序与 format中的顺序相反。
3.由于对话框事件需要响应时间,所以建议使用对话框时配合设置相应的延迟。
函数功能:输出系统日志 NSLog
函数语法:
sysLog(contents)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
content | 文本型 | 需要显示的日志内容 |
返回值:无
注意事项:
1.该函数将日志输出到对应平台的开发窗口
2.该函数可通过setSysConfig设置项"isFileLog"设置为写入日志到文件,详情查看“setSysConfig 设置系统参数”条目(引擎支持:需1.9.00或更新)。
函数功能:输出日志到文件
函数语法:
fileLogWrite(file,date,tag,msg)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
file | 文本型 | 日志名 |
date | 整数型 | 文件名是否添加日期后缀,0-不添加,1-添加。选择1的文件名称-/tmp/Good-20170401.log |
tag | 文本型 | 标签,便于查看日志 |
msg | 文本型 | 写入日志文件的内容 |
返回值:无
脚本实例:
fileLogWrite("Name",1,"INFO","这是写入日志文件的内容")
注意事项:
1.该函数目前仅支持开发助手
2.该函数将日志输出到对应平台日志文件路径:
android:/sdcard/
iOS越狱:/tmp/
3.支持引擎版本:1.7.4或更新
函数功能:获取开发者平台公告服务模块中表单的内容
函数语法:
content, err = getCloudContent(key,token,default_msg)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
key | 文本型 | 指定需要获取公告服务表中的key值 |
token | 文本型 | 开发助手调试中用于获取公告服务测试环境表单中数据的调试口令,在开发者平台中获取 |
default_msg | 文本型 | (选填)获取key对应value值失败时,将该默认值作为结果返回 |
返回值 | 类型 | 说明 |
---|---|---|
content | 文本型 | 从公告服务表单中取得对应的value值,正式环境与测试环境的数据分别配置 |
err | 整数型 | 返回错误的类型:0 - 正常获取,1 - 网络错误,999 - 未知错误 |
脚本实例:
content, err = getCloudContent("key", "此处十六位调试口令", "没有正确获取到公告信息")
sysLog(string.format("getCloudContent return content = %s, err = %s", tostring(content), tostring(err)));
if err == 0 then
dialog(content)
elseif err == 1 then
dialog("网络错误")
elseif err == 999 then
dialog("未知错误")
end
注意事项:
1.调试口令在开发者平台中生成,用于开发助手测试时获取测试环境的公告服务表单使用,正式环境中该密钥参数不生效。
2.该API需要保证网络通畅才能获取到对应信息,请勿用于存放重要信息。
3.支持引擎版本:1.7.5或更新。
函数功能:将字符串存入配置文件
函数语法:
setStringConfig("key","string")
参数说明:
参数 | 类型 | 说明 |
---|---|---|
key1 | 文本型 | 将要写入的参数名称 |
string1 | 文本型 | 将要写入参数的内容 |
返回值:无
脚本实例:
sex = getStringConfig("gender","male");
toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"
setStringConfig("gender","female");
sex = getStringConfig("gender","male");
toast(sex) -- toast结果为新的赋值"female"
函数功能:读取配置文件的字符串
函数语法:
ret = getStringConfig("key","default_string")
参数说明:
参数 | 类型 | 说明 |
---|---|---|
key1 | 文本型 | 将要读取的参数名称 |
default_string | 文本型 | 参数"key1"所对应的默认值,如果没有对key1进行新的赋值,或无法找到对key1的赋值,将返回默认值“default_string” |
返回值 | 类型 | 说明 |
---|---|---|
ret | 文本型 | 获取到名为"key1"的参数当前的值 |
脚本实例:
sex = getStringConfig("gender","male");
toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"
setStringConfig("gender","female");
sex = getStringConfig("gender","male");
toast(sex) -- toast结果为新的赋值"female"
函数功能:将数值存入配置文件
函数语法:
setNumberConfig("key",num)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
key2 | 文本型 | 将要写入的参数名称 |
num1 | 数字型 | 将要写入参数的数值 |
返回值:无
脚本实例:
a = getNumberConfig("age",18);
toast(a) -- toast结果"18"
setNumberConfig("age",20);
a = getNumberConfig("age",18);
toast(a) -- toast结果"20"
函数功能:读取配置文件的数值
函数语法:
num = getNumberConfig("key",default_num)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
key2 | 文本型 | 将要读取的参数名称 |
default_num | 数字型 | 参数"key2"所对应的默认值,如果没有对key2进行新的赋值,或无法找到对key2的赋值,将返回默认值 default_num |
返回值 | 类型 | 说明 |
---|---|---|
num | 数字型 | 获取到名为"key2"的参数当前的值 |
脚本实例:
a = getNumberConfig("age",18);
toast(a) -- toast结果"18"
setNumberConfig("age",20);
a = getNumberConfig("age",18);
toast(a) -- toast结果"20"
函数功能:读写系统剪贴板
函数语法:
string = readPasteboard()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
string | 文本型 | 写入或读出的剪贴板字符串 |
脚本实例:
string = readPasteboard(); --读取剪贴板内容
mSleep(1000); --延迟 1 秒等待响应
inputText(string); --输入字符串
函数功能:读写系统剪贴板
函数语法:
writePasteboard(string)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
string | 文本型 | 写入的剪贴板字符串 |
返回值:无
脚本实例:
file = io.open("test.txt" ,"r"); --以只读方式打开一个文本文件
if file then --如打开成功
writePasteboard(file:read()); --写入到剪贴板
file:close(); --关闭文件
end
注意事项:
1.该函数将覆盖系统剪贴板,如有重要数据储存在剪贴板请事先备份。
函数功能:直接终止脚本。
函数语法:
lua_exit()
参数说明:
返回值:无
脚本实例:
ret = dialogRet("该脚本不支持当前手机分辨率", "继续", "退出","",0);
if ret == 0 then --如果按下"继续"按钮
init("0",0); --开始初始化
else
lua_exit(); --否则退出脚本
end
函数功能:重新加载运行脚本
函数语法:
lua_restart()
参数说明:
返回值:无
注意事项:
此函数作用相当于停止脚本后重新运行脚本。
函数功能:在用户主动终止脚本运行之前执行的回调函数
函数语法:
onBeforeUserExit()
参数说明:
返回值:无
脚本实例:
function onBeforeUserExit()
dialog("OK",0)
end
for var = 1,30 do
mSleep(1000)
sysLog("var")
end
注意事项:
1.函数名必须为
onBeforeUserExit
才能够被识别(旧版本为beforeUserExit
,依然兼容),请勿在函数体中使用死循环,否则会造成脚本无法终止或其他不可预料的问题。
2.此函数可以被 lua_exit()、悬浮窗停止、远程接口停止 触发。
函数功能:获取当前应用使用中的脚本引擎的版本号
函数语法:
ver = getEngineVersion()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ver | 文本型 | 返回当前引擎的版本号 |
脚本实例:
ver = getEngineVersion()
sysLog(string.format('当前版本号: %s', ver))
函数功能:获取系统类型
函数语法:
ver = getOSType()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ver | 文本型 | 返回当前系统的类型;android系统返回“android”,iOS系统返回“iOS” |
脚本实例:
ver = getOSType()
if ver == "android" then
sysLog("安卓系统")
elseif ver == "iOS" then
sysLog("苹果系统")
end
函数功能:获取系统环境类型
函数语法:
ver = isPrivateMode()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ver | 文本型 | 返回当前系统的类型:返回值1、0;1-越狱/ROOT环境;0-免越狱/免ROOT环境 |
脚本实例:
ver = isPrivateMode()
if ver == 0 then
toast("当前为免越狱/免ROOT环境")
elseif ver == 1 then
toast("当前为越狱/root环境")
end
注意事项:
1.
isPriviateMode
支持引擎版本:1.7.4或更新
2.isPrivateMode
支持引擎版本:1.8.30或更新
函数功能:获取系统常量属性,仅安卓可用
函数语法:
value = getSystemProperty('key')
参数说明:
参数 | 类型 | 说明 |
---|---|---|
key | 文本型 | CPU构架 - 'ro.arch'; 手机产品号 - 'ro.build.product' |
返回值 | 类型 | 说明 |
---|---|---|
value | 文本型 | 返回所获取的系统常量属性结果 |
脚本实例:
sysLog('CPU构架: ' .. getSystemProperty('ro.arch'))
sysLog('手机产品号:' .. getSystemProperty('ro.build.product'))
函数功能:获取当前系统语言属性
函数语法:
ret = getLocalInfo()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ret | 文本型 | 获取到的当前系统语言,格式:语言-国家,例如:zh-CN, es-US,用于支持多语言脚本适配 |
脚本实例:
ret = getLocalInfo()
sysLog(string.format('当前系统语言: %s', ret))
函数功能:获取用户的识别ID
函数语法:
id = getUserID()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
id | 文本型 | 表示拿到的用户的ID,没有登录时则返回null |
脚本实例:
sysLog("id: "..getUserID())
函数功能:获取脚本的识别ID
函数语法:
id = getScriptID()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
id | 文本型 | 表示拿到的脚本上架的ID,否则返回-1 |
脚本实例:
sysLog("id: "..getScriptID())
注意事项:
支持引擎版本:1.8.30或更新
函数功能:获取当前设备屏幕DPI,仅安卓适用
函数语法:
ret = getScreenDPI()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ret | 文本型 | 返回的当前设备屏幕DPI |
脚本实例:
ret = getScreenDPI()
sysLog(string.format('当前设备屏幕DPI: %s', ret))
函数功能:获取当前设备IMEI码,仅安卓适用
函数语法:
ret = getDeviceIMEI()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ret | 文本型 | 返回的当前设备IMEI码 |
脚本实例:
ret = getDeviceIMEI()
sysLog(string.format('当前设备IMEI码: %s', ret))
函数功能:获取当前设备IMSI码,仅安卓适用
函数语法:
ret = getDeviceIMSI()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ret | 文本型 | 返回的当前设备IMSI码 |
脚本实例:
ret = getDeviceIMSI()
sysLog(string.format('当前设备IMSI码: %s', ret))
函数功能:获取当前设备UUID,仅iOS适用
函数语法:
ret = getDeviceUUID()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ret | 文本型 | 返回的当前设备UUID |
脚本实例:
ret = getDeviceUUID()
sysLog(string.format('当前设备UUID: %s', ret))
函数功能:获取电池充电状态、电量
函数语法:
charge,level = getBatteryLevel()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
charge | 整数型 | 0表示没充电,1表示充电 (充电状态未知返回-1,同时剩余电量为-1) |
level | 整数型 | 表示剩余电量,0-100 |
脚本实例:
charge,level = getBatteryLevel()
if charge == 0 then
toast("当前电池未充电,电量剩余 "..level)
elseif charge == 1 then
toast("当前电池充电中,电量剩余 "..level)
elseif charge == -1 then
toast("当前电池充电状态未知,电量剩余未知")
end
注意事项:
1.支持引擎版本:1.7.4或更新
函数功能:获取设备当前屏幕方向
函数语法:
ret = getScreenDirection()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
ret | 整数型 | Android:0-竖屏, 1-橫屏; iOS:0-竖屏,1-横屏(Home右),2-横屏(Home左), -1(Unknow) |
脚本实例:
ret = getScreenDirection()
if ret == 0 then
toast("当前屏幕方向为竖屏")
elseif ret == 1 then
ver = getOSType()
if ver == "iOS" then
toast("当前屏幕方向为横屏,HOME键在右")
elseif ver == "android" then
toast("当前屏幕方向为横屏")
end
elseif ret == 2 then
toast("当前屏幕方向为横屏,HOME键在左")
elseif ret == -1 then
toast("当前屏幕方向Unknow")
end
注意事项:
1.iOS版开发助手中该函数返回值跟随init指定的方向,未指定的情况下返回值为-1。
2.支持引擎版本:1.7.4或更新
函数功能:获取用户付费类型和套餐剩余时间
函数语法:
buyState,validTime,res=getUserCredit()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
buyState | 整数型 | 用户付费类型,1 - 付费用户,2 - 试用用户,3 - 免费用户,0 - 非购买非试用 |
validTime | 整数型 | 用户当前套餐购买时长,单位为秒,试用用户的情况下会返回0 |
res | 整数型 | 返回错误代码,0 - 正常, 非0 - 出错 |
脚本实例:
buyState,validTime,res=getUserCredit()
if buyState ~= 0 then
dialog("您是付费用户")
end
注意事项:
1.支持引擎版本:1.8.30或更新
函数功能:获取脚本运行模式,用于区分哪种运行模式跑脚本
函数语法:
int = getRuntimeMode()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
int | 整数型 | 脚本运行模式,0 - 通用模式(当做“免root免激活”处理),1 - 低版本兼容模式(当做“免root免激活”处理),2 - 极客模式(root或者激活) |
脚本实例:
int = getRuntimeMode()
if int == 0 then
dialog("当前模式:通用模式")
end
注意事项:
1.支持引擎版本:1.9.312或更新
函数功能:获取当前运行脚本产品
函数语法:
int = getProduct()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
int | 整数型 | 1-叉叉/免root叉叉;2-内部使用;3-开发助手;4-内部使用;5-叉叉IPA精灵;6-叉叉小精灵;7-叉叉酷玩;8-叉叉云游 |
脚本实例:
--打印产品id
product_id = getProduct()
if product_id ~= nil then
sysLog("product_id="..product_id);
end
注意事项:
1.支持引擎版本:1.9.23或更新
函数功能:创建、显示、隐藏HUD内容
函数语法:
id = createHUD()
参数说明:
返回值 | 类型 | 说明 |
---|---|---|
id | 整数型 | 用于标示HUD |
脚本实例:
init("0",1)
id = createHUD() --创建一个HUD
showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
mSleep(2000)
showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
mSleep(5000)
hideHUD(id) --隐藏HUD
mSleep(3000)
注意事项:
1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。
函数功能:创建、显示、隐藏HUD内容
函数语法:
showHUD(id,text,size,color,bg,pos,x,y,width,height)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
id | 整数型 | 用于标示HUD |
text | 文本型 | 提示信息,将在屏幕上以HUD形式显示 |
size | 整数型 | 表示提示信息的字体大小 |
color | 文本型 | 表示提示信息的字体颜色,格式为ARGB |
bg | 文本型 | 表示提示信息的背景颜色,可以是ARGB,也可以是图片文件名称 |
pos | 整数型 | 表示提示信息的原点位置,0 - 左上角,1 - 居中,2 - 水平居中, 3 - 垂直居中 |
x,y | 整数型 | 表示提示信息相对原点的坐标偏移值 |
width,height | 整数型 | 表示提示信息显示的宽高 |
返回值:无
脚本实例:
init("0",1)
id = createHUD() --创建一个HUD
showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
mSleep(2000)
showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
mSleep(5000)
hideHUD(id) --隐藏HUD
mSleep(3000)
注意事项:
1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。
函数功能:创建、显示、隐藏HUD内容
函数语法:
hideHUD(id)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
id | 整数型 | 用于标示HUD |
返回值:无
脚本实例:
init("0",1)
id = createHUD() --创建一个HUD
showHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容
mSleep(2000)
showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容
mSleep(5000)
hideHUD(id) --隐藏HUD
mSleep(3000)
注意事项:
1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。
函数功能:asyncExec 异步httpget、httppost请求
函数语法:
asyncExec({
type,
immediate,
url,
headers,
content,
callback
})
参数说明:
参数 | 类型 | 说明 |
---|---|---|
type | 文本型 | 目前仅支持httpget 和httppost |
immediate | 逻辑型 | 是否独立开启新线程运行(建议使用默认值false) |
url | 文本型 | 请求地址 |
headers | 文本型 | 网络请求头设置,格式key1:value1#key2:value2#... |
content | 文本型 | httppost 网络请求的附加数据 |
callback | 函数 | 网络请求结果回调函数,接受参数table = {code[int], data[string] } |
返回值:无
脚本实例:
local function urlencode(w)
pattern = "[^%w%d%?=&:/._%-%* ]"
s = string.gsub(w, pattern, function(c)
local c = string.format("%%%02X", string.byte(c))
return c
end)
s = string.gsub(s, " ", "+")
return s
end
-- 异步httpget请求
asyncExec({
type = "httpget", -- [string] 指定httpget类型
immediate = false, -- [bool] 默认false, 设置true会独立开启线程执行任务
url = urlencode("http://httpbin.org/get?x=测试x&y=测试y"), -- [string] 请求的URL地址,出现中文字符时需要使用urlencode进行编码
callback = function (result) -- [function] 请求回调函数
-- 回调结果table
assert(type(result) == "table")
--[[
返回数据格式: { code = [int]错误码, data = [string]服务器返回数据 }
code -1: 请求出错
-2: 请求超时
-3: 强制关闭
其他: 同http status code
]]--
sysLog("httpget callback: code = " .. result.code .. " data = " .. result.data)
-- 注意: 虽然请求会异步执行, 但回调函数依然在lua主线程执行, 不要在回调里执行其他阻塞操作
end
})
-- 异步httppost请求
asyncExec({
type = "httppost", -- [string] 指定httppost类型
immediate = true, -- [bool] 默认false, 设置true会独立开启线程执行任务
url = "http:/httpbin.org/post", -- [string] 请求的URL地址
headers = "User-Agent:Test-Agent#Accept-Language:zh-CN", -- [string] 请求头设置
content = "test content 2", -- [string] post请求的数据
callback = function (result) -- [function] 请求回调函数
-- 回调结果table
assert(type(result) == "table")
-- httpget和httppost返回数据格式一致
sysLog("httppost callback: code = " .. result.code .. " data = " .. result.data)
end
})
local t = 0
while t < 10 do
mSleep(1000)
t = t + 1
end
注意事项:
1.不论
immediate
为true还是false,asyncExec的网络请求总是会在Lua线程之外的线程运行,区别是immediate设置为false时,使用已有的常驻线程(sentinel thread)运行,多次运行使用同一个线程;而immediate为true是,会即时创建一个新的线程独立运行任务,多次运行创建多个线程
2.headers
设置仅在引擎版本1.8.30及以上生效,所有HTTP headers设置可以参阅 https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
函数功能:设置UI方向和HUD方向,仅iOS可用
函数语法:
setUIOrientation(mode)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
mode | 整数型 | 用于设置UI及HUD的全局方向类型,0表示跟随游戏;1表示home在右侧;2表示home在左侧 |
返回值:无
脚本实例:
init("",1)
setUIOrientation(0)
注意事项:
1.只适用于iOS系统,Andorid系统不可用
Badboy是专为叉叉脚本引擎开发的工具类,代码全部以开源的方式提供,目前有以下的模块:
使用方法:
请在脚本开头插入 local bb = require("badboy") 即可调用扩展库中所有函数。
newArray 新建数组对象
newObject 新建对象
decode json字符串转成talbe对象
encode table对象转换成压缩的json字符
encode_pretty table对象转换成优雅的json字符
脚本实例:
local bb = require("badboy")
local json = bb.getJSON()
local lua_value = json.decode('{"a": 1, "b":"boy", "c":{"d":1}}')
local a_value = lua_value.a -- =1
local b_balue = lua_value.b -- ="boy"
local c_d_balue = lua_value.c.d -- =1
local raw_json_text = json.encode(lua_value)
local pretty_json_text = json.encode_pretty(lua_value)
sysLog(raw_json_text)
sysLog(pretty_json_text)
toCharTable 从字符串转字符数组
fromCharTable 从字符数组转字符串
toByteTable 从字符串转字节数组
fromByteTale 从字节数组转字符串
contains 是否包含子串
startWith 是否以某个子串开头
endsWith 是否以某个子中结束
...更多API请关注badboy项目源码文件\bblibs\StrUtilsAPI.lua
脚本实例:
local bb = require("badboy")
local strutils = bb.getStrUtils()
local str = 'i am a badboy'
--十六进制编码转换、SHA1计算、MD5计算
local hex = str:tohex() -- 等同于 strutils.toHex(str)
local sha1 = str:sha1() -- 等同于 strutils.SHA1(str)
local md5 = str:md5() -- 等同于 strutils.md5(str)
sysLog('hex:' .. hex)
sysLog('sha1:' .. sha1)
sysLog('md5:' .. md5)
输出内容:
hex:69:20:61:6D:20:61:20:62:61:64:62:6F:79
sha1:43386755b0ff2899e0a7895c45a0c051468d06cd
md5:0663e75e1087668c30b527f5d9519185
RootView:create 构造UI根对象
RootView:addView 添加子view
RootView:removeView 删除子view
RootView:removeViewByID 删除子view
Page:create 构建Page控件
Page:addView 添加子view
Page:removeView 删除子view
Page:removeViewByID 删除子view
Image:create 构造Image控件
Edit:create 构造Edit控件
Label:create 构造Label控件
...(所有属性都可以直接通过对象访问)
local bb = require("badboy")
bb.loaduilib()
local json = bb.getJSON()
local rootview = RootView:create({style = ViewStyle.CUSTOME})
local page = Page:create("page")
page.text = "Page1"
local page2 = Page:create("page2")
page2.text = "Page2"
local label = Label:create("Label", {color = "255, 255, 0"})
label.text = "I love XX"
local image = Image:create("image")
image.src = "bg.png"
local edit = Edit:create("edit", {prompt = "提示"})
edit.align = TextAlign.LEFT
local radiogroup = RadioGroup:create("radiogroup")
radiogroup:setList('男', '女', '嬲', '奻')
radiogroup:setSelect(3)
local checkboxgroup = CheckBoxGroup:create('checkboxgroup')
checkboxgroup:setList('XX', 'OO', 'AA', 'BB')
checkboxgroup:setSelects(2, 3)
rootview:addView(page) --把page添加到rootview
rootview:addView(page2)
page:addView(label) --把label添加到page
-- page:addView(label) --label的id重复,这里会报错
page:addView(image) --把image添加到page
page:addView(checkboxgroup)
page:addView(radiogroup)
page:removeView(label1) --从page中删除label
uijson = json.encode(rootview)
showUI(uijson)
distanceBetween 计算距离
click 单击
touchMoveTo 精确滑动
angleBetween 计算角度
polarProjection 根据角度和距离找点
isColorClick 根据颜色进行点击
local bb = require("badboy")
local pos = bb.loadpos()
p1 = pos:new(0, 0, 0x123456)
p2 = pos:new(1, 2)
sysLog(p1:distanceBetween(p2))
sysLog(p1:angleBetween(p2))
p2 = p1:polarProjection(4, 30)
sysLogFmt('p2[%d, %d]', p2.x, p2.y)
sysLogFmt 格式化字符串输出
sysLogLst 任意内容输出
tap 模拟一次点击
swip 模拟一次滑动
cmpColor 指定颜色对比
-- utils test
local bb = require("badboy")
bb.loadutilslib()
i = 3
j = 6.9
s = 'good boy'
sysLogFmt('i=%d, j=%f, s=%s', i, j, s)
sysLogLst(i, j, s)
LuaSocket 是 Lua 的网络模块库,它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。详细使用说明关注badboy项目源码文件main.lua,API参考见http://w3.impa.br/~diego/software/luasocket/reference.html
local bb = require("badboy")
bb.loadluasocket()
local socket = bb.socket
local dns = socket.dns
sysLog('localhostIP: ' .. dns.toip('localhost'))
sysLog('result: ' .. (dns.tohostname('59.37.96.63') or 'nil'))
sysLog('hostname: ' .. dns.gethostname())
sysLog('addinfo: ' .. tostring(dns.getaddrinfo('localhost')))
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local ltn12 = bb.ltn12
res, code = http.request('http://www.baidu.com')
-- 等价于
-- local response_body = {}
-- res, code = http.request({
-- url = 'http://www.baidu.com',
-- sink = ltn12.sink.table(response_body)
-- })
if code == 200 then
sysLog(res)
dialog(res, 0)
end
--获取外网ip地址
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local res, code = http.request('http://www.ip.cn/');
if code == 200 then
local i,j = string.find(res, '%d+%.%d+%.%d+%.%d+')
local ipaddr =string.sub(res,i,j)
dialog(ipaddr, 0)
end
1.返回的2个参数中,res 是 http body 的内容,也就是请求网页的内容,code 是 http 状态码,返回200的话就表示正常返回。
2.如果传入的是 table 的话,就需要用一个容器来接收 http body 的内容。
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local response_body = {}
local post_data = 'asd';
res, code = http.request{
url = 'http://127.0.0.1/post.php',
method = "POST",
headers =
{
['Content-Type'] = 'application/x-www-form-urlencoded',
['Content-Length'] = #post_data,
},
source = ltn12.source.string('data=' .. post_data),
sink = ltn12.sink.table(response_body)
}
1.这里注意记得 method 传入 POST, 因为默认是 GET。
2.headers 参数,由一个 table 组成,key 为 header,value 为 header 内容。
3.source 参数,这里是填入 POST 的参数,多个数据的情况用 & 隔开,例如 "data1=a&data2=b"。
4.此代码仅为举例说明,请勿直接复制使用。
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
http.PROXY = 'http://127.0.0.1:8888' --代理服务器地址
local result, code = http.request('http://www.baidu.com')
dialog(result or tostring(code), 0)
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local host = 'www.baidu.com'
local file = "/"
local sock = assert(socket.connect(host, 80)) --创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上
sock:send('GET ' .. file .. ' HTTP/1.0\r\n\r\n')
repeat
local chunk, status, partial = sock:receive(1024) --以 1K 的字节块接收数据
until status ~= 'closed'
sock:close() -- 关闭 TCP 连接
local bb = require("badboy")
bb.loadluasocket()
local smtp = bb.smtp
from = '<youmail@126.com>' -- 发件人
--发送列表
rcpt = {
'<youmail@126.com>',
'<youmail@qq.com>',
'<youmail@gmail.com>',
}
mesgt = {
headers = {
to = 'youmail@gmail.com', -- 收件人
cc = '<youmail@gmail.com>', -- 抄送
subject = "This is Mail Title"
},
body = "邮件内容"
}
r, e = smtp.send{
server = "smtp.126.com", --smtp服务器地址
user = "youmail@126.com",--smtp验证用户名
password = "******", --smtp验证密码
from = from,
rcpt = rcpt,
source = smtp.message(mesgt)
}
if not r then
dialog(e, 0)
else
dialog('发送成功!', 0)
end
local bb = require("badboy")
bb.loadluasocket()
local socket = bb.socket
server_ip = {
"132.163.4.101",
"132.163.4.102",
"132.163.4.103",
"128.138.140.44",
"192.43.244.18",
"131.107.1.10",
"66.243.43.21",
"216.200.93.8",
"208.184.49.9",
"207.126.98.204",
"207.200.81.113",
"205.188.185.33"
}
local function nstol(str)
assert(str and #str == 4)
local t = {str:byte(1,-1)}
local n = 0
for k = 1, #t do
n= n*256 + t[k]
end
return n
end
local function gettime(ip)
local tcp = socket.tcp()
tcp:settimeout(10)
tcp:connect(ip, 37)
success, time = pcall(nstol, tcp:receive(4))
tcp:close()
return success and time or nil
end
local function nettime()
for _, ip in pairs(server_ip) do
time = gettime(ip)
if time then
return time
end
end
end
dialog(nettime(),0)
local bb = require("badboy")
bb.loadluasocket()
local socket = bb.socket
local function sleep(sec)
socket.select(nil,nil,sec);
end
local t0 = socket.gettime()
sleep(0.4);
local t1 = socket.gettime()
dialog(t1 - t0, 0)
local bb = require("badboy")
bb.loadluasocket()
-- [ftp://][<user>[:<password>]@]<host>[:<port>][/<path>][type=a|i]
-- The following constants in the namespace can be set to control the default behavior of the FTP module:
-- PASSWORD: default anonymous password.
-- PORT: default port used for the control connection;
-- TIMEOUT: sets the timeout for all I/O operations;
-- USER: default anonymous user;
local ftp = bb.ftp
-- Log as user "anonymous" on server "ftp.tecgraf.puc-rio.br",
-- and get file "lua.tar.gz" from directory "pub/lua" as binary.
f, e = ftp.get("ftp://ftp.tecgraf.puc-rio.br/pub/lua/lua.tar.gz;type=i")
-- Log as user "fulano" on server "ftp.example.com",
-- using password "silva", and store a file "README" with contents
-- "wrong password, of course"
f, e = ftp.put("ftp://fulano:silva@ftp.example.com/README", "wrong password, of course")
-- Log as user "fulano" on server "ftp.example.com",
-- using password "silva", and append to the remote file "LOG", sending the
-- contents of the local file "LOCAL-LOG"
f, e = ftp.put{
host = "ftp.example.com",
user = "fulano",
password = "silva",
command = "appe",
argument = "LOG",
source = ltn12.source.file(io.open("LOCAL-LOG", "r"))
}
抓图说明:
截图:于设备截图,会出现精度条圆圈标志,等待时间过长或其他意外情况 点击叉或者按Esc结束.截图后显示图片,右键图片名显示菜单,可关闭图片
保存:保存当前图片
载入:载入图片,也可以拖入图片
左转:左边旋转90度
右转:右边旋转90度
放大:快捷键ctrl + 滚轮上, 放大当前图片
缩小:快捷键ctrl + 滚轮下, 缩小当前图片
1:1 :快捷键ctrl + o, 100%显示当前图片
截图旋转方向: 截图默认旋转的方向
Home键在下相当于init("0", 0)
Home键在右相当于init("0", 1)
Home键左相当于init("0", 2)
尺寸显示:旋转后改变方向
取色:快捷键 1,2,3,4,5,6,7,8,9,0 或鼠标右键菜单取色
取色微调:键盘上下左右方向键移动
取色器快捷键表
数字键(1 2 3 4 5 6 7 8 9 0)
分别取色到第1~10个位置
Ctrl + 数字键(1 2 3 4 5 6 7 8 9 0)
分别取色到11~20个位置
A、S
取 [坐标位 A] 和 [坐标位 S] 作为左上右下坐标到选择范围
光标(↑ ↓ ← →)
鼠标指针定位移动 1 个像素
回车键/Ctrl + 鼠标左键点击
取色到剪贴板的首个空白位置,已取色的位置不会被覆盖,如果无空白位置则不取色
Shift + Delete
清除已勾选的点色信息
Ctrl + Shift + Delete
清除所有点色信息
F5
刷新所有点色信息为当前图片的值
Ctrl + L/Ctrl + R
分别对代码窗口1、2的内容进行代码测试
Shift + L/Shift + R
分别复制代码窗口1、2的内容
-
缩小视图
=
放大视图
Ctrl + Tab
切换到下一个文档
Ctrl + Shift + Tab
切换到上一个文档
放大镜功能说明:
选择范围: A,S快捷键或 按钮点击选择范围.会出现红色线,按Esc键取消选择.注意选取范围时可鼠标滚动滚轮
颜色数据反选:在复选框上按住鼠标左键往下或者往上拖动,移动范围内反选颜色数据
可全选全删
格式:自定义生成代码. 在IDE目录下data.lua可以编辑格式
在datacolorfg中自己添加格式为:
{
title = "",
fScript = function(poslist,area, degree)
end,
sScript = function (poslist,area, degree)
end,
}