@miniknife
2021-01-07T04:01:03.000000Z
字数 112211
阅读 1187156
已不更新,最新版本查看:https://helpdoc.touchsprite.com/dev_docs/598.html
开发手册 触动精灵
Windows 平台按 Ctrl + F 打开快捷搜索
Mac 平台按 command + F 打开快捷搜索
※右侧文本列表可以找到全部手册
触动精灵是一款模拟手机触摸、按键操作的软件。通过制作脚本,可以让触动精灵代替双手,自动执行一系列触摸、按键操作。触动精灵简单、易用,不需要掌握任何编程知识就可以录制出功能强大的脚本;还可以使用编程知识,编写出功能更为复杂,交互更为灵活的脚本;只要能够在手机上完成的人为操作,触动精灵都可以代替完成,不仅省力,而且高效。
触动精灵采用 Lua 脚本语言作为底层语言,支持 Lua 5.2.3 版本的所有语法与基本函数,并在其的基础上添加了一些扩展函数,用于取色、找色、找图、发送触摸事件等高级功能的实现。
用户在阅读本函数说明前,请参考 Lua 的官方手册以及相关资料,学习以下基本语法:
- 注释
- 变量与类型
- 运算符
- 条件、循环控制
- 函数定义
- 库函数
- ……
本说明仅供初等文化水平以上的、了解计算机编程基本原理的个体学习与参考,并不适用于零基础的编程入门者学习编程基本知识。严禁用于商业以及非法目的,严禁转载、抄袭、未经许可地引用。
为了便于解释和描述,本说明中采用了一些非专业的描述与形容方法(如:number),敬请理解。因编写校对仓促,如有错误欢迎及时指正,本文中的示例仅供函数参考,不要直接用于脚本中。
重要提示:
Lua 官方手册:http:/http://manual.luaer.cn/
Lua 中文开发手册:http://book.luaer.cn/
Lua 基础简明教程:https://zybuluo.com/lisaisacat/note/636399
触动精灵的脚本开发、存储过程必须使用 UTF-8 文本编码,如果您出现脚本中文无法正常显示与处理,请在您使用的编辑器或 IDE 中设置文本编码为 UTF-8,谢谢。
- 在学习脚本开发之前,首先要具备一些关于 iOS 越狱和安卓 root 的知识,以及触动精灵的常用信息
- 文档链接:https://www.zybuluo.com/lisaisacat/note/324664
- 看了上面的文档,你可以具备以下知识:
- 什么样的手机适合用来做脚本开发
- 拿到一台越狱手机之后应该做什么才能避免白苹果和报错
- Cydia 不见了或者已安装界面空白该怎么办
- 为什么安装插件总是报错呢
- 首先你需要了解 Lua 这门语言的一些基础知识,什么是循环,什么是函数,布尔型和数值型分别是什么意思,才有可能看得懂下面的教程和手册。
- 文档地址:https://www.zybuluo.com/lisaisacat/note/636399
- 新手在学习使用触动精灵开发脚本的时候,总会进入一些误区,或者会有一些迷惑的点,觉得无从下手,本文总结了一些自己在学习过程中遇到的问题和经验技巧,欢迎大家一起交流分享。
- 文档链接:https://zybuluo.com/lisaisacat/note/508345
- 看了上面的文档,你可以具备以下知识:
- 透明背景图、动图、带动画的界面应该怎么取色
- 找色和找图哪个更好用
- 函数封装是什么
- 脚本报错了怎么办
- 如果你没有任何编程基础,可以先看一下零基础教学视频:https://www.zybuluo.com/lisaisacat/note/585252
- 看了上面的文档,你可以具备以下知识:
- deb 插件安装方法
- 平刷插件 Cydia Eraser
- SSH 命令工具 putty
- 触动精灵的安装使用及常识
- 抓色器和编辑器的使用及常识
- 同样的脚本为什么有的手机运行异常
- showUI 返回值的调用
- showUI 应该怎么写才简洁好用
- 大漠字库工具的用法
- 由于触动精灵在线文档数量较多,很多人不知道如何查询,现建立此文档做为索引,其中会补充一些软件使用的常用信息。
- 触动精灵旗下目前有四款软件:触动精灵(iOS/Android)、帮你玩商城(iOS/Android)、小精灵(iOS/Android)、企业版(iOS/Android)。
- 触动精灵适合开发者和有中控开发能力的工作室使用
- 小精灵适合有图标和包名自定义需求的开发者和工作室使用
- 企业版适合有批量控制设备需求的工作室使用
- 文档地址:https://www.zybuluo.com/miniknife/note/509515
| 产品名称 | 自定义图标 | 录制 | 调试 | 运行源码 | 授权 | 批量控制 | 支持平台 | 开发者平台 |
|---|---|---|---|---|---|---|---|---|
| 触动精灵iOS | × | √ | √ | √ | iOS:36 元/台/年,Android:免费 | 购买 API 自行开发 | iOS/Android | http://dev.touchsprite.com/site/index |
| 触动小精灵 | √ | × | × | × | 5.5 元/台/月 | 购买 API 自行开发 | iOS/Android | http://app.touchsprite.com/ |
| 触动企业版 | × | × | × | √ | iOS:46 元/台/年,Android:测试期 0.1 元/台/年 | 免费 | iOS/Android | http://ent.touchsprite.com/ |
安卓小精灵有免费版,但不能使用网络模块和高级函数库
安卓企业版测试期收费:0.1 元/台/年
在文档右侧栏顶部点击文档分类菜单栏按钮,即可查看触动精灵所有在线文档。

工欲善其事,必先利其器,在学习触动精灵脚本编写前我们需要下载安装一些辅助工具来完成脚本编写,包含但不限于以下工具:
使用教程:https://www.zybuluo.com/miniknife/note/307627
官方源地址:http://apt.touchsprite.com
测试源地址:http://apt-test.touchsprite.com
脚本存放路径:/var/mobile/Media/TouchSprite/lua
默认资源路径:/var/mobile/Media/TouchSprite/res
脚本日志路径:/var/mobile/Media/TouchSprite/log
配置文件路径:/var/mobile/Media/TouchSprite/config
使用教程:https://www.zybuluo.com/miniknife/note/443534
下载地址:http://www.touchsprite.com/touchsprite
脚本存放路径:/sdcard/TouchSprite/lua
默认资源路径:/sdcard/TouchSprite/res
脚本日志路径:/sdcard/TouchSprite/log
配置文件路径:/sdcard/TouchSprite/config
iOS插件文件路径:/sdcard/TouchSprite/plugin
Android插件文件路径:data/data/com.touchsprite.android/files/plugin
※安卓不同机型路径有差别,请用userPath函数获取路径
注意事项
- 有些函数不支持低版本触动精灵,请仔细阅读函数说明并尽量保持触动精灵客户端为最新版。
- 测试版为不稳定版本,为避免不必要的麻烦,请勿大规模安装。
- 测试版和正式版的 Bundle ID 不同,不能跨源覆盖安装或直接升级,请卸载之后再安装另一个源的版本。
- iOS 11 系统的设备,原 TouchSprite 文件夹下新增 plugin_ios11 快捷方式,连接到 usr/bin/tsplugin
- 如果系统是 iOS 11 则 tsp 自带 so 文件释放到该路径但 lua 文件释放路径保持不变
- 如果开发者想要手动导入 so 文件,也需要放到 usr/bin/tsplugin 目录下
支持函数自动补全、函数提示、关键字高亮、文件传送、远程运行、自动缩进等常用功能,已内置所有至最新 2.3.6 版本触动精灵扩展函数,推荐使用。
下载地址:http://www.touchsprite.com/tools
使用手册:https://www.zybuluo.com/miniknife/note/123055
视频教程:https://www.zybuluo.com/lisaisacat/note/324664#编辑器与抓色器的使用
一个趁手的抓色器可以让你的脚本开发过程变的轻松愉快,在此强烈推荐触动抓色器,快捷抓点、一键生成代码、远程抓屏,让你如虎添翼。具体使用方法请阅读压缩包内附带的说明(远程抓屏功能需使用触动精灵iOS v2.1.5 以上版本)。
下载地址:http://www.touchsprite.com/tools
使用手册:https://www.zybuluo.com/havonz/note/94681
视频教程:https://www.zybuluo.com/lisaisacat/note/324664#编辑器与抓色器的使用
雷电模拟器、猩猩模拟器、网易MUMU模拟器、夜神模拟器、海马玩模拟器、逍遥模拟器、51 模拟器
模拟器使用教程:https://www.zybuluo.com/miniknife/note/443336
从系统兼容和资源占用角度考虑,推荐使用雷电模拟器、夜神模拟器。
| 参数 | 类型 | 说明 |
|---|---|---|
| index | number | 手指序号(可省略) |
| x | number | 屏幕横坐标 |
| y | number | 屏幕纵坐标 |
脚本实例:
快速划动
touchDown(150, 550); --在坐标 (150, 550)按下mSleep(30);touchMove(150, 600); --移动到坐标 (150, 600),注意一次滑动的坐标间隔不要太大,不宜超过 50 像素mSleep(30);touchUp(150, 600); --在坐标 (150, 600) 抬起
连续划动
touchDown(150, 550); --在坐标 (150, 550) 按下for i = 0, 200, 10 do --使用 for 循环从起始点连续横向移动到终止点touchMove(150 + i, 550);mSleep(10); --延迟endtouchUp(150 + 200, 550); --在坐标 (350, 550) 抬起
精准滑动
方法一:
--精准滑动的原理就是通过向滑动方向的垂直线方向移动 1 像素来终止滑动惯性--简单的垂直精准滑动touchDown(200,1000)for i = 0, 500, 50 dotouchMove(200, 1000-i)mSleep(10)end--只要横向滑动 1 像素就可以精准滑动--横向滑动 1 像素touchUp(201, 500)mSleep(10)
方法二:
--使用 v1.2.7 版本 TSLib 新增的 touch() 函数进行滑动require("TSLib")touch():Step(50):on(200,1000):move(200,500):off()--减少步长也可以进行精准滑动
多点触控
touchDown(1, 200, 400); --手指 1 在坐标 (200, 400) 按下touchDown(2, 300, 500); --手指 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(10);endtouchUp(1, 200 - 100, 400 - 100); --抬起手指 1touchUp(2, 300 + 100, 500 + 100); --抬起手指 2
封装一个点击函数
function click(x, y)touchDown(x, y)mSleep(30)touchMove(x, y) -- 安卓部分机型单点不生效的情况下可以加上此句touchUp(x, y)endclick(100, 200) --点击坐标 100,200 位置
方形渐开线
init(1)mSleep(1000)local x = 1010 --起始坐标 xlocal y = 698 --起始坐标 ylocal v = 30 --两点间距离touchDown(x, y)mSleep(100)for var = 1,20 doj = 0k = vfor _i = 1,2 dofor i = 1,10 dox = x + jy = y + ktouchMove(x, y)mSleep(20)endj = vk = 0endv = v * (-1.05)endtouchUp(x, y)
圆形渐开线
init(1)mSleep(1000)local x0 = 1010 --起始坐标 xlocal y0 = 698 --起始坐标 ylocal rr = 20 --设置递增半径local l = 10 --设置点间距local p = 0 --初始化角度local r = 30 --设置首圈半径local rn = 10 --设置圈数touchDown(x0, y0)mSleep(100)for var = 1,rn dowhile p < math.pi * 2 dox = x0 + r * math.cos(p)y = y0 - r * math.sin(p)touchMove(x, y)mSleep(10)p = p + l/rendp = 0r = r + rrendtouchUp(x0, y0)
安卓点击滑动失效处理方法
在部分安卓应用程序中的 HTML5 页面中,出现脚本能够点击,但点击没有后续反应的问题。此问题目前可以通过以下写法来解决:
os.execute("input mouse tap x y"),其中 x,y 为坐标值
os.execute("input mouse swipe x1 y1 x2 y2")--滑动,x1,y1 为滑动初始坐标,x2,y2 为滑动结束坐标
如果以上命令还是不生效可以用下面的 API 方法代替 mouse 进行尝试:
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
touchscreen
gamepad
举例: os.execute("input keyboard tap 100 100")
注意事项:
- 需要注意的是在使用
touchDown、touchMove、touchUp函数时,中间一定要插入一定的延时,建议大于 20 毫秒,否则可能会出现点击无效等异常情况。- 使用滑动函数时,新手常犯的错误就是两点之间滑动距离过大,请注意
touchDown、touchMove的坐标间隔不宜超过 50 像素。- 非多点触控可省略手指 id
- 新手使用点击、随机点击、直线或角度滑动等相关函数请参考函数扩展库
名词解析:
- 手指序号,用于多点触控的支持。标记多只手指,来分别控制它们的移动。
- 屏幕坐标,横坐标为 x,纵坐标为 y,单位为像素。例如,iPhone 4 与 iPhone 4S 的屏幕分辨率 为 640 * 960,则其最大横坐标为 640,最大纵坐标为 960。
- for 循环是 Lua 基本语法,属于循环控制。
| 返回值 | 类型 | 说明 |
|---|---|---|
| x | number | 用户点击屏幕的横坐标 |
| y | number | 用户点击屏幕的纵坐标 |
| ret | table | 当touchCount参数有效时,将返回一个包含所有点击坐标的table |
| 参数 | 类型 | 说明 |
|---|---|---|
| touchCount | number | 所需获取的 点/坐标 个数(需引擎版本 iOS v2.2.4,Android v1.1.9 以上支持) |
脚本实例:
dialog("一秒后接收用户一次点击", 0);mSleep(1000);x,y = catchTouchPoint();dialog("x:"..x.." y:"..y, 0);
--获取多个点击坐标dialog("一秒后接收用户三次点击", 0);mSleep(1000);local ret = catchTouchPoint(3);for i = 1, #ret dodialog("第"..i.."次点击的位置:"..i..",x="..ret[i].x..",y="..ret[i].y);end
注意事项:
- 部分安卓模拟器不支持该函数。
- 此函数将阻止脚本继续运行, 一直等待用户完成屏幕点击。
- 此函数获取到的坐标为竖屏坐标,横屏情况请自行转换。
- 本函数有较小的延迟,连续点击时,请勿点击过快。
- 在 iOS 引擎版本 iOS v2.2.4,Android v1.1.9 以上中可接收多个点击坐标并以 table 形式返回。
| 参数 | 类型 | 说明 |
|---|---|---|
| Rotate | number | 必填,屏幕方向,0 - 竖屏,1 - Home 键在右边,2 - Home 键在左边 |
脚本实例:
init(0) -- iOS 设备以 Home 键在下方时的屏幕左上角为坐标系原点 (0,0),iOS7 以上系统有效;安卓设备以当前屏幕默认截图方向进行初始化
init(1); --iOS 设备以当前应用 Home 键在右边初始化,即以 Home 键在右侧时的横屏左上角为屏幕坐标原点 (0,0);安卓设备以屏幕默认截图方向向左旋转 90° 进行初始化
init(2); --iOS 设备以当前应用 Home 键在左边初始化,即以 Home 键在左侧时的横屏左上角为屏幕坐标原点 (0,0);安卓设备以屏幕默认截图方向向右旋转 90° 进行初始化
注意事项:
- 安卓系统不同设备初始的截图方向有所不同,编写脚本前请用截图函数确认设备的默认方向。
- 此函数可在脚本运行过程中多次调用以改变屏幕方向。
- 如在脚本中未指定屏幕方向,系统将默认为竖屏或初始方向。
- 安卓设备根据机型初始方向有区别,需要开发者自行调试,0 - 初始方向,1 - 初始方向向左旋转 90°,2 - 初始方向向右旋转 90°
参考资料:
Bundle ID 的获取方法
1. 在触动精灵客户端的 更多 -> 应用ID查询 中能查看到应用程序的 Bundle ID;
2. iOS 使用 iFile、PP助手等软件可查看应用文件夹下的 Info.plist,其中的 CFBundleIdentifier 即为该应用的 Bundle ID。
3. 使用 frontAppBid 函数,前台运行要获取 Bundle ID 的应用,运行此函数并用 diolag、toast、nLog 函数显示返回值。
| 返回值 | 类型 | 说明 |
|---|---|---|
| width | number | 获取到的屏幕宽度 |
| height | number | 获取到的屏幕高度 |
脚本实例:
根据分辨率判断脚本是否适配
width, height = getScreenSize();if width == 640 and height == 1136 then --iPhone SE, 5, 5S, iPod touch 5dialog("iPhone SE, 5, 5S, iPod touch 5")elseif width == 640 and height == 960 then --iPhone 4,4S, iPod touch 4dialog("iPhone 4,4S, iPod touch 4")elseif width == 320 and height == 480 then --iPhone 非高分屏dialog("iPhone 非高分屏")elseif width == 768 and height == 1024 then --iPad 1,2, mini 1dialog("iPad 1,2, mini 1")elseif width == 1536 and height == 2048 then --iPad 3,4,5, mini 2dialog("iPad 3,4,5, mini 2")elseif width == 1080 and height == 1920 thendialog("小米 4,华为荣耀 6p 等")elseif width == 720 and height == 1280 thendialog("红米 note2 等")elseif width == 768 and height == 1280 thendialog("魅蓝等")elseif width == 800 and height == 1280 thendialog("三星 N5100 等")elseif width == 480 and height == 800 thendialog("酷派 8017-T00 等")end
注意事项:
- 统一为 iOS 竖屏(Home 键在下方时)、安卓初始方向屏幕的宽度和高度。
- 部分安卓设备存在无法获取到屏幕分辨率的问题,需要在脚本中判断如果返回值小于 0 则指定一个固定的宽高。
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | true - 打开,false - 关闭 |
| width | number | 基准屏幕的宽度 |
| height | number | 基准屏幕的高度 |
脚本实例:
setScreenScale(true, 750, 1334) --以 750,1334 分辨率为基准坐标进行缩放--[[当此函数打开时,将影响点击、取色、单点模糊找色函数]]setScreenScale(false) --关闭缩放
注意事项:
- 当此函数打开时,受影响的函数为点击和单点找色函数:
touchDowntouchUptouchMovegetColorgetColorRGBfindColorInRegionFuzzysnapshot- 多点找色函数不受此函数影响
- 当两个设备宽高比相差较大时,此函数转换后的效果较差
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 保持开关 |
脚本实例:
遍历屏幕区块
keepScreen(true); --打开保持屏幕,当参数为 true 时启用屏幕保持,运行到该函数时内存中的屏幕图像保持在这一时刻for k = 1, 640, 10 dofor j = 1, 960, 10 do--格式化为十六进制文本color = string.format("%X", getColor(k, j));--输出到本地日志nLog("("..k..", "..j..") Color: "..color..".");endendkeepScreen(false); --关闭保持屏幕,当参数为 false 时关闭屏幕保持,释放内存中的屏幕图像,以备下一次继续保持。
注意事项:
- 据不完全统计,与不使用该函数相比,使用此函数会使普通屏上脚本取色速率提升 100 倍,高分屏上脚本取色速率提升 50 倍。在执行大量静态图像操作时,请务必使用该函数优化脚本性能。
- 该函数一般用于画面变动节奏较慢,但需要根据大量取色、找色来完成计算和操作的脚本中,例如"天天爱消除"、"天天星连萌"这样的游戏。
名词解析:
- 静态图像处理,指可在某一状态下屏幕内容保持到内存(不影响显示),对其进行进一步的 多次分析。否则,每次使用图像类函数,都将截取一次屏幕内容。
- 保持开关,逻辑型只有两种属性:true 为真,false 为假。
注意事项:
- 当使用 keepScreen(true); 时启用屏幕保持,运行到该函数时内存中的屏幕图像保持在这一时刻。
- 当使用 keepScreen(false); 时关闭屏幕保持,释放内存中的屏幕图像,以备下一次继续保持。
| 参数 | 类型 | 说明 |
|---|---|---|
| x | number | 将获取颜色值的屏幕横坐标 |
| y | number | 将获取颜色值的屏幕纵坐标 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| color | number | 该点的十进制颜色值RGB |
| color_r, color_g, color_b | number | 该点颜色的 RGB 值 |
脚本实例:
如果某点符合某颜色则点击
color = getColor(100, 100); --获取 (100,100) 的颜色值,赋值给 color 变量if color == 0xffffff then --如果该点的颜色值等于 0xfffffftouchDown(100, 100); --那么点击该点mSleep(30);touchUp(100, 100);end
--亦可写作
if getColor(100, 100) == 0xffffff thentouchDown(100, 100);mSleep(30);touchUp(100, 100);end
如果某点的颜色与某颜色相似则点击
r,g,b = getColorRGB(100,100); --获取(100, 100)的颜色值,赋值给 color 变量if r > 200 and g < 150 then --如果红色强度大于 200,绿色强度小于 150touchDown(100,100); --那么点击该点mSleep(30);touchUp(100,100);end
封装一个单点模糊比色函数
function isColor(x,y,c,s) --封装函数,函数名 isColorlocal fl,abs = math.floor,math.abss = 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 thenreturn trueendend--下面为函数用法if isColor(963, 961, 0x7b593f,90) then -- 90 为模糊值,值越大要求的精确度越高touchDown(963, 961)mSleep(50)touchUp(963, 961)end
多点模糊比色
在实际游戏脚本制作中,很多界面单靠 1 个点不容易进行准确的判断,这里封装一个配合 table 使用的多点模糊比色函数来实现精确判断:
zjing0910z88a
名词解析:
- 参数 s 为模糊度,范围 0 - 100,一般使用 90 即可。
- 实例中的 table 格式可使用触动精灵抓色器生成。
注意事项:
参考资料 如何获取屏幕上某点的颜色
- 在你想在设备上截图,iOS 同时按下
电源键和Home 键,安卓为电源键和音量键-即可进行截图(此时屏幕会闪一下)。- 使用触动精灵抓色器可方便的获取所需坐标点的颜色信息,推荐使用。
常见颜色表:http://www.114la.com/other/rgb.htm
名词解析
- R,G,B值,即代表红(Red)、绿(Green)、蓝(Blue)三个通道的颜色强度。
- 整型,指的是可以用十、十六、八进制指定的数据类型。使用十六进制符号,必须加上 0x。
- 赋值是 Lua 基本语法,操作符为"="(一个等号)。
- 等于是 Lua 基本语法,属于条件控制,操作符为"=="(两个等号)。新手常常将等于写作赋值,从而导致编译出现错误。
| 参数 | 类型 | 说明 |
|---|---|---|
| color | number | 将要找的十六进制颜色值 |
| degree | number | 寻找精度,范围:1 ~ 100,当是 100 时为完全匹配 |
| x1 | number | 找色区域左上角顶点屏幕横坐标 |
| y1 | number | 找色区域左上角顶点屏幕纵坐标 |
| x2 | number | 找色区域右下角顶点屏幕横坐标 |
| y2 | number | 找色区域右下角顶点屏幕纵坐标 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| x,y | number | 找到的点坐标,如未找到则返回 -1,-1 |
脚本实例:
1.精确寻找指定区域中,指定颜色的坐标,并按下
--寻找符合条件的点
x, y = findColorInRegionFuzzy(0x112233, 100, 50, 50, 300, 300);if x ~= -1 and y ~= -1 then --如果在指定区域找到某点符合条件touchDown(x, y); --那么单击该点mSleep(30);touchUp(x, y);else --如果找不到符合条件的点dialog("未找到符合条件的坐标!",0);end
2.模糊查找指定区域中,尽可能接近指定颜色的点,并按下
for deg = 100, 1, -1 do --使用 for 循环不断降低精确度x, y = findColorInRegionFuzzy(0xffffff, deg, 50, 50, 300, 300);if x ~= -1 and y ~= -1 then --如果在指定区域找到某点符合条件nLog("在模糊度:"..deg.."下找到一个相似的颜色,坐标:"..x..":"..y)touchDown(x, y); --那么单击该点mSleep(30)touchUp(x, y);break; --并跳出循环endend
注意事项:
- 未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。
- 通过不断降低模糊查找精确度的方法在指定区域查找到的不一定是最接近指定颜色的点,该代码应用过程中,建议使用"保持屏幕"减少性能损耗,参见"保持屏幕"一章。
| 参数 | 类型 | 说明 |
|---|---|---|
| picpath | string | 将要寻找的图片文件名(Android 仅支持 png 格式) |
| degree | number | 寻找精度,范围:1 ~ 100,当是 100 时为完全匹配 |
| x1 | number | 找色区域左上角顶点屏幕横坐标 |
| y1 | number | 找色区域左上角顶点屏幕纵坐标 |
| x2 | number | 找色区域右下角顶点屏幕横坐标 |
| y2 | number | 找色区域右下角顶点屏幕纵坐标 |
| alpha | number | 忽略的颜色值(透明色) 若无请填 0 |
| type | number | 找图类型,默认不写为 RGB 找图,更多请看注意事项 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| x,y | number | 找到的图片的左上角顶点坐标,如未找到则返回 -1,-1 |
脚本实例:
精确寻找指定区域中,指定图片的位置
--寻找符合条件的图片(假设图片的背景颜色为白色)x, y = findImageInRegionFuzzy("test_alpha.png", 90, 0, 0, 320, 480, 0xffffff);if x ~= -1 and y ~= -1 then --如果在指定区域找到某图片符合条件touchDown(x, y); --那么单击该图片mSleep(30)touchUp(x, y);else --如果找不到符合条件的图片dialog("未找到符合条件的坐标!",0);end
注意事项:
- 以下找图几种 type 方式:
type 为空 - RGB找图,适用于静态画面,找图速度快,兼容性一般
type 为 1 - 二值化找图,适用于所有画面,找图速度慢,兼容性好
type 为 2 - 二值化找图,适用于静态画面,找图速度快,兼容性好- Android 仅支持 png 格式图片。
- iOS 默认图片路径为 /var/mobile/Media/TouchSprite/res,Android 为 /mnt/sdcard/TouchSprite/res(参数中无需填写完整路径),自建目录请填写绝对路径。
- 忽略的颜色值指将要寻找的图片的背景颜色,即在屏幕画面上不匹配寻找对象的背景颜色。
- 若该函数找图不理想可使用
findImage 高级区域找图,几种找图方式可配合使用。- 参数 type 为 1 需引擎版本 iOS v2.3.6-7 以上支持,type 为 2 需要引擎版本 iOS v2.3.7 以上支持。
| 参数 | 类型 | 说明 |
|---|---|---|
| color | number | 欲寻找的参照点颜色 |
| posandcolor | string | 周边点颜色参数 |
| degree | number | 寻找精度,范围:1 ~ 100,当是 100 时为完全匹配 |
| x1 | number | 找色区域左上角顶点屏幕横坐标 |
| y1 | number | 找色区域左上角顶点屏幕纵坐标 |
| x2 | number | 找色区域右下角顶点屏幕横坐标 |
| y2 | number | 找色区域右下角顶点屏幕纵坐标 |
| table | table | 高阶用法 |
高阶用法
| 参数 | 类型 | 说明 |
|---|---|---|
| orient | number | 选填,0 - 8,代表找色方向,支持版本详见注意事项 |
| main | number | 选填,参照点的偏色,支持 iOS v2.4.1,Andriod v2.3.5.4 以上版本,例如 main = 0x101010(十六进制) |
| list | number | 选填,周边点的偏色,支持 iOS v2.4.1,Andriod v2.3.5.4 以上版本,例如 list = 0x202020(十六进制) |
| 返回值 | 类型 | 说明 |
|---|---|---|
| x, y | number | 返回符合条件的参照点的坐标,如未找到则返回 -1,-1 |
基础用法:
当我们使用“区域模糊找色”函数时,常常会因为屏幕上有大量符合指定颜色的点而找不到 需要的坐标。该函数通过在寻找到一个符合指定颜色 color 的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的图案是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。
我们首先找到一个点:
这个点的颜色为 0x181F85,坐标为 (268, 802)。
记录下来,接着找这个按钮上的另外一个点:
这个点的颜色为 0x00BBFE,坐标为 (297, 803),相对于第一个点的坐标为 (29, 1)。 记录下来,接着找这个按钮上的第三个点和第四个点。
第三个点的颜色为 0x0B6BBE,坐标为 (371, 798),相对于第一个点的坐标为 (103, -4)。
第四个点的颜色为 0x150972,坐标为 (333, 811),相对于第一个点的坐标为 (65, 9)。
现在我们找到了需要的三个点:
| 序号 | 颜色 | 坐标 | 相对坐标 |
|---|---|---|---|
| 1 | 0x181F85 | (268, 802) | (0, 0) |
| 2 | 0x00BBFE | (297, 803) | (29, 1) |
| 3 | 0x0B6BBE | (371, 798) | (103, -4) |
| 4 | 0x150972 | (333, 811) | (65, 9) |
现在我们可以把它写成多点找色的格式了:
--多点找色--在屏幕上以左上角坐标 (0,0) 和右下角坐标 (639, 959)确定的区域(即全屏)范围内寻找符合偏移范围和颜色的3个坐标点x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE,103|-4| 0x0B6BBE,65|9|0x150972", 100, 0, 0, 639, 959);dialog(x..","..y, 0)
那么返回的(x, y)就应该是(268,802)了。即使这个按钮平移了,这个点的坐标变了,也可以寻找到其准确位置。
高阶用法:
多方向找色规则:
orient 不填或 orient = 0 表示包括基准点在内的所有参照点都必须在查找范围之内 ,orient = 1 - 8 表示使用 8 种不同的找色方向。
只要写了 orient 参数,那么找色方向就会根据 init() 设置方向旋转,一直保持以当前设置的屏幕方向左上角为初始点。
![]()
orient = 1,左上角到右下角,纵向开始找色,先找到 a 顶点。
orient = 2,左上角到右下角,横向开始找色,先找到 b 顶点。
orient = 3,右上角到左下角,横向开始找色,先找到 c 顶点。
以此类推。
完整演示代码、image、多点找色示例图:
多方向找色方法:
x,y = findMultiColorInRegionFuzzy( 0x000000, "0|0|0x000000", 95, x1, y1, x2, y2, { orient = 1 })--支持版本:iOS 3.0.0-118,Android 2.3.5 以上
偏色用法:
--另外一种偏色模式,引擎版本 iOS v2.4.1,Andriod v2.3.5.4 以上支持--main 为参照点 0xffffff 的偏色,list 为周边点的偏色,如果想对每一个周边点单独偏色,在每一个偏色后面加上偏色值即可,如 "0|0|0x1ac819|0x202020"x, y = findMultiColorInRegionFuzzy(0xffffff,"0|0|0x1ac819,-4|-208|0x18cb76,3|58|0x21cc79", 90, x, y, x0, y0, { main = 0x101010, list = 0x202020 } )--main 及 list 参数暂不支持 Androiddialog(x..","..y, 0)
注意事项:
- posandcolor 参数中的坐标为相对坐标。
- 多点找色的代码可直接用触动精灵取色工具生成,其使用方法参见图文教程。
- 颜色值的十六进制文本中,其顺序为 RGB。
- 相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。
- 使用此函数时精度参数设置过低,会导致性能大幅下降。
- 引擎版本 iOS v2.4.5-9,v3.0.0-118 以上版本,如果 orient = 1 - 8 按方向进行查找,只要目标点在查找范围内,不需要基准点须在查找范围之内。
- 引擎版本 Android v2.3.5 以上版本,如果 orient = 1 - 8 按方向进行查找,Android v2.3.5.4 以上版本支持 orient = 0。
| 参数 | 类型 | 说明 |
|---|---|---|
| color | number | 欲寻找的参照点颜色 |
| posandcolor | string | 周边点颜色参数 |
| degree | number | 寻找精度,范围:1 ~ 100,当是 100 时为完全匹配 |
| x1 | number | 找色区域左上角顶点屏幕横坐标 |
| y1 | number | 找色区域左上角顶点屏幕纵坐标 |
| x2 | number | 找色区域右下角顶点屏幕横坐标 |
| y2 | number | 找色区域右下角顶点屏幕纵坐标 |
| table | table | 选填,高阶用法,详见 findMultiColorInRegionFuzzy 函数 |
高阶用法
| 参数 | 类型 | 说明 |
|---|---|---|
| orient | number | 选填,0 - 8,代表找色方向,支持版本详见注意事项 |
| main | number | 选填,参照点的偏色,支持 iOS v2.4.1,Andriod v2.3.5.4 以上版本,例如 main = 0x101010(十六进制) |
| list | number | 选填,周边点的偏色,支持 iOS v2.4.1,Andriod v2.3.5.4 以上版本,例如 list = 0x202020(十六进制) |
| 返回值 | 类型 | 说明 |
|---|---|---|
| point | table | 以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的 table 为空 |
返回的 table 为以下形式:
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 --如返回的table不为空(至少找到一个符合条件的点)for var = 1,#point donLog(point[var].x..":"..point[var].y)endend
偏色用法:
--另外一种偏色模式,引擎版本 iOS v2.4.1,Andriod v2.3.5.4 以上支持--main 为参照点 0xffffff的偏色,list 为周边点的偏色,如果想对每一个周边点单独偏色,在每一个偏色后面加上偏色值即可,如 "0|0|0x1ac819|0x202020"point = findMultiColorInRegionFuzzyExt(0xffffff,"0|0|0x1ac819,-4|-208|0x18cb76,3|58|0x21cc79", 90, x, y, x0, y0, { main = 0x101010, list = 0x202020 } )if #point ~= 0 then --如返回的 table 不为空(至少找到一个符合条件的点)for var = 1,#point donLog(point[var].x..":"..point[var].y)endend
多点方向用法:
x,y = findMultiColorInRegionFuzzyExt( 0x000000, "0|0|0x000000", 95, x1, y1, x2, y2, { orient = 1 })
注意事项:
- posandcolor 参数中的坐标为相对坐标。
- 多点找色的代码可直接用触动精灵取色工具生成,其使用方法参见图文教程。
- 颜色值的十六进制文本中,其顺序为 RGB。
- 相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。
- 使用此函数时精度参数设置过低,会导致性能大幅下降。
- 引擎版本 iOS v2.4.5-9,v3.0.0-118 以上版本,如果 orient = 1 - 8 按方向进行查找,只要目标点在查找范围内,不需要基准点须在查找范围之内。
- 引擎版本 Andriod v2.3.5.4 以上版本,如果 orient = 0 - 8 按方向进行查找。
| 参数 | 类型 | 说明 |
|---|---|---|
| picpath | string | 将要寻找的图片文件名 |
| x1 | number | 找色区域左上角顶点屏幕横坐标 |
| y1 | number | 找色区域左上角顶点屏幕纵坐标 |
| x2 | number | 找色区域右下角顶点屏幕横坐标 |
| y2 | number | 找色区域右下角顶点屏幕纵坐标 |
| alpha | number | 误差值,此参数值越低找图越严格,默认为 40000000, 最低为0,当写0时为完全匹配,此参数可省略 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| x,y | number | 找到的图片的左上角顶点坐标,如未找到则返回 -1,-1 |
脚本实例:
1.精确寻找指定区域中,指定图片的位置
--寻找符合条件的图片
snapshot("test.png",1,1,55,55) --截图到资源文件夹x, y = findImage("test.png", 0, 0, 120, 480);--在(0,0)到(120,480)寻找刚刚截图的图片if x ~= -1 and y ~= -1 then --如果在指定区域找到某图片符合条件toast(x..y); --显示坐标else --如果找不到符合条件的图片toast("没有找到图片!");end
注意事项:
- 此函数推荐与 snapshot 截图函数配合使用,成功率较高。
- 匹配精度建议每次加减 1000000,此参数值越低匹配精度越高
- 默认图片路径为 /var/mobile/Media/TouchSprite/res(参数中无需填写完整路径),自建目录请填写相对路径。
- 若该函数找图不理想可使用
findimageinregionfuzzy模糊区域找图,几种找图方式可配合使用。
| 参数 | 类型 | 说明 |
|---|---|---|
| picname | string | 截图保存的文件名 |
| x1 | number | 找色区域左上角顶点屏幕横坐标 |
| y1 | number | 找色区域左上角顶点屏幕纵坐标 |
| x2 | number | 找色区域右下角顶点屏幕横坐标 |
| y2 | number | 找色区域右下角顶点屏幕纵坐标 |
| quality | number | 仅支持 iOS,当截图格式选为 jpg 时,可用此参数控制图片质量,此参数值为大于 0 且小于等于 1 的值 |
脚本实例:
iOS 示例
snapshot("test.png", 0, 0, 639, 1135); --以 test 命名进行截图
--全屏截图(iPhone 5, 5S),并以当前日期为文件名保存
current_time = os.date("%Y-%m-%d", os.time());snapshot(current_time..".png", 0, 0, 639, 1135); --以时间戳命名进行截图snapshot(current_time..".jpg", 0, 0, 639, 1135, 0.5); --使用 jpg 格式截图,并设置图片质量为 0.5
Android 示例
--全屏截图(以小米 4 为例),并以当前日期为文件名保存
current_time = os.date("%Y-%m-%d", os.time()); --以时间戳命名进行截图w,h = getScreenSize();-- 右下角顶点坐标最大为 (宽度最大值-1, 高度最大值-1)snapshot(current_time..".png", 0, 0, w-1, h-1);
注意事项:
- Android 系统保存图片支持 png 及 jpg 格式,不可以设置质量;iOS 系统保存图片的格式可为 bmp, jpg, png,因为 png 是 iOS 中最常见的格式,所以推荐选择 png。
- 截图时,如使用全屏截图,右下角顶点坐标最大为 ((宽度最大值 - 1, 高度最大值 - 1),否则 iOS 系统会出现越界错误,安卓系统截出的图会是纯白色的。
- 默认图片路径请使用
userPath函数获取,具体使用方法请参阅 对应章节,自建目录请填写相对路径,文件相同将会被覆盖- 本文 iOS 实例中 os.date 与 os.time 为 Lua 基本库函数,请查阅附录 Lua 操作系统函数库。
- ".." 为字符串连接操作符,可以将字符串变量、常量连接在一起。
- 本文 iOS 实例中 640 * 1136 为 iPhone 5,5S 等设备的分辨率,实际使用中请根据运行设备替换为对应值。
- quality 参数仅在引擎版本高于 iOS v2.0.9 时方可使用。
- 当引擎版本高于 iOS v2.2.5-1,Android v2.0.5 时,四个坐标参数省略,默认截取全屏图像。
返回值:number flag
| 参数 | 类型 | 说明 |
|---|---|---|
| pictb | table | 需合并图片的文件名列表,支持使用绝对路径 |
| path | string | 生成新图片的文件名,支持使用绝对路径 |
| type | number | 合并类型,0 - 横向合并;1 - 竖向合并 |
| quality | number | 当生成图片格式为 jpg 时,可控制图片质量,范围[0 - 1] |
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | number | 0 - 成功;1 - 失败;2 - 失败;3 - 失败 |
脚本实例:
snapshot("1.png",100,100,200,200) --截取屏幕上左上角坐标为 (100,100),右下角坐标为 (200,200) 区域,宽高皆为 100 像素的图片,图片名为 1.pngsnapshot("2.png",100,200,200,300) --截取屏幕上左上角坐标为 (100,200),右下角坐标为 (200,300) 区域,宽高皆为 100 像素的图片,图片名为 2.pngsnapshot("3.png",100,300,200,400) --截取屏幕上左上角坐标为 (100,300),右下角坐标为 (200,400) 区域,宽高皆为 100 像素的图片,图片名为 3.pngimageOperMerge({"1.png","2.png","3.png"},"4.jpg",0,0.5) --将上面截取的三张图片合成为一张并命名为 4.jpg
注意事项:
- iOS 系统默认图片路径为 /var/mobile/Media/TouchSprite/res,自建目录请填写相对路径
- 当脚本要上传到企业版和小精灵平台时,请使用 userPath 函数代替 /res 之前的目录使之自动获取。
返回值:无
| 参数 | 类型 | 说明 |
|---|---|---|
| text | string | 提示信息,将在设备屏幕上以弹窗形式显示 |
| time | number | 提示信息显示的时间,不限时间请填 0 |
脚本实例:
1. 欢迎使用
dialog("欢迎使用触动精灵!", 5); --Android 系统在部分设备上需要在系统设置里开启悬浮窗权限方可正常使用此函数mSleep(1000);dialog("本脚本仅供演示对话框的用法。\n 提示信息可以换行。",0);
注意事项:
- time 参数时间一般在 2 秒以上,否则出现时间太短看不清楚。
- 该函数仅供呈现提示信息给用户,不可接收返回值。
- 该函数所产生的提示窗口显示的时候会影响当前屏幕取色,请在合理的位置使用该函数。
- 关于转义字符:\r \n 为换行,请查阅 Lua 转义字符表。
- 在引擎版本 iOS v2.2.4 以上版本中,
time参数可省略,如省略将按 0 处理。- 安卓系统在部分设备上需要在系统设置里开启使用此函数方可正常。
返回值:无
| 参数 | 类型 | 说明 |
|---|---|---|
| text | string | 提示信息,将在设备屏幕上以 HUD 形式显示 |
| time | number | 停留时间(单位:秒),当触动精灵版本高于 v2.3.0 时有效 |
脚本实例:
1. 欢迎使用
toast("欢迎使用触动精灵!");mSleep(3000);-- 建议 toast 函数后面添加 3 秒间隔否则可能显示错误toast("本脚本仅供演示toast函数效果。\n 提示信息可以换行。");
注意事项:
- 该函数所产生的提示信息将以 HUD 形式显示在屏幕上,该函数所产生的提示信息可能会影响当前屏幕的找色,请合理使用。
返回值:number choice
| 参数 | 类型 | 说明 |
|---|---|---|
| Text | string | 提示信息 |
| cbtn | string | 默认按钮标题,不需要请填 "" |
| btn1 | string | 可选按钮 1,不需要请填 "" 或 0 |
| btn2 | string | 可选按钮 2,不需要请填 "" 或 0 |
| time | number | 提示信息显示的时间,不限时间请填 0 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| choice | number | 返回用户按下按钮的序号 cbtn == 0;btn1 == 1;btn2 == 2 |
脚本实例:
1. 选择性别(双选)
choice = dialogRet("请选择您的性别:", "男", "女", "", 0);
choice = dialogRet("请选择您的性别:", "取消", "男", "女", 0);if choice == 0 then --取消dialog("您放弃了选择",0);mSleep(1000);elseif choice == 1 then --男dialog("你好,帅哥",0);mSleep(1000);elseif choice == 2 then --女dialog("你好,美女",0);mSleep(1000);end
dialogRet("这里是许可协议或广告,强制阅读 30 秒不可消除。", "", "", "", 30);
注意事项:
- 请勿将三个按钮都设置为空,再将 time 参数设置为 0,这样将造成出现无法消失也没有按钮的对话框,造成设备无法进行其它操作,只能重启(已在 2.3.6 版本中修复)。
- 值得一提的是,cbtn 总是对话框的最右边或者最下面的按钮。
- 参数中的 0 是数字,不是文本 "0"。
- 当 time 参数不为 0 并且用户没有选择,超时将返回 3。
返回值: text_a, text_b
| 参数 | 类型 | 说明 |
|---|---|---|
| title | string | 提示标题 |
| format | string | 编辑框中浅色的提示文字,如果需要两个编辑框,则将提示文字用 "#" 分割 |
| btn | string | 确认按钮标题 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| text_a,text_b | string | 返回用户输入的文本 |
脚本实例:
1. 单编辑框 - 输入姓名
text_a = dialogInput("请输入您的姓名", "在这里输入姓名", "确认");mSleep(1000);
::getInfo::--设置跳转标签text_a, text_b = dialogInput("请选择您的姓名和年龄", "在这里输入姓名 #在这里输入年龄", "确认");text_b = tonumber(text_b) --年龄转化成数字类型mSleep(1000);if text_b ~= nil and text_a ~= "" then --均已填写dialog("你好,"..text_b.." 岁的 "..text_a.." 。",5);mSleep(1000);elseif text_a ~= "" then --只填写了姓名dialog("你好, "..text_a..",忘记年龄了? 请输入年龄。",5);goto getInfomSleep(1000);else --均未填写dialog("请填写您的信息!",5);mSleep(1000);goto getInfo; --返回重新填写end
注意事项:
- 一般来说,使用该函数都要对用户输入的数据进行一定的检查,例如要求非空、长度不得少于。
- 使用双编辑框时,函数返回的两个字符串顺序与 format 中的顺序相反,请注意。
- 由于对话框事件需要响应时间,所以建议每次使用对话框,均应使用延迟。
名词解析:
- goto 是 Lua 基本语法,设置标签,然后使用 goto 函数跳转到代码的指定位置向下执行。该函数请谨慎使用,因为大量的跳转会造成代码编写的混乱。
| 参数 | 类型 | 说明 |
|---|---|---|
| name | string | 日志文件名或服务器地址与端口 不带后缀,自动添加.log |
| flag | number | 可选输出方式 |
| contents | string | 日志内容,在该参数中,加入"[DATE]"自动替换为当前可读时间 |
脚本实例:
1.写到本地日志
initLog("test", 0); --生成 test.log 文件,把 0 换成 1 即生成写入的文件名称加时间.log 的文件,形似 test_1397679553.log 的日志文件wLog("test","[DATE] Test_1 OK!!!"); --写入日志,日志内容:当前时间 Test_1 OK!!!mSleep(500); --间隔时间 500 毫秒wLog("test","[DATE] Test_2 OK!!!"); --写入日志,日志内容:当前时间 Test_2 OK!!!closeLog("test"); --关闭日志
2.发送服务器日志
initLog("192.168.1.1", 2); --初始化日志,并以异步方式发送;把 2 换成 3 即为同步发送wLog("192.168.1.1", "[DATE] Test OK!!!"); --发送日志内容:当前时间 Test_1 OK!!! 到 192.168.1.1(控制端 IP 即电脑 IP)closeLog("192.168.1.1"); --关闭服务器连接
3.多日志记录
initLog("test_1", 0); --初始化日志 test_1.loginitLog("test_2", 0); --初始化日志 test_2.logwLog("test_1","[DATE] Test_1 OK!!!"); -- test_1.log 中写入 当前时间 Test_1 OK!!!mSleep(500); --间隔时间 500 毫秒wLog("test_2","[DATE] Test_2 OK!!!"); -- test_2.log 中写入 当前时间 Test_2 OK!!!closeLog("test_1"); --关闭 test_1.log 日志closeLog("test_2"); --关闭 test_2.log 日志
注意事项
- 需要引擎版本 iOS v1.7.0,Android v1.0 及以上版本支持,flag 参数设置为 2 和 3 暂时只支持 iOS 设备,并需要配合触动精灵日志服务端 使用,要求设备与运行服务端的 PC 处于同一网段。
- 该函数支持多日志记录,即可以定义并初始化多个日志用于分类存放。
- 此函数一般用于脚本开发阶段,若脚本开发完成,只需注释掉 initLog 即可。
- 日志的编码为 UTF-8,请使用支持 UTF-8 编码的编辑器查看。
| 参数 | 类型 | 说明 |
|---|---|---|
| content | string | 需要显示的日志内容 |
-- 打开命令行 切换到adb文件目录下 输入 adb logcat -s touchspritesysLog("start")os_type = getOSType()if os_type == "android" thensysLog("Android")elsesysLog("iOS")endsysLog("end")
注意事项:
- 该函数将日志输出到系统级日志中,iOS 系统请使用 iTools 或 XCode 查看,Android 系统使用adb工具查看,过滤标识为 touchsprite。
- 当使用同步消息传送时,脚本需等待日志已经到达服务端才继续执行下面的指令。
- 当使用异步消息传送时,调用者在发送消息以后可以不用等待响应,可以接着处理其他任务。 即发送日志无需等待发送完成即可继续执行。
- 注释的操作符形式为 --...... 或 --[[......]] ,可将用于说明的代码写入脚本以便开发时理解。
| 参数 | 类型 | 说明 |
|---|---|---|
| content | string | 需要显示的日志内容 |
脚本实例:
for var = 1,50 donLog("[DATE]"..var);--在编辑器的日志输入界面查看mSleep(100);end
注意事项:
- 该函数需要脚本编辑器 v1.0.3 以上支持。
- 此函数仅作为调试用途,由触动精灵脚本编辑器发起的脚本运行将会接收到 nLog 回传信息,其他方式运行的脚本将不会触发 nLog 函数。
- 使用该函数无需设置日志接收端 IP 地址。
- 请在编辑器的日志输出面板查看该函数返回的日志信息。
- 当脚本中频繁使用此函数时,由于日志是异步发送的,如果编辑器接收到的日志内容没有按照顺序显示,是正常现象。此问题可以通过在 nLog 之间插入toast 函数解决。
函数名称:文件解压
函数功能:文件解压,解压压缩包
支持版本:仅 Android v2.3.5 及其以上版本支持
函数方法:
unzip(zipPath,filePath)
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| 参数 | 类型 | 说明 |
| zipPath | string | 压缩包路径 |
| filePath | string | 解压路径 |
脚本实例:
unzip(userPath() .. "/web.zip",userPath() .. "/res/")
函数名称:文件压缩
函数功能:文件压缩
支持版本:仅 Android v2.3.5 及其以上版本支持
函数方法:
zip(zipPath,filePath)
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| zipPath | string | 压缩包路径 |
| filePath | string | 需要压缩的路,只支持压缩文件夹 |
脚本实例:
zip("/mnt/sdcard/TouchSprite/web.zip","/mnt/sdcard/TouchSprite/web")
| 参数 | 类型 | 说明 |
|---|---|---|
| interval | number | 单位为毫秒,脚本暂停执行的时间长度 |
脚本实例:
1.延迟1秒和1分钟
mSleep(1000); --延迟1秒钟mSleep(60 * 1000) --此函数不适合用于长时间的精确计时,如长时间的精确计时请使用 os.time
2.按住 3 秒不松手
touchDown(200, 300); --按下mSleep(3000); --延迟 3 秒touchUp(200, 300); --抬起
注意事项:
- 延迟函数的使用与各类函数的使用息息相关,尤其是触摸类函数。脚本一般是用来模拟人在界面上的操作,因此要考虑人在各种情况下的延迟、界面加载时的响应时间。
- 延迟间隔不可过短,当 interval <= 50 ms 时,延迟精确度大幅下降,当 interval <= 16 ms 时,实际延迟约在 16 ms左右。
- 请勿将此函数用于长时间的精确计时。
- 1 秒 (s) = 1000 毫秒 (ms)。
脚本实例:
弹出许可协议,若不同意则退出脚本
ret = dialogRet("许可协议\n协议内容", "同意", "不同意", 0, 0);if ret == 0 then --如果按下"同意"按钮toast("您选择了同意")elsetoast("您选择了不同意,脚本退出运行")lua_exit(); --否则退出脚本mSleep(10)mSleep(10)mSleep(10) --lua的机制是调用此函数之后的下一行结束,如果不希望出现此情况可以在调用函数之后加入一行无意义代码。end
注意事项:
- 需要注意的是调用该函数时,脚本并非立即终止执行,脚本将会在你调用此函数之后的下一行结束,如果不希望出现此情况可以在调用函数之后加入一行无意义代码即可。
脚本实例:
dialog("重载脚本", 0)lua_restart()dialog("执行不到这里", 0)
注意事项:
- 此函数作用相当于停止脚本后重新运行脚本。
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 状态标识 true - 开启来电暂停;false - 关闭来电暂停 |
脚本实例:
luaExitIfCall(true); --当有电话拨入时,检查来电暂停状态标识,若为 true,则立即终止脚本;若为 false,则继续运行脚本init(0);
注意事项:
- 该函数在脚本中可使用多次,以调整配置。
- 当有电话拨入时,检查来电暂停状态标识,若为 true,则立即终止脚本;若为 false,则继续运行脚本。
- 引擎版本 iOS v2.2.4 以上版本将停止改为暂停。
| 返回值 | 类型 | 说明 |
|---|---|---|
| tsp.type | string | 返回当前脚本的类型: lua tsp p4u |
| tsp.auth | number | 返回当前脚本的授权状态: 0 - 未授权;1 - 已授权;2 - 试用中 |
| tsp.id | string | 返回当前脚本的 ID(此 ID 唯一,可在开发者平台查看) |
脚本实例:
tsp = checkScriptAuth()nLog(tsp.type) --输出脚本类型 lua tsp p4u
tsp = checkScriptAuth()nLog(tsp.id) --输出 tspid 号,脚本必须为 tsp 否则返回空值
tsp = checkScriptAuth()if tsp.auth == 2 then --试用字段 iOS 只支持 v2.4.1,Android v2.2.4 以上版本dialog("脚本状态:试用中")elseif tsp.auth == 1 thendialog("脚本状态:已激活")elsedialog("脚本状态:未激活")end
| 返回值 | 类型 | 说明 |
|---|---|---|
| time | number | 返回从 1970年1月1日到当前状态的秒数,如获取失败则返回 0 |
脚本实例:
获取网络时间 & 格式化网络时间
time = getNetTime();time_year = os.date("%Y",time) --格式化 time 值获取年份toast(time_year)mSleep(3000)time_M = os.date("%m",time) --格式化 time 值获取月份toast(time_M)mSleep(3000)time_D = os.date("%d",time) --格式化 time 值获取日toast(time_D)mSleep(3000)toast(os.date("%Y年%m月%d日",time)) --连起来可以写成这样mSleep(3000)toast(os.date("%Y年%m月%d日%H点%M分%S秒",time)) --或这样
获取网络时间并判断脚本过期
origin = 1404439947; --代表北京时间 2014/7/4 10:12:27origin_text = os.date("%Y/%m/%d %X", origin); --格式化时间current = getNetTime(); --获取网络时间current_text = os.date("%Y/%m/%d %X", current); --格式化时间if origin >= current thendialog("脚本尚未过期!", 5);elsedialog("脚本已经过期!\n脚本使用期限:"..origin_text.."\n当前时间:"..current_text, 5);lua_exit();end
注意事项:
- 该函数需要网络支持,且根据网络状况有所延迟。
- 当无法正确获取的时候该函数返回0。
| 参数 | 类型 | 说明 |
|---|---|---|
| lastname | string | 联系人姓 |
| firstname | string | 联系人名 |
| mobile | string | 联系人电话号码 |
脚本实例:
addAB = {{lastname="小",firstname="明",mobile="10080"},{lastname="小",firstname="红",mobile="10010"},{lastname="小",firstname="白",mobile="10000"}}for _,v in ipairs(addAB) doaddContactToAB(v)end
脚本实例:添加 100 个号码到手机通讯录
addAB = {}f = 1for k = 1860996268,1860996368 ,1 doaddAB[f] = {lastname,firstname,mobile} --通过 f 的值按顺序创建表格addAB[f].lastname = tostring(k) --生成姓addAB[f].firstname = tostring(k) --生成名addAB[f].mobile = tostring(k) --生成电话号码f = f + 1endfor _,v in ipairs(addAB) doaddContactToAB(v) --添加到联系人end
注意事项:
- 批量导入数据量过大的时候,导入过程会比较长。
本模块提供了对 UTF-8 编码的基础支持。 所有的函数都放在表 utf8 中。
除非另有说明, 当一个函数需要一个字节位置的参数时, 都假定这个位置要么从字节序列的开始计算, 要么从字符串长度加一的位置算。 和字符串库一样,负的索引从字符串末尾计起。
| 参数 | 类型 | 说明 |
|---|---|---|
| number_(*) | number | 输入的整数序列 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| str | string | 整数序列转换对应字符串 |
函数用例:
str = utf8.char(35302,21160,31934,28789)dialog(str, time)
扩展:
- utf8.charpattern字符串用于精确匹配到一个 UTF-8 字节序列的模式
详情参照这里:http://www.runoob.com/manual/lua53doc/manual.html#6.4.1
| 参数 | 类型 | 说明 |
|---|---|---|
| str | string | 输入的字符串 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| index | number | 字符位置(按字节数) |
| code | number | 字符编码 |
函数用例:
str = "触动精灵"for index,code in utf8.codes(str) dodialog(string.format("%s的unicode编码为\\u%0x",index,code),time)end
注意事项:
- 返回字符位置按字节数计算。
- 如果处理到一个不合法的字节序列,将抛出一个错误。
| 参数 | 类型 | 说明 |
|---|---|---|
| str | string | 输入的字符串 |
| i | number | 开始位置,可缺省,默认为 1 |
| j | number | 结束位置,可缺省,默认为 1 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| strcode | number | 字符串中指定位置的字符编码 |
函数用例:
local str = "触动精灵"strcode = utf8.codepoint (str)dialog(strcode, time)
注意事项:
- 如果处理到一个不合法的字节序列,将抛出一个错误。
| 参数 | 类型 | 说明 |
|---|---|---|
| str | string | 输入的字符串 |
| i | number | 开始位置,可缺省,默认为1 |
| j | number | 结束位置,可缺省,默认为-1 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| length | number | 字符串中指定位置的字符个数 |
函数用例:
local str = "触动精灵"length = utf8.len (str)dialog(length, time)
注意事项:
- 如果处理到一个不合法的字节序列, 返回第一个不合法字节的位置。
| 参数 | 类型 | 说明 |
|---|---|---|
| str | string | 输入的字符串 |
| n | number | 查找的第几个字符 |
| i | number | 开始位置,可缺省 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| start_num | number | 字符串中第n个字符的开始位置 |
函数用例:
local str = "触动精灵"start_num = utf8.offset (str , 2)dialog(start_num, time)
注意事项:
- 返回字符位置按字节数计算。
- n 为负数则取在位置 i 前的字符。 当 n 是非负数时,默认的 i 是 1, 否则默认为字符串的长度加一。
- 如果处理到一个不合法的字节序列,将抛出一个错误。
| 参数 | 类型 | 说明 |
|---|---|---|
| string | string | 将输入的文本以及控制字符 |
脚本实例:
输入欢迎文本并发送
touchDown(150,150); --点击输入框获取焦点(假设输入框坐标已知)mSleep(30)touchUp(150,150);mSleep(1000); --延迟 1 秒以便获取焦点,注意某些应用不获取焦点无法输入for var = 1,15 do--删除输入框中的文字(假设输入框中已存在文字)inputText("\b")--iOS 设备连续输入建议加下延时时间,否则可能因为速度太快导致输入错误mSleep(20)endinputText("Welcome.#ENTER#"; --在输入框中输入字符串 "Welcome." 并回车;此函数在某些应用中无效,如支付宝、密码输入框等位置,甚至可能会导致目标应用闪退
注意事项:
- 使用该函数前,必须先点击输入框获取焦点(指使当前的输入光标停留在某一输入框中)
- 控制字符包括 \b、\n、\r、#ENTER#,如果设备系统版本为 iOS 7,\r无法使用,使用\b需安装引擎版本 iOS v1.6.9 及以上
- 仅在 iOS 7 上可使用"#ENTER#"作为回车,相当于点击虚拟键盘上的 "Done"
- 需要注意的是,并不是所有输入框都可以使用此功能,如支付宝、密码输入框等位置,甚至可能会导致目标应用闪退
- iOS 系统该函数不支持第三方输入法(指百度输入法、搜狗输入法等),请切换到系统内置输入法
- 安卓系统在使用该函数时,将自动切换至触动精灵输入法,部分机型没有成功安装触动输入法时,请手动安装百度输入法可正常使用
- 模拟器不能输入的话,需要修改设置,修改教程:http://bbs.touchsprite.com/thread-5203-1-1.html
- 对于弹出的窗口,需要先初始化再使用该函数,例如 App Store登录窗口(该窗口Bundle ID 为"com.apple.springboard")
- iOS 设备连续输入建议加下延时时间,否则可能因为速度太快导致输入错误
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 保持开关 |
脚本实例:
-- 需要多次输入的登录模块function login(...)switchTSInputMethod(true); -- 切换到触动/帮你玩输入法-- 点击输入框获取焦点touchDown(x, y)mSleep(30)touchUp(x, y)inputText("username")-- 点击输入框获取焦点touchDown(x, y)mSleep(30)touchUp(x, y)inputText("password")switchTSInputMethod(false); -- 切换到之前的输入法end-- 不需要inputText输入的其他逻辑模块function main(...)login()endmain()
注意事项:
- 点击输入框之前调用
switchTSInputMethod(true),结束调用inputText时调用switchTSInputMethod(false),这样不会导致用户手动输入失败或者inputText输入异常。- 先调动
switchTSInputMethod(true),才可以通过switchTSInputMethod(false)切换回之前的输入法,单纯调用switchTSInputMethod(false)没有效果。- 猩猩模拟器不支持切换输入法,不切换输入法也可以正常输入。
函数名称:获取当前输入法包名
函数方法 : getInPutMethod();
返回值:string bid
支持版本:触动精灵Android v1.3.0以上
| 返回值 | 类型 | 说明 |
|---|---|---|
| bid | string | 用于切换输入法的包名 |
脚本实例:
频繁输入字符的脚本
-- 脚本启动,获取输入法包名ipm = getInPutMethod()-- 切换到触动输入法os.execute("settings put secure default_input_method com.touchsprite.android/.core.TSInputMethod")-- 脚本主体-- 结束脚本前切换回之前的输入法os.execute("settings put secure default_input_method "..ipm)
注意事项:
- 触动输入法包名: "com.touchsprite.android/.core.TSInputMethod"
| 参数 | 类型 | 说明 |
|---|---|---|
| state | number | iOS 6 及其以下系统 0 - 按下;1 - 抬起;iOS 7只能填 0 |
脚本实例:
iOS 系统返回主屏幕
--iOS 6系统 和 iOS 7.1及以上系统pressHomeKey(0); --按下 Home 键pressHomeKey(1); --抬起 Home 键--iOS 7 系统pressHomeKey(0); --按下抬起 Home 键一次
Android 系统返回主屏幕
pressHomeKey(); --Android 系统不需要填参数,自动点击抬起
iOS 系统调出后台
pressHomeKey(0); --按一次 Home 键pressHomeKey(1);mSleep(30); --短暂延迟pressHomeKey(0); --再按一次,在 iOS 7 以上版本中使用双击功能可使用函数 doublePressHomeKeypressHomeKey(1);
3.调出 Siri (iPhone 4S 以上,iOS 6 及以下或触动版本高于v2.3.5)
pressHomeKey(0); --按下 Home 键mSleep(3000); --按住不放pressHomeKey(1); --抬起
注意事项:
- 在 iOS 6 系统上,状态标识为 0 时,调用该函数则开始按下 Home 键并按住不放,直到状态标识为 1 时重新调用该函数,抬起 Home 键。
- 在 iOS 7 系统上,状态标识填写 0,代表按一次 Home 键,即按下并立即抬起 Home 键的操作。
- 在 iOS 7.1及以上版本中和6系统一致,状态标识为 0 时,调用该函数则开始按下 Home 键并按住不放,直到状态标识为 1 时重新调用该函数,抬起 Home 键。
脚本实例:
1.双击HOME键打开后台
doublePressHomeKey(); --此函数仅能用于 iOS 7 或以上版本
注意事项:
- 此函数需触动精灵iOS V2.x 以上版本支持
- 此函数仅能用于 iOS 7 或以上版本
| 参数 | 类型 | 说明 |
|---|---|---|
| key | string | 模拟外接键盘的键盘码 |
脚本实例:
--以下为粘贴示例keyDown("RightGUI")keyDown("v")keyUp("v")keyUp("RightGUI")--以下为输入小写字母keyDown("t")keyUp("t")--以下为输入大写字母keyDown("CapsLock")keyDown("t")keyUp("t")keyUp("CapsLock")--以下为输入数字keyDown("1")keyUp("1")--以下为输入符号keyDown("LeftShift")keyDown("1")keyUp("1")keyUp("LeftShift")
- 更多键盘码请参看→按键码表
注意事项:
- 当 inputText 函数在某些输入框内无效时可尝试使用此函数输入字符。
- 推荐使用键名,不同的手机的键值不同会导致此函数无效。。
- 在安卓某些 HTML 页面,使用 inputText 函数输入无效,可尝试使用模拟物理按键。
具体参数见→约定的按键编码。
实例:
os.execute("input keyevent 键名")--按下 Home 键os.execute("input keyevent KEYCODE_HOME")--按下返回键os.execute("input keyevent KEYCODE_BACK")--按下回车键os.execute("input keyevent KEYCODE_ENTER")--按下菜单键os.execute("input keyevent KEYCODE_MENU")--按下音量加键os.execute("input keyevent KEYCODE_VOLUME_UP")--按下音量减键os.execute("input keyevent KEYCODE_VOLUME_DOWN")--输入10086os.execute("input text \"10086\"")--按拨号键打通os.execute("input keyevent KEYCODE_CALL")
| 参数 | 类型 | 说明 |
|---|---|---|
| bid | string | 应用程序的Bundle ID 或包名 |
| class | string | 安卓应用程序的类名(选填) |
| type | number | iOS 系统:可选关闭类型(选填),0 - 关闭应用进程;1 - 关闭后台应用 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| state | number | 0 应用启动成功;非 0 应用启动失败(7 应用不存在) |
脚本实例:
打开 iOS 内置天气应用,然后退出
r = runApp("com.apple.weather"); --启动天气应用mSleep(10 * 1000);if r == 0 thencloseApp("com.apple.weather"); --退出天气应用,使用此函数后在后台仍可看到应用程序图标属正常现象,实际进程已不在后台elsedialog("启动失败",3);end
关闭 iOS 所有后台应用
closeApp("*",1)--关闭所有后台应用(2.3.5以上版本有效)
注意事项:
- runApp函数需要系统响应时间较长,注意做好延迟或判断。
- iOS 系统使用 closeApp 函数后在后台仍可看到应用程序图标属正常现象,实际进程已不在后台。
- 参数 type 仅在引擎版本 iOS v2.3.5 以上版本有效(参数 type 为1时为模拟双击 Home 键,向上滑动退出应用的效果)。
- 关于 Bundle ID 和包名的获取方法,参见"初始化"一章。
- 安卓应用类名自行百度,游戏不可以通过类名直接启动指定页面,不是所有应用都可以通过此方法启动指定页面。
- 请注意,部分手机不支持通过类名跳转指定页面。
| 参数 | 类型 | 说明 |
|---|---|---|
| bid | string | 待检测的应用程序 Bundle ID 或包名 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | number | 0 - 不在前台运行;1 - 在前台运行 |
脚本实例:
监听应用状态
isfront = 1;while isfront == 1 do --如果应用处于前台则继续mSleep(3000); --此处放置代码块isfront = isFrontApp("com.tencent.mqq"); --更新前台状态end
注意事项:
- Bundle ID 的获取方法参见"初始化"一章。
| 返回值 | 类型 | 说明 |
|---|---|---|
| bid | string | 返回前台应用程序的Bundle ID或包名,若无应用处于前台,则返回空字符串 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| bid | string | 返回前台应用程序的包名,若无应用处于前台,则返回空字符串 |
| class | string | 返回前台应用程序的包名及类名 |
脚本实例:
iOS 系统获取前台应用bid
bid = frontAppBid();dialog(bid);--此方法同样适用于系统应用和越狱插件
Android 系统获取前台应用bid
bid,class = frontAppBid();dialog(bid.."\r\n"..class);--此方法同样适用于系统应用
检查指定应用是否开启
bid = frontAppBid();if bid ~= "com.apple.mobilesafari" thendialog("请打开 Safari 再运行该脚本!", 5);mSleep(3000);lua_exit();end
注意事项:
- Bundle ID 的获取方法参见"初始化"一章。
| 参数 | 类型 | 说明 |
|---|---|---|
| bid | string | 需要获取路径的应用程序的 Bundle ID 或包名 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| path | string | 目标应用程序的安装路径 |
脚本实例:
appPath = appBundlePath("com.baidu.map"); --获取"百度地图"安装路径dialog(appPath,0);
| 参数 | 类型 | 说明 |
|---|---|---|
| bid | string | 需要获取路径的应用程序的 Bundle ID |
| 返回值 | 类型 | 说明 |
|---|---|---|
| path | string | 目标应用程序的数据路径 |
脚本实例:
dataPath = appDataPath("com.baidu.map"); --获取"百度地图"数据路径if dataPath ~= "" then --如果获取到路径dialog(dataPath,0);end
注意事项:
- iOS 8 系统下,并非所有应用都有 data 目录,如返回值为空,说明该应用没有data 目录。
| 参数 | 类型 | 说明 |
|---|---|---|
| bid | string | 目标应用程序的Bundle ID 或包名 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | number | 0 - 目标应用未运行;1 - 目标应用运行中 |
脚本实例:
flag = appIsRunning("com.tencent.mqq"); --检测 QQ 是否在运行if flag == 0 then --如果没有运行runApp("com.tencent.mqq") --运行 QQend
注意事项:
- 此函数将判断目标应用的运行状态,目标应用前台运行或者后台运行返回值都为
1。
| 参数 | 类型 | 说明 |
|---|---|---|
| url | string | 需要打开的目标网址 |
脚本实例:
调用系统浏览器打开触动精灵官方论坛
openURL("http://www.touchsprite.com");
访问 iOS 系统功能页面
openURL("prefs:root=WIFI"); --打开 wifi 界面openURL("prefs:root=LOCATION_SERVICES"); --打开定位服务界面openURL("prefs:root=General&path=VPN"); --打开 VPN 界面
注意事项:
- 默认情况下调用的浏览器为系统默认浏览器。
- 欲打开的目标网址必须以 http:// 开头,一些特殊协议也是支持的,Android 系统如:
sms:,tel:,iOS 系统如:mailto://, sms://, tel://, ifile://, cydia:// 等等。
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | number | 0 - 失败;1 - 成功 |
| 参数 | 类型 | 说明 |
|---|---|---|
| path | string | 所要安装的ipa文件路径 |
| bid | string | 所要卸载的应用程序 Bundle ID |
注意事项:
- 此功能支持在 iOS6 以上版本的系统中使用
- ipaUninstall 函数执行成功后将删除文件系统中的 ipa 文件
- 调用此函数前需确保在目标设备中已安装过 AppSync 插件
返回值:number flag
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | number | 0 - 失败;1 - 成功 |
| 参数 | 类型 | 说明 |
|---|---|---|
| path | string | 所要安装的ipa文件路径 |
| bid | string | 所要卸载的应用程序的应用包名 |
注意事项:
- 等同于 iOS 的ipaInstall、ipaUninstall函数
| 返回值 | 类型 | 说明 |
|---|---|---|
| list | table | 已安装应用的 Bundle ID 或包名列表 |
脚本实例:
bidList = getInstalledApps();for k,v in pairs(bidList) dodialog(v)end
返回的 table 为以下形式:
table = {"com.touchsprite.android","com.netease.ddyx.netease",...}
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | number | 0 - 未安装;1 - 已安装 |
| 参数 | 类型 | 说明 |
|---|---|---|
| bid | string | 应用程序的包名 |
脚本实例:
cleanApp("com.tencent.mobileqq")--清理QQ数据,cleanApp 函数是调用系统方法,清理之后操作不可逆,请谨慎调用
注意事项:
cleanApp 函数是调用系统方法,清理之后操作不可逆,请谨慎调用。
| 参数 | 类型 | 选/必填 | 说明 |
|---|---|---|---|
| bid | string | 必填 | 包名,可以使用 frontAppBid 或者 getInstalledApps 函数获取 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 成功返回 true 失败返回 false |
| msg | string | 成功返回 "",失败返回失败原因 |
函数用例:
flag,msg = switchApp("com.touchsprite.android")if flag thendialog("切换成功")elsedialog(msg)end
| 参数 | 类型 | 选/必填 | 说明 |
|---|---|---|---|
| bid | string | 选填 | 包名,不写或写空字符串 "" 表示关闭当前运行脚本的触动产品以外的所有应用(非当前运行脚本的触动/帮你玩/企业版/小精灵也会被关闭),写入包名则关闭除当前运行脚本的触动产品和所填包名应用以外的所有应用,多个应用包名用逗号隔开即可,如"com.aaa.aaa,com.bbb.bbb" |
函数用例:
closeAllApp("com.touchsprite.android")
注意事项
- 部分应用会出现无法清理成功或者清理成功后自动重启的情况。
- 清理成功后在后台仍可看到应用程序图标属正常现象,实际进程已不在后台。
- 为保证手机系统可以正常使用,已过滤系统应用。
| 参数 | 类型 | 选/必填 | 说明 |
|---|---|---|---|
| bid | string | 必填 | 包名,可以使用 frontAppBid 或者 getInstalledApps 函数获取 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| tab | table | 应用信息 |
函数用例:
tab = getAppInfo("com.touchsprite.android")local info = "设备信息:\n"for k, v in pairs(tab) doif type(v) == "table" theninfo = info .. "\n" .. k .. " : " .. table.concat(tab[k],"\n") .."\n\n"elseinfo = info .. k .. " : " .. v .."\n"endenddialog(info)--[[应用信息:versionName --版本号sourceDir --应用 apk 安装路径firstInstallTime --应用安装时间nativeLibraryDir --应用 lib 路径uid --应用 uidlastUpdateTime --应用更新时间dataDir --应用数据路径enabled --应用是否启用versionCode --版本编译数值appName --应用名称signature --签名activitys --应用 Activitys]]
| 返回值 | 类型 | 说明 |
|---|---|---|
| type | number | 设备类型 0 - iPod Touch;1 - iPhone;2 - iPad;3 - 安卓真机;4 - 安卓模拟器 |
| name | string | 设备类型为模拟器时返回具体模拟器名称,非模拟器时没有该参数。 |
| 模拟器名称 | 返回值 |
|---|---|
| 逍遥模拟器 | 逍遥 |
| 海马玩模拟器 | Droid4X |
| 夜神模拟器 | nox |
| 猩猩模拟器 | x86 |
| 猩猩模拟器畅玩版 | klte |
| 天天模拟器 | ttVM_Hdragon |
脚本实例:
根据分辨率判断设备类型
types = getDeviceType();if types == 0 thendialog("当前设备为 iPod Touch")elseif types == 1 thendialog("当前设备为 iPhone")elseif types == 2 thendialog("当前设备为 iPad")elseif types == 3 thendialog("当前设备为安卓真机")elseif types == 4 thendialog("当前设备为安卓模拟器"..name,5)end
| 返回值 | 类型 | 说明 |
|---|---|---|
| id | string | 触动精灵32位设备号 |
脚本实例:
获取设备号并输出到日志
id = getDeviceID(); --帮你玩禁用此函数toast("Device ID: "..id);
注意事项:
- 该函数返回的并非 udid 或系统设备号,而是触动精灵内部设备号,可用来鉴定设备唯一性。
- 帮你玩开发者平台禁用此函数。
| 返回值 | 类型 | 说明 |
|---|---|---|
| str.self | number | 触动服务内存(仅支持 iOS) |
| str.free | number | 系统空闲内存 |
| str.total | number | 系统总内存 |
脚本实例:
str = getMemoryInfo()dialog("触动服务占用内存 : "..str.self.."MB;剩余 : "..str.free.."MB;总内存 : "..str.total.."MB", 0)--触动服务内存返回值仅支持 iOS 系统
| 返回值 | 类型 | 说明 |
|---|---|---|
| version | string | 返回的触动精灵引擎版本号或系统版本号如:1.8.5、2.0.6 |
脚本实例:
1.判断版本是否符合要求
tsver = getTSVer(); --获取触动精灵引擎版本tsint = tonumber(string.sub(tsver, 1, 1)..string.sub(tsver, 3,3)..string.sub(tsver, 5,5));--转化为数字版本号sysver = getOSVer(); --获取系统版本sysint = tonumber(string.sub(sysver, 1, 1)..string.sub(sysver, 3,3)..string.sub(sysver, 5, 5));--转化为数字版本号if tsint >= 170 and sysint >= 701 theninit(0);elsedialog("本脚本不支持您的触动精灵引擎版本或系统版本,请尽快升级!", 5);lua_exit();end
名词解析:
- string.sub 为Lua基本函数,属于字符串处理函数库,详情请参阅相关文档。
- tonumber 为 Lua 基本函数,属于类型转换函数库,详情请参阅官方文档。
注意事项:
此函数适用于触动精灵、企业版和帮你玩脚本商城、小精灵客户端,在不同的客户端下运行获取的都是触动引擎版本号而不是客户端版本号。
| 返回值 | 类型 | 说明 |
|---|---|---|
| os_type | string | 返回设备的系统类型 iOS、android |
脚本实例:
判断系统是否符合要求
os_type = getOSType(); --获取设备系统版本if os_type == "android" then --返回值为纯小写字母dialog("欢迎使用触动精灵安卓版")elsedialog("欢迎使用触动精灵 iOS 版")end
注意事项:
- 返回值为纯小写字母
方法名称:获取触动账号 ID(仅支持触动精灵 Android v2.3.6 以上版本)
方法功能:获取触动账号 ID
调用方法
ID = getTSAccountID()
| 返回值 | 类型 | 说明 |
|---|---|---|
| ID | string | 未登录账号使用此函数返回为空,登录账号后会返回触动账号 ID |
脚本实例:
ID = getTSAccountID()dialog(ID)
| 返回值 | 类型 | 说明 |
|---|---|---|
| retTable.charging | number | 0 - 未充电;1 - 充电状态 |
| retTable.level | number | 当前设备剩余电量,范围:0 - 100 |
脚本实例:
t = batteryStatus();if t.charging == 1 thendialog("正在充电", time)elsedialog("未充电", time)endmSleep(1000)dialog("剩余电量"..t.level.."%")
注意事项:
- 此函数在安卓模拟器上显示充电状态为电量100。
| 返回值 | 类型 | 说明 |
|---|---|---|
| idList[n].id | number | 进程ID |
| idList[n].name | string | 进程名称 |
脚本实例:
str = getProcess()text = "设备进程列表 总数 : " .. #str .. "\r\n"for _,v in ipairs(str) dotext = text .. v.id.." : "..v.name .. "\r\n"enddialog(text)
| 返回值 | 类型 | 说明 |
|---|---|---|
| ret | string | 当前安装过触动精灵企业版的设备别名 |
注意事项:
- 此函数仅适用于触动精灵企业版。
| 返回值 | 类型 | 说明 |
|---|---|---|
| name | string | 获取到的设备名 |
| 参数 | 类型 | 说明 |
|---|---|---|
| name | string | 要设置的设备名 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| imei | string | 返回设备 IMEI,设备是模拟器时返回 nil |
脚本实例:
local imei = getIMEI();if imei == nil and imei == 000000000000000 thendialog("该设备是模拟器或获取 IMEI 失败");elsedialog(imei);end
| 返回值 | 类型 | 说明 |
|---|---|---|
| ip | string | 返回设备网络 IP,不打开 WiFi 会显示异常,暂不支持模拟器。 |
脚本实例:
-- 不打开 WiFi 会显示异常,暂不支持模拟器ip = getNetworkIP();dialog(ip);
| 返回值 | 类型 | 说明 |
|---|---|---|
| brand | string | 返回设备品牌 |
脚本实例:
brand = getDeviceBrand()dialog(brand);
| 返回值 | 类型 | 说明 |
|---|---|---|
| deviceModel | string | 返回设备型号 |
脚本实例:
model = getDeviceModel()dialog(model);
| 返回值 | 类型 | 说明 |
|---|---|---|
| cpu | string | 返回设备 CPU 型号 |
脚本实例:
cpu = getCPUType()dialog(cpu);
| 返回值 | 类型 | 说明 |
|---|---|---|
| uuid | string | 返回设备 UUID |
脚本实例:
uuid = getUUID()dialog(uuid);
| 返回值 | 类型 | 说明 |
|---|---|---|
| sdPath | string | 返回设备 SD 卡路径,无 SD 卡时返回 nil |
脚本实例:
local sdPath = getSDCardPath();if sdPath == nil thendialog("该设备没有 SD 卡");elsedialog(sdPath);end
| 返回值 | 类型 | 说明 |
|---|---|---|
| dpi | number | 屏幕密度(每寸像素:120/160/240/320) |
| density | number | 屏幕密度(像素比例:0.75/1.0/1.5/2.0) |
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开方向锁定 - true;关闭方向锁定 - false |
脚本实例:
setRotationLockEnable(true); --打开方向锁定setRotationLockEnable(false); --关闭方向锁定
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开 WiFi - true;关闭 WiFi - false |
脚本实例:
setWifiEnable(true); --打开 WifisetWifiEnable(false); --关闭 Wifi
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开蓝牙 - true;关闭蓝牙 - false |
脚本实例:
setBTEnable(true); --打开蓝牙setBTEnable(false); --关闭蓝牙
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开飞行模式 - true;关闭飞行模式 - false |
脚本实例:
setAirplaneMode(true); --打开飞行模式setAirplaneMode(false); --关闭飞行模式
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag.active | boolean | true - 打开;false - 关闭 |
| flag.status | string | 连接状态本地化字符串,不同语言下字符串不同(仅支持 iOS) |
脚本实例:
flag = getVPNStatus()if flag.active thendialog("打开状态"..flag.status)--flag.status 仅支持 iOS 系统elsedialog("关闭状态"..flag.status)--flag.status 仅支持 iOS 系统end
注意事项:
- 如系统中没有已经建立好 的VPN 连接,调用此函数将不会产生任何效果。
- 安卓没有 flag.status 字段。
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开VPN默认连接 - true;关闭VPN默认连接 - false |
注意事项:
- 如系统中没有已经建立好的 VPN 连接,调用此函数将不会产生任何效果。
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开蜂窝网络 - true;关闭蜂窝网络 - false |
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开小圆点 - true;关闭小圆点 - false |
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | 打开减弱动画效果 - true;关闭减弱动画效果 - false |
注意事项:
打开此开关对找色影响很大,请谨慎使用。
| 返回值 | 类型 | 说明 |
|---|---|---|
| light | number | 获取到的屏幕亮度值,范围 0 - 1 |
| 参数 | 类型 | 说明 |
|---|---|---|
| light | 数值型 | 要设置的屏幕亮度值,范围 0 - 1 |
| 参数 | 类型 | 说明 |
|---|---|---|
| vol | number | 要设置的设备音量,范围 0 - 1 |
注意事项:
- 此函数将同步改变系统中所有音量。
函数实例:
警报
for var = 1,5 dovibrator(); --振动mSleep(1000); --延迟 1 秒end
注意事项:
- 频繁调用该函数可能会减少电池寿命,请谨慎使用。
- 使用此函数需在系统设置里打开震动选项。
| 参数 | 类型 | 说明 |
|---|---|---|
| filename | string | 音频文件名,支持 mp3、m4a、m4r、ogg、wav,iOS填写“”停止播放 |
脚本实例:
playAudio("test.mp3"); --播放 test.mp3mSleep(10000)playAudio(""); --iOS停止播放,Android参考stopAudio函数。
注意事项:
- 音频文件路径请用
userPath函数获取,自建目录请填写相对路径。- 如音频放置在默认资源目录,参数中可直接填写文件名。
脚本实例:
playAudio("test.mp3"); --播放 test.mp3mSleep(10000)stopAudio(); --停止播放
注意事项:
- 音频文件路径请用
userPath函数获取,自建目录请填写相对路径。- 如音频放置在默认资源目录,参数中可直接填写文件名。
- 脚本终止将直接导致音频播放终止,如音频文件较长,可使用
stopAudio终止播放。
脚本实例:
结束并锁定设备
lockDevice();lua_exit();
注意事项:
- 无人值守的情况下,使用该函数可减少电池消耗。
| 返回值 | 类型 | 说明 |
|---|---|---|
| flag | number | 0 - 表示设备未锁定;非0 - 表示设备已锁定 |
脚本实例:
判断设备是否锁定
flag = deviceIsLock(); --如果要在设备自启动时解锁屏幕直接使用 unlockDevice 函数即可if flag == 0 thendialog("未锁定",3);elseunlockDevice(); --解锁屏幕end
注意事项:
- unlockDevice 函数功能是解除当前设备屏幕锁定状态,具体使用方法参照对应章节。
- 以上实例配合定时启动脚本效果显著,需要注意的是,由于此函数无法在设备启动过程中正确判断,如果使用开机自启动功能时请勿直接复制此段代码,如果要在设备自启动时解锁屏幕直接使用 unlockDevice 函数即可。
- 安卓模拟器上此函数可能显示异常。
| 参数 | 类型 | 说明 |
|---|---|---|
| password | string | 解锁密码,支持4位数字密码,多位数字密码和混合密码,仅支持 iOS v2.4.4 及以上版本 |
脚本实例:
解锁设备
flag = deviceIsLock(); --判断屏幕是否锁定if flag == 0 thendialog("未锁定",3);elseunlockDevice(); --解锁屏幕end--开机自启动请勿使用此段代码,直接使用 unlockDevice 函数即可
注意事项:
- 如您的设备设备了锁屏密码,则此函数仅能唤醒屏幕。
- 以上实例配合定时启动脚本效果显著,需要注意的是,由于此函数无法在设备启动过程中正确判断,如果使用开机自启动功能时请勿直接复制此段代码,如果要在设备自启动时解锁屏幕直接使用 unlockDevice 函数即可。
- 此函数仅支持 iOS7 以上系统。
- iOS 10 及以上系统设备激活屏幕后需要按一下home键可解锁。
- 密码解锁功能仅支持iOS版触动 v2.4.4 及以上版本
| 参数 | 类型 | 说明 |
|---|---|---|
| tim | number | iOS 系统:0到5,0是代表永不锁屏,1~5位锁屏时间,单位为分;安卓系统:单位为毫秒,设置为参数的最小近似值,具体情况根据手机不同结果不同。 |
脚本实例:
安卓设置锁屏时间
-- 设置无操作一分钟后锁屏setAutoLockTime(60*1000)-- 例如-- A手机系统选项是 1分钟 2分钟 10分钟 30分钟-- B手机系统选项是 1分钟 2分钟 3分钟 5分钟 10分钟 30分钟-- 那么如果设置90*1000(1.5分钟), 则A,B手机都是1分钟后自动锁屏-- 如果设置240*1000(4分钟), 则A手机是2分钟后自动锁屏,B手机是3分钟后自动锁屏
函数实例:
保持屏幕常亮
while true domSleep(30 * 1000); --等待 30 秒resetIDLETimer(); --重置锁屏计时end
注意事项:
- 该函数可能会减少屏幕、电池寿命,请谨慎使用。
- while true do ... end为死循环代码,一般不建议这样使用。除非强行终止运行,否则该脚本不会自动停止。
| 参数 | 类型 | 说明 |
|---|---|---|
| size | string | "640x960" "750x1334" "640x1136" "1125x2001" "1242x2208" "768x1024" "1536x2048" "default" |
脚本实例:
setScreenResolution("640x960") --将当前设备分辨率更改为 640*960,开发者平台禁用此函数mSleep(10000)setScreenResolution("default") --恢复当前设备默认分辨率
注意事项:
- 每次打开触动精灵客户端将会自动恢复当前设备的默认分辨率(可在更多中关闭此功能)。
- 开发者可合理利用此函数进行单设备多分辨率脚本适配开发,使用此函数修改分辨率后在实际应用中运行脚本可能会存在点击坐标偏差。
- 执行完此函数需要一些时间生效,如在脚本中使用,请在调用此函数后加入适当的延迟。
- 双击电源键可强制恢复默认分辨率(在脚本运行中或者录制过程中不可用)。
- 此函数仅支持 iOS8 以上设备
Retina屏幕的设备(如:iPad2、iPad Mini)。- 需要注意的是,如果您的设备是 iPhone6,在系统中将显示模式调整为放大,当前分辨率即为
640x1136,无需再次使用此函数调整分辨率为640x1136。- 不推荐将分辨率改为比本身设备默认更高的分辨率,可能会出现无法恢复默认分辨率的问题。
- 在iOS9以上版本中请勿使用此函数,会造成一些不可预料的结果。
- 如您的设备有锁屏密码,请勿使用此函数更改分辨率,会造成无法解锁设备的问题。
- 开发者平台禁用此函数。
警告
此函数不推荐写在脚本中给普通用户使用,推荐仅用于开发者进行多分辨率适配截图使用,如要在脚本中使用请用弹窗提醒用户,如因操作不当造成分辨率无法恢复、无法输入解锁密码等后果由用户自己承担。
| 参数 | 类型 | 说明 |
|---|---|---|
| bid | string | 需要清除的应用程序的 Bundle ID |
脚本实例:
清除前台应用的钥匙串
clearKeyChain(frontAppBid());
注意事项:
- 钥匙串一经清除,不可恢复,请妥善保管您的隐私信息。
名词解析:
- 钥匙串,是iOS提供给应用程序,允许自动记住密码以及重要信息的安全存储数据库,钥匙串一旦清除,该应用中记住的密码等机密信息全部清空。
| 参数 | 类型 | 说明 |
|---|---|---|
| path | string | 需要写入系统相册的图片路径,支持绝对路径 |
脚本实例:
saveImageToAlbum(userPath().."/lua/1.png");saveImageToAlbum("2.png");
注意事项:
- 图片的格式支持 bmp, jpg, png。
- 如不填写绝对路径时,将默认为文件系统
res目录下的文件。- 当脚本要上传到帮你玩、企业版和小精灵平台时,请使用 userPath 函数自动获取路径。
| 参数 | 类型 | 说明 |
|---|---|---|
| path | string | 需要写入系统相册的视频路径,支持绝对路径 |
脚本实例:
saveVideoToAlbum(userPath().."/lua/1.mp4");saveVideoToAlbum("2.mp4");
注意事项:
- 视频的格式支持 mp4, avi, mov。
- 如不填写绝对路径时,将默认为文件系统
res目录下的文件。- 当脚本要上传到帮你玩、企业版和小精灵平台时,请使用 userPath 函数自动获取路径。
- 如此函数不生效,可以尝试使用下面的方法写入视频
- 安卓系统设备可以使用命令将视频存入相册
- 更详细的说明请看→这里
示例1
path = userPath().."/res/1.mp4"os.execute("am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://"..path)
| 返回值、参数 | 类型 | 说明 |
|---|---|---|
| string | string | 写入或读出的剪贴板字符串 |
| type | number | 当 type 为 1 时,string参数为一个图片路径(仅支持引擎版本 iOS v2.3.6以上) |
脚本实例:
从剪贴板中写出到编辑框
string = readPasteboard(); --读出剪贴板内容mSleep(500); --延迟 0.5 秒inputText(string); --写出字符串
从文件中读入一行并储存到剪贴板
file = io.open(userPath().."/res/test.txt" ,"r"); --以只读方式打开文件if file then --如果打开成功writePasteboard(file:read()); --储存到剪贴板elsetoast("Cannot open: test.txt",0);endfile:close(); --关闭文件
iOS 系统:粘贴图片
writePasteboard("1.png",1)keyDown("RightGUI")keyDown("v")keyUp("v")keyUp("RightGUI")
注意事项:
- 该函数将覆盖系统剪贴板,如有重要数据储存在剪贴板请及时备份。
- 参数 type 仅支持引擎版本 iOS v2.3.6 以上。
- 当脚本要上传到帮你玩、企业版和小精灵平台时,请使用 userPath 函数自动获取路径。
| 参数 | 类型 | 说明 |
|---|---|---|
| wifiname | string | 必填,WiFi 名称 |
| password | string | 必填,WiFi 密码 |
| type | number | 必填,WiFi 加密类型:0 - 无密码,1 - WEP,2 - WPA,3 - WPA2,4 - WPA 企业版,5 - WPA2 企业版,Android 仅支持 0 - 3 |
脚本实例:
connectToWifi("wifiname","password",1)
脚本实例:
以下实例,当用户在脚本运行过程中按音量键停止脚本,将会触发 beforeUserExit 函数并执行函数体内的语句
function beforeUserExit()dialog("OK",0)endfor var = 1,30 domSleep(1000)toast(var)end
注意事项:
- 函数名必须为
beforeUserExit才能够被识别,请勿在函数体中使用死循环,否则会造成脚本无法终止或其他不可预料的问题。- 此函数可以被
lua_exit()、音量键停止、远程接口停止触发。- iOS 设备上此函数必须在获取触动精灵授权后方可生效。
| 参数 | 类型 | 说明 |
|---|---|---|
| x1, y1 | number | 欲识别的区域左上角顶点屏幕坐标 |
| x2, y2 | number | 欲识别的区域右下角顶点屏幕坐标 |
| language | number | 语言选择: 0 - 英文/数字; 1 - 中文 (特殊参数请看注意事项) |
| list | string | 识别白名单,设置此参数后,不在白名单中的字符将被忽略 |
| flag | boolean | 选填,不填或者 flag=false 识别结果,flag=true 返回坐标,支持引擎 iOS 3.0.0-126 及 Android 以上版本 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| text | string | 识别结果 |
| array | table | 坐标 |
返回值为 string 脚本实例:
-- 引擎版本 Android v1.3.0 之前的版本 language 参数 10 或 20 是英文识别, 非 10 或 20 是中文识别;-- Android v2.0 以上版本仅支持 0,1 2个参数,0 = 英文/数字,1 = 中文。-- OCR 英文识别,注意本函数仅对标准字体识别尚可,非标准字体请自行制作字库配合触动点阵识别函数效果更佳recognize = ocrText(20, 120, 200, 140, 0);mSleep(1000);dialog("识别出的字符:"..recognize, 0);
whitelist = "0123456789-"a = ocrText(92, 1390, 472, 1464, 10, whitelist, 1)dialog(a)
返回 table 坐标脚本实例:
-- 创建一个全分辨率通用的浮动框 用来测试 ocrTextfwShowWnd("wid",0,0,300,300,1)fwShowTextView("wid","textid","abcd1234","center","ffffff","000000",20,0,0,0,300,300,1)mSleep(1000)-- 识别区域x,y,x1,y1 = 0, 100, 300, 300table = ocrText(x,y,x1,y1, 0,true)-- 识别结果text = "识别字符:"..table.text.."\ninfo长度:" .. #table.infofor var= 1, #table.info dotext = text .. "\ninfo[" .. var .. "] x:" ..table.info[var].x+x .." y:"..table.info[var].y+y .." w:"..table.info[var].w+table.info[var].x+x .." h:"..table.info[var].h+table.info[var].y+y .." c:"..table.info[var].c .." char:"..table.info[var].charenddialog(text)
返回 table 坐标:
-- text 表示识别的字符串;-- info 包含一个每个识别符号的信息;-- x 代表相对识别完整图片的位置的左上角 x 坐标;-- y 代表相对识别完整图片的位置的左上角 y 坐标;-- w 代表识别符号的宽度;-- h 代表识别符号的高度;-- c 代表相似度;{text = "ocr文字"info ={{ x = 0, y= 1, w=5, h=10, c = "90.01", char="字符" }….}}
注意事项:
- 引擎版本 Android v1.3.0 之前的版本 language 参数为 10 或 20 时是英文识别,非 10 或 20 是中文识别
- 如果英文普通识别不了,可以尝试如下参数(不推荐使用):
0 - 普通识别 灰度二值化
10 - 普通识别 适用于部分存在干扰线背景的文字识别
20 - 适用于部分存在干扰线且深色背景的文字识别
21 - 适用于部分深色背景的文字识别- Android v2.0 以上版本仅支持 0 和1 两个参数,0 = 英文/数字,1 = 中文。
- 引擎版本 iOS v2.2.7-3,Android v1.3.0 以上中已集成英文字库,直接调用即可。
- 白名单参数需引擎版本 iOS v2.2.7-3,Android v1.3.0 以上支持。
- OCR 中文识别库下载地址:chi_sim.traineddata
OCR 英文数字识别库下载地址:eng.traineddata- 如需使用中文字库,iOS 系统请将中文字库文件移至手机目录
/Applications/TouchSprite.app/tessdata,同时支持在 res 目录下 tessdata目录中放置字库文件,但程序会先搜索/Applications/TouchSprite.app/tessdata中的文件,再到 res 目录下搜索,Android 系统移至/sdcard/TouchSprite/res/tessdata方可正常使用。- 该函数对非正规字体及有干扰的情况下识别效果不佳,推荐用来识别背景色相对单一的英文及数字。
| 参数 | 类型 | 说明 |
|---|---|---|
| dict | string | 字库名,如:dict.txt 由触动精灵点阵字库工具生成,需放置于触动精灵 res 目录 |
| index | number | 字库标识,由 addTSOcrDict 函数返回值生成 |
| x1, y1 | number | 欲识别的区域左上角顶点屏幕坐标 |
| x2, y2 | number | 欲识别的区域右下角顶点屏幕坐标 |
| c0, c1 | string | 偏色范围,由触动精灵点阵字库工具中获取,需要与制作字库时所设值保持一致,多组偏色用#分割 |
| alpha | number | 精确度,范围 0 - 100 |
| str | string | 想要查找的字符串 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| index | number | 字库标识,由 addTSOcrDict 函数返回值生成,tsOcrText 第一个参数需要用到此值 |
| ret | string | 返回的识别结果 |
| x, y | number | 找到的字符串坐标(字符串左上角点),如未找到则返回 -1,-1 |
脚本实例:
1. 识别屏幕指定区域内的文字
--相同字库只需要加载一次,重复加载会导致内存溢出index = addTSOcrDict("dict.txt")ret = tsOcrText(index,962,19,1068,54,"FFFFFF,000000",90)toast(ret)
--相同字库只需要加载一次,重复加载会导致内存溢出index = addTSOcrDict("dict.txt")--在屏幕上找"弓"字的坐标x, y = tsFindText(index,"弓",35, 226, 385, 264,"fffbff,737573#FFFFFF,000000",90) --两组偏色toast(x..","..y)
local tab = {"00ffffe03ffffff1fffffff3ffffffefffffffffffe03fdfff001f9e7e001f00fc003e01f800fc01f001f803e003e0078007c00f000f0000000c00000000001fff001fffffe1ffffffe7ffffffefffffffffffffffffff003ffffe003f78fc003e01f8007c03f000f807c001f00f8003e01f0007c03e000f007c003e007000380000006@00$比$547$34$31"}--加载文字点阵字库,相同字库只需要加载一次,重复加载会导致内存溢出local indext = addTSOcrDictEx(tab)local ret = tsOcrText(indext, 0, 0, 640, 1136, "D9762D , 050901", 90)
注意事项:
- 触动精灵字库工具下载地址和使用手册:https://www.zybuluo.com/miniknife/note/629179
- 本函数为打码点阵识别加强版,突破大漠工具最高识别 11 行像素的限制,更适合高分辨率的移动端脚本开发。
- 相同字库只需要加载一次,重复加载会导致内存溢出
| 参数 | 类型 | 说明 |
|---|---|---|
| dict | string | 字库名,如:dict.txt 由大漠工具生成,需放置于触动精灵 res 目录 |
| index | number | 字库标识,由 addDmOcrDict 函数返回值生成 |
| x1, y1 | number | 欲识别的区域左上角顶点屏幕坐标 |
| x2, y2 | number | 欲识别的区域右下角顶点屏幕坐标 |
| c0, c1 | string | 偏色范围,由大漠工具中获取,需要与制作字库时所设值保持一致,多组偏色用#分割 |
| alpha | number | 精确度,范围 0 - 100 |
| str | string | 想要查找的字符串 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| index | number | 字库标识,由 addDmOcrDict 函数返回值生成,dmOcrText 第一个参数需要用到此值 |
| ret | string | 返回的识别结果 |
| x, y | number | 找到的字符串坐标(字符串左上角点),如未找到则返回 -1,-1 |
脚本实例:
--由于大漠工具的 11 行像素限制,对于较大文字识别效率不高,推荐使用触动字库工具配合触动文字识别函数使用效果更佳--相同字库只需要加载一次,重复加载会导致内存溢出index = addDmOcrDict("dict.txt")ret = dmOcrText(index,962,19,1068,54,"FFFFFF,000000",90)toast(ret)
--相同字库只需要加载一次,重复加载会导致内存溢出index = addDmOcrDict("dict.txt")--在屏幕上找"弓"字的坐标x, y = dmFindText(index,"弓",35, 226, 385, 264,"fffbff,737573#FFFFFF,000000",90) --两组偏色toast(x..","..y)
注意事项:
- 该函数完全兼容大漠字库格式,字库由大漠工具生成,由于大漠工具的 11 行像素限制,对于较大文字识别效率不高;
- 字库文件必须放置于触动精灵的
res目录,加载字库时无需填写绝对路径;- 生成的字库文件格式必须为 UTF-8 格式,字库首尾不能包含空行、空格等;
- 使用 dmFindText 函数需引擎版本 iOS v2.2.4,Android v1.2.8 以上支持;
- 触动精灵 iOS V2.2.7-3 以上客户端方可使用 addDmOcrDictEx 函数加载 table 格式字库。
- 大漠工具下载地址:http://pan.baidu.com/s/1nvybZG9;偏色计算器下载地址:https://pan.baidu.com/s/17AXHso-nBNkBGcW-W0fpCg 密码:qi8o
- 大漠点阵字库制作使用教程:https://www.zybuluo.com/lisaisacat/note/324664#大漠点阵字库制作和应用
- 相同字库只需要加载一次,重复加载会导致内存溢出
| 返回值 | 类型 | 说明 |
|---|---|---|
| auth | number | 0 - 当前设备未授权,有单次30分钟的运行限制;1 - 当前设备已授权,无任何限制 |
脚本实例:
auth = deviceIsAuth(); --帮你玩平台禁用此函数if auth ~= 0 thendialog("您的触动精灵客户端已授权",0)end
注意事项:
帮你玩开平台禁用此函数
| 返回值 | 类型 | 说明 |
|---|---|---|
| ret | number | 0表示没有相同设备号设备在运行,1表示有其他相同设备号设备在运行,-1表示频繁请求,-2表示不是tsp脚本,-3表示获取权限失败。 |
脚本实例:
local t1 = os.time()function MyGetRunningAccess(...)t2 = os.time()-- 每五分钟判断一次if t2 - t1 >= 5*60 thent1 = os.time()-- 如果返回值为1 则有相同设备号脚本在运行 停止当前脚本if getRunningAccess() == 1 thenlua_exit()endendendwhile (true) doMyGetRunningAccess()end
注意事项
- 5分钟内只允许判断一次,不要频繁调用影响效率
- 可以直接复制脚本示例代码使用。
| 返回值 | 类型 | 说明 |
|---|---|---|
| path | string | 获取触动精灵、帮你玩脚本商城、企业版、小精灵客户端的用户路径 |
脚本实例:
path = userPath();path = path.."/script/gameCFG.txt" --设置一个在帮你玩客户端中可保存的文件路径
注意事项:
- 由于在帮你玩脚本商城中每个用户都有独立目录,故提供此函数来获取当前用户的文件目录路径,如果你的脚本需要保存/读取一些信息,请先用此函数获取路径并保存在变量中。
- 触动精灵、帮你玩、小精灵的插件目录、日志目录、资源目录都将生成在此路径下,分别对应 plugin、log、res ,如需在脚本中使用以上目录,请在获取到的字符串后自行拼接。
- 帮你玩脚本商城脚本目录为 /script,其他客户端的脚本目录为 /lua.
| 返回值 | 类型 | 说明 |
|---|---|---|
| ret | number | 0 - 触动精灵;1 - 帮你玩;2 - 企业版;3 - 小精灵 |
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | boolean | true - 显示悬浮按钮,false - 隐藏悬浮按钮 |
以下方法可以强制重启触动服务,不推荐频繁调用。
--重启触动服务function reservice()--帮你玩平台禁用此函数os.exit();end
本类下所有函数都需要引擎版本 iOS v2.3.9,Android v2.3.4 以上支持。
| 参数 | 类型 | 说明 |
|---|---|---|
| task | funtion | 将该函数加入队列 |
| back | table | 选填,错误回调,当执行任务时发生错误异常,则会回调这个函数并不再抛出 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| tid | number | 协程id,id 可用于结束或是等待一个任务 |
函数实例:
local thread = require('thread')--处理协程的错误local thread_id = thread.create(function()mSleep(1000)--故意制造的错误--a()--抛出异常thread.throw("协程抛出异常")return 100end,{callBack = function()--协程结束会调用,不论是错误、异常、正常结束dialog("协程结束了", 0)end,errorBack = function(err)--协程错误结束,一般是引用空调用,err是字符串dialog("协程错误了:"..err,0)end,catchBack = function(exp)--协程异常结束,异常是脚本调用了throw激发的,exp是table,exp.message是异常原因local ts = require('ts')local cjson = ts.jsondialog("协程异常了\n"..cjson.encode(exp),0)end})thread.waitAllThreadExit()--等待所有协程结束,只能用于主线程
| 参数 | 类型 | 说明 |
|---|---|---|
| task | funtion | 将该函数加入队列 |
| back | table | 选填,错误回调,当执行任务时发生错误异常,则会回调这个函数并不再抛出 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| tid | number | 协程id,id 可用于结束或是等待一个任务 |
函数实例:
--子协程会在协程停止后,自动停止local thread = require('thread')local thread_id = thread.create(function()--创建子协程local sub_thread_id_1 = thread.createSubThread(function()mSleep(3000)--因为sub thread 1比parent thread运行时间短,所以以下代码会被执行toast("sub thread 1 over",3)end)local sub_thread_id_2 = thread.createSubThread(function()--创建子协程的子协程local sub_thread_2_sub_thread_1 = thread.createSubThread(function()mSleep(1000)toast("sub thread 2,sub thread 1 over",3)end)mSleep(6000)--因为sub thread 2比parent thread运行时间长,所以以下代码实际执行不到toast("sub thread 2 over",3)end)mSleep(4000)toast("parent thread over",3)end)thread.waitAllThreadExit()--等待所有协程结束,只能用于主线程
| 参数 | 类型 | 说明 |
|---|---|---|
| tid | number | 协程id,id 可用于结束或是等待一个任务 |
函数用例:
local thread = require('thread')local thread_id1 = thread.create(function()for i=1,10 dotoast("协程1:".. i)mSleep(1200)endend)local thread_id2 = thread.create(function()for i=1,10 dotoast("协程2:".. i)mSleep(2000)endend)mSleep(5000)thread.stop(thread_id1)--关闭协程1thread.waitAllThreadExit()--等待所有协程结束,只能用于主线程
| 参数 | 类型 | 说明 |
|---|---|---|
| tid | number | 协程ID |
| back | table | 选填,错误回调,当执行任务时发生错误异常,则会回调这个函数并不再抛出 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| ok | boolean | 成功返回true,失败返回false |
| ret | table | 正确无返回,错误返回错误信息 |
函数用例:
local thread = require('thread')local thread_id = thread.create(function()mSleep(1000)return 100end)local ok,ret = thread.wait(thread_id)if ok then--正常结束,ret是协程函数的返回值,这里ret=100toast("wait ok,ret is "..ret)else--这里不会被执行local ts = require('ts')local cjson = ts.jsontoast("wait thread fail:"..cjson.encode(ret))end
| 参数 | 类型 | 说明 |
|---|---|---|
| timeout | number | 超时时间 |
| thread_id | number | 协程ID,如果在协程内,参数省略 |
| 参数 | 类型 | 说明 |
|---|---|---|
| thread_id | number | 协程 ID,如果在协程内,参数省略 |
函数用例:
thread = require("thread")local thread_id = thread.create(function()thread.setTimeout(2000)mSleep(1000)toast("thread step 1")mSleep(2000)toast("thread step 2")mSleep(3000)--设置有超时,执行不到这了,会调用catchBacktoast("thread over")end,{callBack = function()--协程结束会调用,不论是错误、异常、正常结束-- toast("我结束了")end,catchBack = function(exp)--协程异常结束,异常是脚本调用了throw激发的,exp是table,exp.message是异常原因local ts = require('ts')local cjson = ts.jsontoast("我异常了"..cjson.encode(exp))end})mSleep(1000)thread.clearTimeout(thread_id)mSleep(2000)thread.setTimeout(1000,thread_id)--等待所有协程结束thread.waitAllThreadExit()
注意事项:
因为主线程结束了协程会全部结束,所以使用该函数可以等待协程都结束再退出
函数功能:创建一个可控制浮动窗口并显示动态内容。
支持版本:引擎版本 iOS v2.3.5,Android v2.0.3 以上
| 参数 | 类型 | 说明 |
|---|---|---|
| wid | string | 用于指定创建窗口的ID |
| x1,y1 | number | 窗口左上角顶点坐标 |
| x2,y2 | number | 窗口右下角顶点坐标 |
| type | number | 1 - 窗口可移动;0 - 窗口不可移动 |
脚本实例:
fwShowWnd("wid",0,0,200,200,1) --显示一个可移动的窗口并指定窗口ID为 wid
注意事项:
1.可同时创建多个浮动窗口。
2.此为浮动窗口初始化函数,创建浮动窗口必须调用此函数
| 参数 | 类型 | 说明 |
|---|---|---|
| wid | string | 用于指定窗口载体的ID |
| vid | string | 用于指定一个文字视图ID |
| text | string | 需要显示的文字内容 |
| align | string | 对齐方式,left - 左对齐;right - 右对齐;cente - 居中 |
| textcolor | string | 文字颜色16进制值,填空字符串默认为黑色 |
| backgroundcolor | string | 视图背景色16进制值,填空字符串默认为透明 |
| size | number | 文字大小,填 0 默认值为15 |
| type | number | 文字类型,0-标准;1-粗体 |
| x1,y1 | number | 窗口左上角顶点坐标 |
| x2,y2 | number | 窗口右下角顶点坐标 |
| alpha | number | 选填参数,背景色透明度 0 - 1,默认为1 |
脚本实例:
fwShowWnd("wid",0,0,200,100,1)fwShowTextView("wid","textid","这是一个文本视图","center","FF0000","FFDAB9",20,0,0,0,200,100,0.5)--显示一个文字视图mSleep(500)
注意事项:
- 如需要刷新文本内容,重新调用函数即可。
- 视图坐标相对于窗口顶点 (0,0)。
- 透明度只针对背景颜色,文字不受影响。
| 参数 | 类型 | 说明 |
|---|---|---|
| wid | string | 用于指定窗口载体的ID |
| vid | string | 用于指定一个图形视图ID |
| picpath | string | 需要显示的图片的路径,支持绝对路径、网络地址 |
| x1,y1 | number | 窗口左上角顶点坐标 |
| x2,y2 | number | 窗口右下角顶点坐标 |
| alpha | number | 选填参数,透明度 0 - 1,默认为1 |
脚本实例:
fwShowWnd("wid",0,0,200,100,1)snapshot("1.png",400,400,600,500)fwShowImageView("wid","picid","1.png",0,100,200,200) --显示一个图片视图mSleep(500)
注意事项:
- 如需要刷新图形,重新调用函数即可。
- 视图坐标相对于窗口顶点 (0,0)。
| 参数 | 类型 | 说明 |
|---|---|---|
| wid | string | 需要关闭的窗口载体的ID |
| vid | string | 需要关闭的视图ID |
脚本实例:
fwCloseView("wid","textid") --关闭文字视图
注意事项:
- 如需要关闭所有视图,直接使用 fwCloseWnd 函数关闭窗口即可。
| 参数 | 类型 | 说明 |
|---|---|---|
| wid | string | 需要关闭的窗口载体的ID |
脚本实例:
fwCloseWnd("wid") --关闭窗口
注意事项:
- 当使用此函数关闭窗口时,所有此窗口内的视图会同时关闭。
| 参数 | 类型 | 说明 |
|---|---|---|
| wid | string | 需要关闭的窗口载体的ID |
| 返回值 | 类型 | 说明 |
|---|---|---|
| wndTab.ret | number | 0 - 失败;1 - 成功 |
| wndTab.x,wndTab.y | number | 窗口左上角定点坐标 |
| wndTab.x1,wndTab.y1 | number | 窗口右下角定点坐标 |
脚本实例:
wndTab = fwGetWndPos("wid")dialog("窗口获取状态:"..wndTab.ret.."\n".."左上角坐标:"..wndTab.x..","..wndTab.y.."\n".."右下角坐标:"..wndTab.x1..","..wndTab.y1, 2)
注意事项:
- 如果该窗口不存在,会返回 0。
| 参数 | 类型 | 说明 |
|---|---|---|
| wid | string | 用于指定窗口载体的ID |
| vid | string | 用于指定一个按钮ID |
| text | string | 需要显示的文字内容 |
| textcolor | string | 文字颜色16进制值,填空字符串默认为黑色 |
| bgcolor | string | 视图背景色16进制值,填空字符串默认为透明 |
| image | string | 需要显示的图片路径,支持绝对路径 |
| size | number | 文字大小,填 0 默认值为13 |
| x1,y1 | number | 窗口左上角顶点坐标 |
| x2,y2 | number | 窗口右下角顶点坐标 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| vid | string | 返回显示按钮的ID |
脚本实例:
local num = 0fwShowWnd("wid",100,100,500,500,1)fwShowTextView("wid","id1","点击:" .. num,"center","FF0000","FFDAB9",15,0,0,0,200,100)fwShowTextView("wid","id2","闪","center","FFFFFF","0000FF",15,0,300,0,400,100)fwShowWnd("wida",300,300,500,500,1)fwShowButton("wida","vid","点我","FFFFFF","FF0000","",15,0,0,100,100)while (true) dolocal vid = fwGetPressedButton()if vid == "vid" thennum = num + 1fwShowTextView("wid","id1","点击:" .. num,"center","FF0000","FFDAB9",15,0,0,0,200,100)if num%2 == 0 thenfwShowTextView("wid","id2","闪","center","FFFFFF","0000FF",15,0,300,0,400,100)elsefwCloseView("wid","id2")endendend
注意事项:
- 不能拖动按钮控件,只能拖动非按钮控件或主控件
init(0)toast("创建一个可移动的窗口")fwShowWnd("wid",0,0,200,200,1) --创建一个可移动的窗口mSleep(2000)toast("加载文字")fwShowTextView("wid","id1","这是一个文本视图","center","FF0000","FFDAB9",15,0,0,0,200,100,0.5)mSleep(2000)toast("加载一个截图")snapshot("1.png",400,400,600,500)fwShowImageView("wid","id2","1.png",0,100,200,200)mSleep(2000)toast("随便移动窗口,5 秒后继续")mSleep(5000)tab=fwGetWndPos("wid")dialog("窗口获取状态:"..tab.ret.."\n".."左上角坐标:"..tab.x..","..tab.y.."\n".."右下角坐标:"..tab.x1..","..tab.y1, 2)mSleep(2000)toast("关闭文字视图")fwCloseView("wid","id1") --关闭文字视图mSleep(2000)toast("关闭窗口")fwCloseWnd("wid")
简介:
- UI即User Interface,在触动上指界面的样式,通过各种控件和样式组合,可以实现设置页面,信息展示等等丰富的功能。触动精灵提供三种方式供开发者方便、快捷的编写UI:
- showUI显示一个json自定义界面
- WebView(网络视图)加载显示网页
- 使用TSLib扩展库中的便捷UI函数
| 参数 | 类型 | 说明 |
|---|---|---|
| ui_json | string | 自定义界面json格式字符串调用时字符串需经过压缩与转义 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| ret | number | 1 - 确认输入;0 - 取消输入 |
| input_(*) | string | 返回用户输入的多项数据 |
json 就是一串字符串,在该函数中,我们用它来创建界面上的一系列会使用特定的符号标注的元素:
{} 双括号表示对象
[] 中括号表示数组
"" 双引号内是属性或值
: 冒号表示后者是前者的值
所以 {"name": "Michael"} 可以理解为是一个包含 name 为 Michael 的对象,而 [{"name": "Michael"},{"name": "Jerry"}] 就表示包含两个对象的数组。
当然了,你也可以使用 {"name":["Michael","Jerry"]} 来简化上面一部分,这是一个拥有 name 数组的对象。
不管是键或string的值都要用双引号引起来,所以上面的代码就是 {"name":"json"}。
为了便于 json 的书写,我们通常使用可读性较强的形式;但是为了便于脚本的调用,我们 需要将 json 进行压缩与转义。将上文中的 json 进行转义后,作为字符串放进 showUI 函数的参 数 ui_json 中,例如:
--[[ret, input_1, input_2, ... = showUI("");]]ret, input_1, input_2, input_3 = showUI("{\"style\":".."\"default\",\"views\":[{\"type\":\"Label\",\"text\":".."\"settings\",\"size\":25,\"align\":\"center\",\"color\":".."\"0,0,255\"},{\"type\":\"RadioGroup\",\"list\":".."\"option1,option2,option3,option4,option5,option6,option7\",".."\"select\":\"1\"},{\"type\":\"Edit\",\"prompt\":\"Test\",".."\"text\":\"Custom Text\",\"size\":15,\"align\":\"left\",".."\"color\":\"255,0,0\"},{\"type\":\"CheckBoxGroup\",\"list\":".."\"option1,option2,option3,option4,option5,option6,option7\",".."\"select\":\"3@5\"}]}");
json 在线校验格式化、压缩转义工具:http://www.bejson.com/
上面的代码看起来有些乱,可能会让新手无所适从,我们换一种形式来写:
w,h = getScreenSize();--此段代码仅供演示用,不可复制粘贴直接运行MyJsonString = [[{"style": "default","width": ]]..w..[[,"height": ]]..h..[[,"config": "save_111.dat","timer": 10,"views": [{"type": "Label","text": "设置","size": 25,"align": "center","color": "0,0,255"},{"type": "RadioGroup","list": "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select": "1"},{"type": "Edit","prompt": "测试三下","text": "默认值","size": 15,"align": "left","color": "255,0,0"},{"type": "CheckBoxGroup","list": "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select": "3@5"}]}]]ret, input1, input2, input3 = showUI(MyJsonString);
在上面的例子中可以看到"width"和"height"的值我们使用了变量 w,h 这两个变量具体数值由 getScreenSize() 函数提供,这样我们实现了UI界面自动适应屏幕大小,需要在UI中使用动态数据的时候我们还可以使用table的方式来进行构造,这样使用变量的时候可以更加顺手,例如:
local ts = require("ts")local cjson = ts.jsonlocal w,h = getScreenSize();MyTable = {["style"] = "default",["width"] = w,["height"] = h,["config"] = "save_001.dat",["timer"] = 10,views = {{["type"] = "Label",["text"] = "设置",["size"] = 25,["align"] = "center",["color"] = "0,0,255",},{["type"] = "RadioGroup", --单选框,input1["list"] = "选项1,选项2,选项3,选项4,选项5,选项6,选项7",--7个单选项,序号从0开始,即选项1编号为0,选项2编号为1,依此类推["select"] = "1", --默认选择选项2},{["type"] = "Edit", --输入框,input2["prompt"] = "请输入一个数字",--编辑框中无任何内容时显示的底色文本["text"] = "默认值", --界面载入时已经存在于编辑框中的文本},{["type"] = "CheckBoxGroup", --多选框,input3["list"] = "选项1,选项2,选项3,选项4,选项5,选项6,选项7",--7个多选项["select"] = "3@5", --默认选择选项3和选项5},{["type"] = "ComboBox", --下拉框,input4["list"] = "选项1,选项2,选项3,选项4,选项5,选项6,选项7",--7个下拉选项,序号从0开始,即选项1编号为0,选项2编号为1,依此类推["select"] = "1", --默认选择选项2},}}local MyJsonString = cjson.encode(MyTable);ret, input1, input2, input3, input4 = showUI(MyJsonString);--返回值ret, input1, input2, input3, input4
- 以上实例中将table转为JSON需要借助 ts 扩展库实现。
- 最下面返回值的数量应与代码中的非标签空间总数数量保持一致,否则会造成后面的非标签控件返回值无效。
更多用法可以参考这里:一个包含所有控件的UI实例
上面是调用的例子,但是我们首先我们要设计一个界面,并生成一段json字符串,再进行压缩转义。
我们先看上图界面示例json原来的样子(非脚本代码,不可直接引用),再作解释:
{--此示例仅供演示作用,不可复制粘贴直接运行"style": "default", "config": "save_111.dat", "width": 400,"height": 120, "bg": "a.png", "timer": 10, "cancelname": "取消", "okname": "开始","views": [{"type": "Label","text": "设置","size": 25, "align": "center","color": "0,0,255"},{"type": "RadioGroup","list": "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select": "1"},{"type": "Edit","prompt": "测试三下","text": "默认值","size": 15, "align": "left","color": "255,0,0"},{"type": "CheckBoxGroup","list": "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select": "3@5"},{"type": "ComboBox","list": "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select": "1"},{"type": "Image","src": "http://www.baidu.com/img/bdlogo.png"}]}
创建一个界面,需要包含 style 与 views 两个主键。
style 表示界面样式,views 数组则包含了界面上的控件。
| 参数 | 类型 | 说明 |
|---|---|---|
| style 样式 |
string | 指定界面样式 default为默认样式,所有控件自动排列,每个控件占据一行。 custom为自定义样式,当界面样式被指定为这种,则必须指定每个控件的 rect 属性以调整控件的尺寸以及位置 |
| width 宽度 |
number | 界面的宽度(像素 pixels),不得低于 400 |
| height 高度 |
number | 界面的高度(像素 pixels),不得低于 120 |
| bg 背景图片 |
string | 指定界面的背景图片,相对路径为 res 资源目录,可填写绝对路径 |
| okname 确认 |
string | 指定底部右侧确认按钮上显示的文字 |
| cancelname 取消 | string | 指定底部左侧取消按钮上显示的文字 |
| title 标题 |
string | 用于指定UI顶部标题栏文字 仅 iOS v2.2.5,Android v1.2.4 以上版本支持 |
| titles 多页标题 |
string | 用于指定UI顶部标题栏文字 在多页模式下可以设置多个标题对应多个页面,以逗号分隔 仅 iOS v2.3.2,Android v2.2.7以上版本支持 |
| pagetype 多页模式 |
number | 当指定该属性值为 multi 时,UI可分页显示,左右滑动进行翻页,如不指定该属性,将使用默认的单页模式仅 iOS v2.2.5,Android v2.1.5以上版本支持 |
| selpage 多页模式默认停留 |
number | 多页模式下指定默认停留的页面 仅引擎版本 iOS V2.2.7 及以上版本支持 |
| orient 方向 |
number | 指定 UI 界面显示方向 0-Home键在设备下方 1-Home键在设备右侧 2-Home键在设备左侧 仅 iOS v2.2.5以上版本支持 |
| btnbkcolor 底部按钮背景色 |
string | 使用 RGB 十进制数值,以英文半角逗号分割 仅 iOS v2.3.5 以上版本支持 |
| bgcolor 界面背景色 |
string | 使用 RGB 十进制数值,以英文半角逗号分割 仅 iOS v2.3.5 以上版本支持 |
| pagenumtype 分页指示样式 |
string | dot - 小圆点 number - 数字 default - 不显示 仅 iOS v2.3.5 ,Android v1.3.0 以上版本支持 |
| config 配置保存文件名 |
string | 保存配置到该文件 |
| timer 自动确认时间 |
number | 倒计时完成自动开始 |
| rettype 指定返回值类型 |
string | default - 默认模式,保持旧版格式,可使用此属性兼容旧版UI array - 数组模式,将所有控件返回值按添加顺序放入一个table中并返回 table - table模式,将所有控件返回值以 key,values 形式的table返回,key为控件id属性所指定的值 仅 iOS v2.2.6,Android v1.2.7 及以上版本支持 |
注意事项:
- 当在
iOS9以上版本的 iPad 设备上使用 showUI 界面时,务必使用orient属性指定正确的屏幕方向,否则将可能出现确定、取消按钮无法点击的情况。- 如果配置文件已存在,调用该界面会自动载入该文件中的配置,如果更新了UI代码后必须要删除旧的配置文件才会正常显示。
- 使用 timer 属性必须要设定 config 属性,第一次存储配置文件不存在时,此属性不生效,当配置文件存在时,此属性会在生成UI上进行倒计时。
- 在脚本UI界面点击闹钟标志则取消倒计时功能。
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| width | 控件宽度 | number | 选填,默认为 showUI 宽度,当 showUI 全局属性 style 为 default 时,如需将多个控件放入同一行显示,可用此属性调整控件宽度。仅 iOS v2.2.6,Android v1.2.4 及以上版本支持 |
| nowrap | 指定下一个控件是否换行 | number | 选填,当此属性为 1 时,将指定下一个控件不换行,用于将多个控件放入一行显示。不写控件宽度下个插件会在屏幕外显示。仅 iOS v2.2.6,Android v1.2.5 及以上版本支持 |
| id | 控件 ID | string | 选填,为控件指定 ID,可以理解为控件的名称,在返回类型为table时将作为返回 table 中的 key |
我们可以看到,界面控件被定义在 views 数组中。而自定义界面一共有七种控件类型 type:标签 Label,单选框 RadioGroup,单行文本框 Edit,多行文本框 TextArea,多选框 CheckBoxGroup,下拉框 ComboBox,图片 Image。
一共有四种属性:标题 text、字体大小 size、对齐方式 align、字体颜色 color、控件ID id
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| size | 字体大小 | number | 选填,如果不指定该属性,则默认值为 15 |
| text | 标题 | string | 必填,一般来用显示说明文字或者标题,该控件没有任何返回值,只用作显示 |
| align | 对齐方式 | string | 选填,默认左对齐。可取值为:左对齐 left,右对齐 right,居中 center |
| color | 字体颜色 | string | 选填,默认黑色。使用RGB十进制数值,以英文半角逗号分割 |
注意事项:
标签可支持多行显示,在字符串中插入 \n 可以进行换行,例如:\"测试\n测试 1\n测试 2\"(安卓系统 \n 需写成 \r\n)
文字颜色尽量选择和背景区别较大、在电子设备屏幕上看起来不刺眼的颜色,具体可参考配色网。
一共有五种属性:可选项标题 list、默认选中项编号 select、控件ID id、在可选项上显示图片 images、选项图片缩放 scale
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| list | 可选项标题 | string | 必填,多个可选项之间用英文半角逗号分割 |
| select | 默认选中项编号 | string | 必填,只允许填写一个,序号从 0 开始,与可选项标题中的顺序保持一致 |
| images | 在可选项上显示图片 | string | 选填,此属性可单独使用也可以和 list 属性同时使用,多个图片资源用英文半角逗号分割 |
| scale | 选项图片缩放 | number | 当images属性有效时可用此属性设置图片资源缩放比例,范围 0 - 1 |
| countperline | 单行控件显示数量 | number | 选填,Android 默认 1 行显示 1 个,iOS 控件总宽度超过屏幕宽度则堆积在一起,引擎版本支持 iOS v3.00-157 及 Android v2.3.6 及其以上版本,仅支持 TSLib 函数库 v1.2.4 及其以上版本 |
一共有六种属性:提示文本 prompt、默认内容 text、 字体大小 size、对齐方式 align、字体颜色 color、键盘类型 kbtype
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| prompt | 提示文本 | string | 必填,控件类型,输入框 |
| text | 默认内容 | string | 选填,无,提示文字 |
| size | 字体大小 | number | 选填,如果不指定该属性,则默认值为 15 |
| align | 对齐方式 | string | 选填,默认左对齐。可取值:左对齐 left,右对齐 right,居中 center |
| color | 字体颜色 | string | 选填,默认黑色。使用 RGB 十进制数值,以英文半角逗号分割 |
| kbtype | 键盘类型 | string | 选填,设置获取焦点时弹出的键盘类型,number ascii |
仅支持 iOS v2.4.5-3 以上版本及 Android v2.3.3.2 以上版本
一共有六种属性:提示文本 prompt、默认内容 text、 字体大小 size、对齐方式 align、字体颜色 color、高度 height、键盘类型 kbtype
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| prompt | 提示文本 | string | 选填,无,提示文字(仅支持 Android) |
| text | 默认内容 | string | 选填,无,提示文字 |
| size | 字体大小 | number | 选填,如果不指定该属性,则默认值为 15 |
| align | 对齐方式 | string | 选填,默认左对齐。可取值:左对齐 left,右对齐 right,居中 center |
| color | 字体颜色 | string | 选填,默认黑色。使用 RGB 十进制数值,以英文半角逗号分割 |
| height | 高度 | number | 选填,支持 iOS v2.4.5-3 以上版本,Android 根据内容自行修改的 |
| kbtype | 键盘类型 | string | 选填,设置获取焦点时弹出的键盘类型,number ascii |
又称作检查框,一共有五种属性:可选项标题 list、默认选中项编号 select、控件ID id、在可选项上显示图片 images、选项图片缩放 scale
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| list | 可选项标题 | string | 必填,多个可选项之间用英文半角逗号分割 |
| select | 默认选中项编号 | string | 必填,允许填写一个或多个,填写多个时以 @ 分割。序号从 0 开始,与可选项标题中的顺序保持一致 |
| images | 在可选项上显示图片 | string | 选填,此属性可单独使用也可以和list属性同时使用,多个图片资源用英文半角逗号分割 |
| scale | 选项图片缩放 | string | 当images属性有效时可用此属性设置图片资源缩放比例,范围 0 - 1 |
| countperline | 单行控件显示数量 | number | 选填,Android 默认 1 行显示 1 个,iOS 控件总宽度超过屏幕宽度则堆积在一起,引擎版本支持 iOS v3.00-157 及 Android v2.3.6 及其以上版本,仅支持 TSLib 函数库 v1.2.4 及其以上版本 |
一共有五种属性:
可选项标题 list、默认选中项编号 select、两个ComboBox控件建立数据关联时的下级选项 data、两个ComboBox控件建立数据关联时的上级数据源名称 source、两个ComboBox控件建立数据关联时的下级数据源名称 dataSource
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| list | 可选项标题 | string | 必填,多个可选项之间用英文半角逗号分割 |
| select | 默认选中项编号 | string | 必填,只允许填写一个,序号从 0 开始,与可选项标题中的顺序保持一致 |
| data | 两个ComboBox控件建立数据关联时的下级选项 | string | 选填 |
| source | 两个ComboBox控件建立数据关联时的上级数据源名称 | string | 选填 |
| dataSource | 两个ComboBox控件建立数据关联时的下级数据源名称 | string | 选填 |
注意事项:
- 默认选中项编号 select 只允许填写一个,序号从 0 开始(此控件需引擎版本 iOS v2.1.3 以上支持)。
- 上一级的必须要有data数据给下级使用,而且list里面逗号分割的个数必须要和data里面#号分割的个数保持一致,上一级的source 和下一级的 dataSource 要保持一致
- 使用了dataSource 就不可以使用list(data、source、dataSource属性需引擎版本 iOS v2.1.8,Android v1.2.4 以上版本支持)
放置一个图片到 UI 上,属性:插入图片的路径 src、对齐方式 align、缩放比例 scale、宽度 width
| 参数 | 功能 | 类型 | 说明 |
|---|---|---|---|
| src | 插入图片的路径 | string | 必填,可以是本地路径或者网络路径 |
| align | 对齐方式 | string | 选填,在 default 模式下设置 image 控件的对齐方式 left center right |
| scale | 缩放比例 | number | 选填,在 default 模式下设置 image 控件的缩放比例,范围 0 - 1 |
| width | 宽度 | number | 选填,在 default 模式下设置 image 控件的宽度 |
注意事项:
图片路径的可以是本地路径或者网络路径,例如:\"type\":\"Image\",\"src\":\"http://www.baidu.com/img/bdlogo.png\" 或者\"src\":\"1.png\"
以上六种控件均可重复使用,这个界面的样式 style 为 default,即默认样式,这个样式下的控件将会自动排列,不需要指定其坐标。
另一种界面样式为 custom,当界面样式被指定为这种,则必须指定每个控件的 rect 属性以调整控件的尺寸以及位置,例如:
{"type": "Edit", "size": 15, "align": "left","prompt": "提示文字","text": "默认文字","color": "255,0,0","rect": "0,0,100,40"}
| 参数 | 类型 | 说明 |
|---|---|---|
| 尺寸与位置 rect | 文本型 | 必填,该属性适用于全部五种控件,将控件的左上角顶点横坐标、纵坐标,控件宽度、高度分别以英文半角逗号分割。 |
注意事项:
在引擎版本 iOS v2.2.6 以上版本中,自定义模式坐标计算方式由原来的分辨率(pt)改为分辨率(px),开发者使用自定义模式时需要做对应修改,新的方式只需将原自定义模式坐标乘以 Render 屏对应的倍数即可
除了标签 Label,其余四种控件均存在文本型返回值,按照定义时的顺序依次返回给 input_1, input_2, input_3, ...。
单选框返回当前选中项的编号(从 0 开始);
编辑框返回其中的内容;
多选框返回当前选中项的编号(从 0 开始),多个选项以 @ 分割。如:3@5 表示多选框组编号为 3 和 5 的两个选项已被选中。
别忘记,该函数的第一个返回值为整数型 ret,用户单击右下角的“确认”时返回 1,单击左下角的“取消”时返回 0。
通过设置全局属性 rettype 可指定返回值类型适应不同的需求,具体用法参看全局属性介绍部分(此属性需引擎版本 iOS v2.2.6,Android v1.2.7 以上版本支持)。
如果关于返回值调用还是不明白,可以看一下视频教程。
当然你也可以看一下触动精灵官方提供的UI库,非常简洁方便。
local ts = require("ts")local cjson = ts.jsonw,h = getScreenSize();MyTable = {["style"] = "default", -- 选填,默认样式,控件排列类型["rettype"] = "table",-- 选填,旧版,shoui返回值格式["width"] = w,-- 选填,安卓默认全屏,iOS默认,showui宽度["height"] = h, -- 选填,安卓默认全屏,iOS默认,shoWui高度["config"] = "showuiTest.txt", -- 选填,无,配置文件保存文件["timer"] = 99, -- 选填,无,自动执行倒计时["orient"] = 0, -- 选填,竖屏,显示方向(仅支持iOS)["pagetype"]= "multi",-- 选填,单页,单页/多页 (多页显示时必填,否则无法正确显示showui)["title"] = "触动精灵脚本UI演示",-- 选填,脚本配置,showUI标题["titles"] = "第一页,第二页,第三页",-- 选填,无,多页howui标题(尽在多页下有效)["cancelname"] = "取消", -- 选填,取消,左下角按钮名称["okname"] = "开始", -- 选填,确认,右下角按钮名称["selpage"] = 1, -- 选填, 无,多页模式下指定默认停留的页面["btnbkcolor"] = "255,255,255",-- 选填,255,255,255,底部按钮背景色(仅支持iOS)["bgcolor"] = "255,255,255", -- 选填,255,255,255,界面背景色(仅支持iOS)["pagenumtype"] = "number", -- 选填,无,分页指示样式pages ={{{["type"] = "Label",["text"] = "点击右上角闹钟关闭倒计时↗",["size"] = 20,["align"] = "center",["color"] = "255,0,0",},{["type"] = "Label", -- 必填,控件类型,标签["text"] = "第一页设置",-- 选填,无,显示内容(内容为空,仍然占用一行)["size"] = 25, -- 选填,15,字号["align"] = "center", -- 选填,居左,对齐样式["color"] = "0,0,0", -- 选填 ,0,0,0,字体颜色},{["type"] = "Label",["align"] = "center",["text"] = "单选框-RadioGroup",["size"] = 20,},{["type"] = "RadioGroup",-- 必填,控件类型,单选框["id"] = "rg",-- 选填,无,控件ID,以table格式返回返回值时必填,否则无法获取返回值["list"] = "小学,初中,高中,大学", -- 必填,无,单选框内容["select"] = "1", -- 选填,0,默认选中项id["images"] = "showui_test_a.png,showui_test_b.png,showui_test_c.png,showui_test_d.png",-- 选填,无, 单选框选项显示图片["scale"] = "0.4", -- 选填,1,图片缩放比例},{["type"] = "Label",["align"] = "center",["text"] = "输入框-Edit",["size"] = 20,},{["type"] = "Edit",-- 必填,控件类型,输入框["id"] = "edit",-- 选填,无,控件ID 以table格式返回返回值时必填,否则无法获取返回值["prompt"] = "年", -- 选填,无,提示文字["text"] = "1989", -- 选填,无,默认文字["kbtype"] = "number", -- 选填,标准键盘,键盘类型["color"] = "0,0,0", -- 选填,黑色,字体颜色["size"] = 15, -- 选填,15,字体大小["align"] = "center", -- 选填,居左,对齐方式},{["type"] = "Label",["align"] = "center",["text"] = "单级下拉框-ComboBox",["size"] = 20,},{["type"] = "ComboBox",-- 必填,控件类型,下拉框["id"] = "cb1",-- 选填,无,控件ID以table格式返回返回值时必填,否则无法获取返回值["list"] = "鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪",-- 必填,无,下拉框内容["select"] = "1",-- 选填,0,默认选中项id},{["type"] = "Label",["text"] = "二级下拉框-ComboBox",["size"] = 20,},{["type"] = "ComboBox", -- 必填,控件类型,下拉框["id"] = "cb2",-- 选填,无,控件ID 以table格式返回返回值时必填,否则无法获取返回值["list"] = "北京,上海,广州,深圳",-- 必填,无,下拉框内容["select"] = "0", -- 选填,0,默认选中项id["data"] = "北京1,北京2,北京3,北京4#".."上海1,上海2,上海3,上海4#".."广州1,广州2,广州3,广州4#".."深圳1,深圳2,深圳3,深圳4", --必填,无,下拉框子选项内容["source"] = "这里必须一致"-- 必填,无,主选项下拉框控件 source 属性必须与子选项下拉框的dataSource属性一致},{["type"] = "ComboBox", -- 必填,控件类型,下拉框["id"] = "cb3",-- 选填,无控件 ID,以 table 格式返回返回值时必填,否则无法获取返回值["select"] = "0",-- 选填,无,子选项下拉框默认选中项["dataSource"] = "这里必须一致"--必填,无,主选项下拉框控件 source 属性必须与子选项下拉框的 dataSource 属性一致},},{{["type"] = "Label",["text"] = "第二页设置",["size"] = 25,["align"] = "center",["color"] = "0,0,0",},{["type"] = "Label",["align"] = "center",["text"] = "多行文本框-TextArea",["size"] = 20,},{["type"] = "TextArea", -- 必填,控件类型,输入框["id"] = "ta",-- 选填,无,控件ID 以 table格式返回返回值时必填,否则无法获取返回值["text"] = "定制脚本担保人员:\r\n".."2885869964\r\n".."触动精灵脚本交易群\r\n".."384123108\r\n".."官方工作人员都是使用288开头的企业QQ\r\n".."交易需谨慎,谨防上当受骗!", -- 选填,无,默认文字["prompt"] = "我是hint", -- 选填,无,提示文字["size"] = 15, -- 选填,15,字体大小["align"] = "center", -- 选填,居左,对齐方式["height"] = 250, -- 选填,75,空间高度(仅支持 iOS)["color"] = "255,0,0", -- 选填,黑色,字体颜色["kbtype"] = "number", -- 选填,标准键盘,键盘类型},{["type"] = "Label",["align"] = "center",["text"] = "多选框-CheckBoxGroup",["size"] = 20,},{["type"] = "CheckBoxGroup", --必填,控件类型,单选框["id"] = "cbg",-- 选填,无,控件 ID 以 table 格式返回返回值时必填,否则无法获取返回值["list"] = "电影,读书,跑步,吃饭,".."运动,睡觉,旅行,打豆豆,听歌,电影", -- 必填,无 ,单选框内容["select"] = "3@5@7", -- 选填,0,默认选中项 id["images"] = "showui_test_a.png,showui_test_b.png,".."showui_test_c.png,showui_test_d.png,showui_test_e.png,".."showui_test_f.png,showui_test_g.png,showui_test_h.png,".."showui_test_i.png,showui_test_j.png",-- 选填,无,单选框选项显示图片["scale"] = "0.3", -- 选填,1,图片缩放比例},},{{["type"] = "Label",["text"] = "第三页设置",["size"] = 25,["align"] = "center",["color"] = "0,0,0",},{["type"] = "Label",["align"] = "center",["text"] = "图片-Image",["size"] = 20,},{["type"] = "Image", -- 必填,控件类型,图片["src"] = "http://mrw.so/4wbrDw", --必填,无,图片路径(可填写资源目录下相对路径,绝对路径,网址)["scale"] = 0.4, -- 选填,无,图片缩放比例},{["type"] = "Image",["src"] = "http://mrw.so/4wbrDw",["scale"] = 0.6, -- 选填,无,图片缩放比例["align"] = "left" -- 选填,居左,对齐方式},{["type"] = "Image",["src"] = "http://mrw.so/4wbrDw",["scale"] = 0.8, -- 选填,无,图片缩放比例["align"] = "center" -- 选填,居左,对齐方式},{["type"] = "Image",["src"] = "http://mrw.so/4wbrDw",["scale"] = 1, -- 选填,无,图片缩放比例["align"] = "right" -- 选填,居左,对齐方式},}}}local MyJsonString = cjson.encode(MyTable);UIret,values = showUI(MyJsonString)if UIret == 1 thenlocal rg = values.rglocal edit = values.editlocal cb1 = values.cb1local cb2 = values.cb2local cb3 = values.cb3local ta = values.talocal cbg = values.cbgdialog("单选:"..rg..",\r\n单行输入框:"..edit..",\r\n一级下拉框:"..cb1..",\r\n二级下拉框主选项:"..cb2..",\r\n二级下拉框子选项:"..cb3..",\r\n多行文本框:"..ta..",\r\n多选框:"..cbg..",")end
- 以上实例需引擎版本iOS v2.2.6,Android v1.2.7 以上版本支持。
- 实例中所使用的图片资源包下载地址:https://pan.baidu.com/s/1c4liZ88,将图片包中的图片文件解压后放入 /User/Media/TouchSprite/res 目录中,运行实例即可看到效果。
- 实例在 iPhone6S iOS9.0.2 上调试通过,如在其他设备上使用,需自行调整部分参数以适配不同的分辨率。
效果图
名词解析
- JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本 格式,易于人阅读和编写,同时也易于机器解析和生成。
- JSON 中冒号后的值可以是字符串、数字、也可以是另一个数组或对象。
- 转义即取消某些特定的、在编辑语言中被定义为特殊用途的字符。这些字符由于被定义为特殊用途,它们失去了原有的意义,如三种引号 " ' ` 、美元符号 $ 等等。当我们在被引号“括起来”的文本中,想表示出一个引号,就需要转义,如:dialog("\"",5);
注意事项:
- 如果您的系统为 iOS 9 以上版本,并且设备是 iPad,由于一些特殊原因,锁定横屏的时候弹出的UI界面可能无法正常操作,如出现此问题,请将设备改为锁定竖屏。
- 需要注意的是,所有控件的属性值必须按照规则来赋值,错误的赋值类型会导致一些不可预料的结果。
- 为了方便开发者使用,触动精灵提供了封装好的便携 UI 供大家使用,说明文档:https://www.zybuluo.com/miniknife/note/293935
- 在部分安卓设备上需要在系统设置里开启悬浮窗权限方可正常使用 showUI
本类下所有函数都需要引擎版本 iOS v2.3.9,Android v2.3.4 以上支持。
在使用此类函数前必须插入以下代码:
local webview = require('webview')
| 参数 | 类型 | 说明 |
|---|---|---|
| webview_name | string | webview 的名字,可以通过不同的名字同时创建多个 webview |
| originx | number | 左上角 x 点坐标缺省为 0 |
| originy | number | 左上角 y 点坐标缺省为 0 |
| height | number | 高度,缺省为全屏 |
| width | number | 宽度,缺省为全屏 |
| cornerRadius | number | 圆角,缺省为 0 |
| orient | number | webview 方向,0-3,和 init 方向一致,缺省为 0 |
| root | string | webview 在文件系统里个根路径,缺省 userPath().."/res" |
| index | string | webview 的入口文件名,缺省 index.html,如果设置了 html, 这个参数就无效了 |
| html | string | 主文件的 html |
| 返回值 | 类型 | 说明 |
|---|---|---|
| myweb1 | table | 创建webview成功返回一个table,失败返回false |
| err | string | 创建webview失败,err返回错误信息 |
函数用例:见完整例子
函数用例:见完整例子
注意事项:
myweb1 为创建 webview 返回的 id
| 参数 | 类型 | 说明 |
|---|---|---|
| webview_name | string | webview 的名字,可以通过不同的名字同时创建多个 webview |
| originx | number | 左上角 x 点坐标缺省为 0 |
| originy | number | 左上角 x 点坐标缺省为 0 |
| height | number | 高度,缺省全屏 |
| width | number | 宽度,缺省全屏 |
| cornerRadius | number | 圆角,缺省为 0 |
| orient | number | webview 方向,0-3,和 init 方向一致,缺省为 0 |
函数用例:见完整例子
注意事项:
myweb1 为创建 webview 返回的对象
函数用例:见完整例子
注意事项:
myweb1 为创建 webview 返回的对象
| 参数 | 类型 | 说明 |
|---|---|---|
| event | string | 事件名称 |
| func | funtion | 执行的命令 |
函数用例:见完整例子
注意事项:
myweb1 为创建 webview 返回的 id
示例代码一
local html = [[<!DOCTYPE html><html><head><meta charset="utf-8"><title>数据提交简单示例</title><meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!--标准mui.css--><!--App自定义的css--></head><body><form id="form1" name="showUI_commit" method="post" action="/set_event"><br><h5>输入框-普通</h5><label>输入框:<input type="text" name="com3" value="测试" placeholder="请输入"></label><br><h5>输入框-数字</h5><label>输入框:<input type="number" name="com4" value="1" placeholder="请输入"></label><br><h5>输入框-多行</h5><label>输入框:<textarea name="com7" placeholder="请输入" row="5">asd</textarea></label><br><br><button id="actions" type="button">提交</button><button id="cancel" type="button">取消</button></form><script type="text/javascript">function actions(data) {//数据提交post请求var xhr = new XMLHttpRequest();xhr.open("POST", "/set_event", true);xhr.setRequestHeader("Content-type", "application/json");xhr.onreadystatechange = function() {var XMLHttpReq = xhr;if (XMLHttpReq.readyState == 4) {if (XMLHttpReq.status == 200) {var text = XMLHttpReq.responseText;console.log(text);} else {console.log(XMLHttpReq.status)}} else {console.log(XMLHttpReq.readyState);}};alert('{"name": "showUI_commit","value":' + data + '}')xhr.send('{"name": "showUI_commit","value":"' + data + '"}');}function closed() {//取消post请求var xhr = new XMLHttpRequest();xhr.open("POST", "/set_event", true);xhr.setRequestHeader("Content-type", "application/json");xhr.onreadystatechange = function() {var XMLHttpReq = xhr;if (XMLHttpReq.readyState == 4) {if (XMLHttpReq.status == 200) {var text = XMLHttpReq.responseText;console.log(text);} else {console.log(XMLHttpReq.status)}} else {console.log(XMLHttpReq.readyState);}};xhr.send('{"name": "showUI_cancel"}');}document.getElementById('actions').onclick = function() {//数据提交按钮点击var com3Val = document.getElementsByName('com3')[0].value; //获取name为com3的值var com4Val = document.getElementsByName('com4')[0].value; //获取name为com7的值var com7Val = document.getElementsByName('com7')[0].value; //获取name为com3的值var data = com3Val + "," + com4Val + "," + com7Val;actions(data);}document.getElementById('cancel').onclick = function() {//取消按钮点击closed();}</script></body></html>]]local thread = require('thread')local event = require('event')--创建webviewlocal showui_view,err = require('webview').new("myshowui",{html=html})assert(showui_view,err)event.register("showUI_commit",function(value)local ts = require('ts')local cjson = ts.jsontoast(cjson.encode(value),5)showui_view.close()end)event.register("showUI_cancel",function(value)showui_view.close()end)showui_view.show()thread.waitAllThreadExit()
示例代码二
local html = [[<!DOCTYPE html><html><head><meta charset="utf-8"><title>Hello 触动精灵 ShowUI</title><meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!--标准mui.css--><link rel="stylesheet" href="css/tsShowUI.css"><link rel="stylesheet" href="css/icons-extra.css"><!--App自定义的css--></head><body><header class="mui-bar mui-bar-nav"><button id="ts-cancle" class="mui-action-back mui-btn mui-btn-blue mui-btn-link mui-btn-nav mui-pull-left"><span class="mui-icon mui-icon-left-nav"></span><span class=" mui-tscancel">返回</span></button><button id="ts-timer" class="mui-action-back mui-btn mui-btn-blue mui-btn-link mui-btn-nav mui-pull-right"></button><h1 class="mui-title mui-tstitle"></h1></header><footer class="mui-bar mui-bar-footer mui-bar-tsfooter"><button id="ts-post-btn" class="mui-ts-footerbth btn mui-btn-block mui-btn-blue mui-tsaction" data-loading-text="执行中" type="button">开始</button></footer><div class="mui-content"><form class="mui-tsform"><div class="mui-card" id="renderbox"></div></form></div><script src="js/tsShowUI.js"></script><script>(function($, doc) {var uiVersion=$.getVersion();//获取ui版本//json兼容原showui 格式var showui_json = {"title": "触动精灵脚本配置", //给页面添加标题(默认标题无)"cancelname": "取消", //给页面取消按钮添加文字(默认文字无)"config": "save_01","okname": "开始", //给页面开始按钮添加文字(默认“开始”)"style": "default","timer": 30,"orient": 0,"pagetype": "multi","view": [{"type": "Label","text": "标题1","size": 18,"align": "center","color": "0,168,233"}, {"type": "Image","src": "http://www.touchsprite.com/wp-content/uploads/2016/10/banner2_790x230-790x0.png"}, {"type": "Label","text": "switches控件","size": 16,"align": "left","color": "0,168,233"}, {"type": "switches","list": "开关1,开关2,开关3","select": "0@2"}, {"type": "Label","text": "RadioGroup控件","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi4","type": "RadioGroup","list": "选项1,选项2,选项3","select": "1"}, {"type": "Label","text": "Edit控件(普通)","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi5","type": "Edit","prompt": "请输入一个字母","text": "默认值","kbtype": "ascii"}, {"type": "Label","text": "Edit控件(多行)","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi6","type": "Edit","prompt": "请输入一个字母","text": "默认值","row": "5","kbtype": "ascii"}, {"type": "Label","text": "Edit控件(滑块)","size": 16,"align": "left","color": "0,168,233"}, {"type": "Edit","prompt": "请输入一个数字","text": "2","kbtype": "range","max": "100","min": "0",}, {"type": "Label","text": "Edit控件(数字)","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi7","type": "Edit","prompt": "请输入一个数字","text": "123456","kbtype": "number"}, {"type": "Label","text": "Edit控件(密码)","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi8","type": "Edit","prompt": "请输入密码",//已知小米8系统使用密码框会出现系统崩溃问题"text": "hhkjkjh","kbtype": "password"}, {"type": "Label","text": "CheckBoxGroup控件","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi9","type": "CheckBoxGroup","list": "选项1,选项2,选项3,选项4","select": "0@3",}, {"type": "Label","text": "ComboBox控件(二级)","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi10","type": "ComboBox","list": "选项1,选项2,选项3","select": "2","data": "子选项1,子选项2,子选项3,子选项4#子选项5,子选项6,子选项7#子选项8,子选项9","source": "test"}, {"type": "Label","text": "ComboBox控件(一级)","size": 16,"align": "left","color": "0,168,233"}, {"id": "ceshi11","type": "ComboBox","list": "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select": "1"}]};$.renderUI(showui_json);})(mui, document)</script></body></html>]]local thread = require('thread')local event = require('event')local ts = require('ts')local cjson = ts.json--创建webviewlocal showui_view,err = require('webview').new("myshowui",{html=html})assert(showui_view,err)event.register("showUI_commit",function(value)toast(cjson.encode(value),10)showui_view.close()end)event.register("showUI_cancel",function(value)showui_view.close()end)showui_view.show()thread.waitAllThreadExit()
友友们是不是感觉触动精灵提供的插件调用起来不方便,触动内置的功能十分有限?你需要什么?
文件系统操作(新建、删除、建立符号链接)……
文件格式解析(zip, rar, plist, deb)……
网络操作(http, https, ftp, sftp, ftps, udp, smtp, imap)……
图像处理(png, bmp, jpg, tiff)……
问题:有没有更加好用的 Lua 原生扩展方式呢?
答案:有!而且 Lua 扩展有很多!
Lua 的扩展(add-on)基本上来自于这两个网站:
http://luaforge.net/projects
https://rocks.moonscript.org
熟悉跨平台编译的开发者当然可以试试自己编译这当中的插件给 iOS 使用。
如果有 C 语言、Objective-C、C++ 开发能力的,当然也可以自己编写 Lua 原生扩展,还能使用 iOS 的 SDK。
用 Objective-C 给 Lua 编写扩展并在 iOS 平台上运行
关于如何编写 Lua 扩展,参见 Lua 官方文档,这里并不作介绍,以下实例及说明由 i82 提供。
mt.m:
#include <stdio.h>#include <stdlib.h>#include "lua.h"#include "lualib.h"#include "lauxlib.h"#import <objc/runtime.h>#import <Foundation/Foundation.h>#import <UIKit/UIDevice.h>/* 库 open 函数的前置声明 */int luaopen_mt(lua_State *L);/* Function mt_get_device_name* @return string device name*/static int mt_get_device_name(lua_State *L){NSString *name = [[UIDevice currentDevice] name];const char * name_str = [name UTF8String];lua_pushstring(L, name_str);return 1;}//注册函数库static const luaL_Reg mt_lib[] = {{"device_name", mt_get_device_name}, //获取设备名称{NULL, NULL}};int luaopen_mt(lua_State *L){luaL_newlib(L, mt_lib);return 1;}
单个源文件的编译与连接命令(将 gcc 换成 g++ 可使用 Objective-C++ 语法):
xcrun -sdk iphoneos gcc -arch armv7 -arch armv7s -arch arm64 -miphoneos-version-min=4.3 -O3 -std=c99 -I/opt/theos/include/ -c -o mt.o mt.mxcrun -sdk iphoneos gcc -arch armv7 -arch armv7s -arch arm64 -miphoneos-version-min=4.3 -O3 -framework Foundation -framework UIKit -bundle -undefined dynamic_lookup -o mt.so mt.o
得到的 mt.so 即可在 Lua 中引用了:
local mt = require "mt"print(mt.device_name())
为了进一步降低脚本开发者门槛,触动精灵单独开发了 TSLib 函数扩展库,提供了一系列实用函数供开发者使用。
函数库开发手册:https://www.zybuluo.com/miniknife/note/293935
函数扩展库下载
函数:TSVersions 获取扩展库版本号
点击滑动类
函数:tap 触摸点击屏幕
函数:randomTap 随机点击屏幕
函数:moveTo 直线滑动
函数:moveTowards 角度直线滑动
函数:moveZoomOut 两点缩小
函数:moveZoomIn 两点放大
函数:moveCircleCenter 圆心弧度滑动
颜色判断类
函数:intToRgb 颜色转RGB
函数:rgbToInt RGB转颜色
函数:isColor 判断指定坐标的颜色
函数:multiColor 多点颜色判断
函数:multiColTap 多点颜色判断单点点击
函数:findMultiColorInRegionFuzzyByTable 点阵找色
开发调试类
函数:log 日志记录
文件操作类
函数:isFileExist 判断文件是否存在
函数:readFile 读文件内容返回table
函数:readFileString 读文件内容返回string
函数:writeFile 将table内容存入文件
函数:writeFileString 将string内容存入文件
函数:delFile 删除文件
应用信息类
函数:getAppName 获取应用名称
函数:getUserApp 获取用户安装非越狱应用
数据操作类
函数:strSplit 分割字符串
函数:httpGet get获取网页数据
函数:httpPost post提交数据
函数:inputStr 输入字符串
函数:getStrNum 获取字符串个数
函数:getRndNum 获取随机数
函数:snapAndSave 截图并保存到系统相册
函数:deepCopyTable 复制表
系统判断类
函数:getRender 获取屏幕的render值
函数:isDay 判断日期
clear 清理类模块
函数:clearAllPhotos 清空相册
函数:clearAllKeyChains 清空所有应用钥匙串信息
函数:clearIDFAV 清理 IDFAV
函数:clearPasteboard 清除剪贴板
函数:clearCookies 清除浏览器Cookies
showUI 脚本配置界面
函数:checkTable 检查UItable
函数:getMode 获取 UI 模式
函数:neosUI 显示UI
便捷UI
函数:单选框 创建UI
函数:UILabel 文本标签
函数:UIRadio 单选框
函数:UIEdit 编辑框
函数:UICheck 多选框
函数:UICombo 下拉框
函数:UIComboRlt 联动下拉框
函数:UIComboRlts 联动关联框
函数:UIImage 图片框
函数:UIShow 显示UI
"本地光学字符识别" 简称本地 OCR,由于特征库、性能的限制,识别速度慢、识别率也比较差,触动精灵提供了 Lua 云打码扩展库来解决这一问题。
需要注意的是,帮你玩平台不能使用此函数库,小精灵平台要使用打码库请勾选网络插类型。
使用说明:https://www.zybuluo.com/miniknife/note/293935#ocr 云打码扩展库
注意事项:
- 触动苹果安卓,扩展库 v1.1.5以上版本支持,区别于官方打码
- 触动小精灵使用此打码库需要勾选
网络插件类型- 如果函数返回false都为网络错误超时
- 扩展库支持如下打码平台:
- http://www.chaorendama.com/ --QQ 超人
"本地光学字符识别" 简称本地 OCR 由于特征库、性能的限制,识别速度慢、识别率也比较
差。触动精灵提供云打码扩展库来解决这一问题。该扩展库支持如下打码平台:
http://www.hyocr.com/ --火眼
- 下载扩展库,iOS将 cloudOcr.so 插件放入脚本 /lua 目录或插件/pluign 目录,Android将插件放入/data/data/com.touchsprite.android/目录下,在脚本开头插入 local ocr = require "cloudOcr" 即可。
- 安卓设备找不到该目录时需要使用第三方文件管理器,推荐re文件管理器
- 安装触动精灵 2.0 以上版本,在 更多- 插件中在线安装,在脚本开头插入 local ocr = require "cloudOcr" 即可。
- 企业版1.3.6及以上版本已内置本插件,无需额外下载
- 企业版用户如果不能正常使用本插件,建议使用基础扩展库的云打码 → ocr 云打码扩展库
iOS v1.1.6 更新时间(2018-03-20):cloudOcr.so
Android 真机 v1.1.6 更新时间(2018-03-20):cloudOcr.so
模拟器 v1.1.6 更新时间(2018-03-20):cloudOcr.so
| 参数 | 类型 | 说明 |
|---|---|---|
| platform | string | 平台类型,火眼 - hyocr,建议使用 ocr 云打码扩展库 |
| x1,y1 | number | 识别区域左上角顶点坐标 |
| x2,y2 | number | 识别区域右下角顶点坐标 |
| type | string | 打码类型,可在对应平台官网查询 |
| username | string | 打码平台用户名,需用户去相应平台自行注册 |
| password | string | 打码平台密码,需用户去相应平台自行注册 |
| length | number | 打码长度(可选参数),默认为 0 |
| timeout | number | 超时时间(可选参数),默认为 10 秒 |
| scale | number | 缩放比例(可选参数),默认为 100,即不进行缩放 |
| beizhu | string | 备注(可选参数),默认为空 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| ret.success | boolean | true 打码成功,false 失败 |
| ret.text | string | 返回的识别结果,在 success == true 时存在 |
| ret.message | string | 消息,在 success == fasle 时,返回错误原因 |
| ret.id | table | 打码标识,在 success == true 时存在,用于打码自动纠错 |
脚本实例:
local ocr = require "cloudOcr";local op = {--必填参数["platform"]="hyocr", --平台类型,具体参数参照参数表["x1"]=1848, --需要识别区域左上角坐标["y1"]=473,["x2"]=2029, --需要识别区域右下角坐标["y2"]=561,["type"]="52", --打码类型,可在对应平台官网查询["username"]="user", --打码平台账号["password"]="password", --打码平台密码--选填参数["length"]=4, --打码长度["timeout"]=30, --超时时间["scale"]=50, --缩放比例,范围10 - 200,在某些待识别区域过大的时候可设置此参数};local ret = ocr.cloudOcrText(op);if ret.success thendialog(ret.text,0)elsedialog(ret.message,0)end--自动纠错local ocr = require "cloudOcr"; --载入扩展库local ret = ocr.cloudOcrText(op); --进行远程识别if ret.success thenret_1 = ocr.cloudOcrReportError(ret.id); --自动纠错,ret.id从ocr.cloudOcrText返回值中获取endlocal ocr = require "cloudOcr";local ver = ocr.version(); --获取扩展库版本号
注意事项:
- 最新云打码可在触动精灵 iOS v2.0 以上版本插件管理中下载安装,更加简单的方法 →建议使用 ocr 云打码扩展库。
- 打码函数传入的参数为 table 类型,使用时请参照参数表中详细说明。
- 如您使用火眼答题平台,用户名参数可以为空,密码串需要用户注册登陆后可以在火眼平台的后台查看到。。
- 帮你玩、小精灵使用此插件需自行将插件打包到脚本压缩包内或导入手机对应目录。
| 参数 | 类型 | 说明 |
|---|---|---|
| 参数 1 | string | 发送者邮件地址 |
| 参数 2 | string | 接收者邮件地址 |
| 参数 3 | string | 邮件主题 |
| 参数 4 | string | 邮件正文 |
| 参数 5 | string | SMTP 服务器 |
| 参数 6 | string | SMTP 鉴定用户名 |
| 参数 7 | string | SMTP 鉴定密码 |
脚本实例:
local mail = require "mail"a = mail.send("i.82@82flex.com", "357722984@qq.com", "Hello", "This is a test mail.", "smtp.mxhichina.com", "i.82@82flex.com", "***")if a == true then --发送成功dialog("Succeed!", 0)elsedialog(a, 0)end
注意事项:
- 扩展库下载地址:https://pan.baidu.com/s/1ggR16Kz 密码:h2is, 下载后将 mail.so 放入 /var/mobile/Media/TouchSprite/plugin 即可在脚本中引用。
- iOS 11 系统的设备,原 TouchSprite 文件夹下新增 plugin_ios11 快捷方式,连接到 usr/bin/tsplugin
- 如果系统是 iOS 11 则 tsp 自带 so 文件释放到该路径但 lua 文件释放路径保持不变
- 如果开发者想要手动导入 so 文件,也需要放到 usr/bin/tsplugin 目录下
Lua 配合 os.execute 命令,可以使用触动精灵对 iOS 设备进行注销、关机、重启、清空缓存、解压、移动、复制、删除文件、创建文件夹等系统操作
帮你玩平台禁用此函数。
--注销function respring()--帮你玩平台禁用此函数os.execute("killall -9 SpringBoard");end
--关机function poweroff()--帮你玩平台禁用此函数os.execute("halt");end
--重启function reboot()--帮你玩平台禁用此函数os.execute("reboot");end
--清空缓存function clearCache()--帮你玩平台禁用此函数os.execute("su mobile -c uicache");end
--删除文件function delFile(path)--帮你玩平台禁用此函数os.execute("rm -rf "..path);end
参数说明
| 参数 | 说明 |
|---|---|
| path | 要删除文件的路径,支持*通配符 |
脚本实例:
如要删除1.lua的文件,则输入:
delFile("/var/mobile/Media/TouchSprite/lua/1.lua");
--解压zip文件function unzip(path,to)--帮你玩平台禁用此函数os.execute("unzip "..path.." -d "..to);end
参数说明
| 参数 | 说明 |
|---|---|
| path | 为待解压文件的路径 |
| to | 要解压到的文件夹路径,默认不覆盖 |
脚本实例:
如要解压名为 1.zip 的文件,则输入:
unzip("/var/mobile/Media/TouchSprite/lua/1.zip","/var/mobile/Media/TouchSprite/lua/");
--移动文件function movefile(path,to)--帮你玩平台禁用此函数os.execute("mv "..path.." "..to);end
参数说明
| 参数 | 说明 |
|---|---|
| path | 待移动文件的路径,支持*通配符 |
| to | 要移动到的文件路径,注意先判断是否有重名文件或文件夹 |
脚本实例:
如要移动1.txt到lua/1.lua,则输入:
movefile("/var/mobile/Media/TouchSprite/lua/1.txt","/var/mobile/Media/TouchSprite/lua/1.lua");
--复制文件function copyfile(path,to)os.execute("cp -rf "..path.." "..to);end
参数说明
| 参数 | 说明 |
|---|---|
| path | 待复制文件的路径,支持*通配符 |
| to | 要复制到的文件路径,注意先判断是否有重名文件或文件夹。 |
脚本实例:
如要复制res/1.txt到lua/1.txt,则输入:
copyfile("/var/mobile/Media/TouchSprite/res/1.txt","/var/mobile/Media/TouchSprite/lua/1.txt");
--创建文件夹function newfolder(path)--帮你玩平台禁用此函数os.execute("mkdir "..path);end
参数说明
| 参数 | 说明 |
|---|---|
| path | 要创建文件夹的路径 |
脚本实例:
如要创建test文件夹,则输入:
newfolder("/var/mobile/Media/TouchSprite/lua/test");
-将指定文件中的内容按行读取function readFile(path)local file = io.open(path,"r");if file thenlocal _list = {};for l in file:lines() dotable.insert(_list,l)endfile:close();return _listendendlist = readFile(userPath().."/lua/main.lua");
参数说明
| 参数 | 说明 | 返回值 |
|---|---|---|
| path | 要读取文件的路径 | table |
--遍历文件function getList(path)local a = io.popen("ls "..path);local f = {};for l in a:lines() dotable.insert(f,l)enda:close()return fend
参数说明
| 参数 | 说明 | 返回值 |
|---|---|---|
| path | 要列举文件的文件夹的路径 | table |
脚本实例:
如要列举触动精灵lua文件夹下所有的脚本文件,则输入:
list = getList("/User/Media/TouchSprite/lua/");
--查找文件function findFile(path)local a = io.popen("find "..path.." -prune");local f = {};for l in a:lines() dotable.insert(f,l)enda:close()return fend
参数说明
| 参数 | 说明 | 返回值 |
|---|---|---|
| path | 要查找文件的路径,支持*通配符 | table |
脚本实例:
如要查找后缀为.lua的文件,则输入:
file = findFile("/User/Media/TouchSprite/lua/*.lua");
--检测指定文件是否存在function file_exists(file_name)local f = io.open(file_name, "r")return f ~= nil and f:close()end
参数说明
| 参数 | 说明 | 返回值 |
|---|---|---|
| path | 要查找文件的路径 | true/false |
脚本实例:
if file_exists("/User/Media/TouchSprite/lua/1.lua") thendialog("文件存在",0)elsedialog("文件不存在",0)end
函数名称:qrDecode
函数功能:将二维码图片解析为字符串,仅支持 Android v2.3.5.3 以上版本
| 参数 | 类型 | 说明 |
|---|---|---|
| path | string | 解析二维码图片的路径,支持 jpg,png 等格式 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| str | string | 解析二维码得到的字符串 |
脚本实例:
str =qrDecode(userPath().."/res/1.png")--"1.jpg"(如只填文件名,默认为图片在触动 res 目录下)dialog(str,0)
注意:
并不是所有二维码都可以解析,推荐使用
函数名称:qr.qrDecode
函数功能:将二维码图片解析为字符串,需要1.2.1及以上版本
| 参数 | 类型 | 说明 |
|---|---|---|
| path | string | 解析二维码图片的路径,支持jpg,png等格式 |
| 返回值 | 类型 | 说明 |
|---|---|---|
| str | string | 解析二维码得到的字符串 |
脚本实例:
local qr = require("tsqr")str = qr.qrDecode(userPath().."/res/1.png")--"1.jpg"(如只填文件名,默认为图片在触动res目录下)dialog(str,0)
- 本扩展库封装了大部分开发过程中需要的功能,适合有一定基础的开发者研究使用,使用得当可以以此开发出功能十分强大的脚本。
函数库开发手册地址:https://www.zybuluo.com/miniknife/note/671299
函数扩展库下载- 说明:此扩展库通用于 iOS/Android 平台。
为了进一步降低脚本开发者门槛,触动精灵iOS 2.x 以上版本集成了苏泽的扩展库,提供了一系列实用函数供开发者使用。
| 设备 | 标准模式分辨率(px) | 放大模式分辨率(px) |
|---|---|---|
| iPhone4(S)/iPod Touch4G | 640x960 | - |
| iPhone 5(S/C)/SE/iPod Touch5G(6G) | 640x1136 | - |
| iPhone 6(S)/7/8 | 750x1334 | 640x1136 |
| iPhone 6 P/6SP/7P/8P | 1242x2208 | 1125x2001 |
| iPhone X | 1125x2436 | - |
| iPad 1/2/mini | 768x1024 | - |
| TheNewiPad/iPad 4/Air/Air2 | 1536x2048 | - |
| iPad mini 2/mini 3/mini 4 | 1536x2048 | - |
| iPad Pro | 2048×2732 | - |
注意事项:
触动引擎使用的是逻辑分辨率而不是物理分辨率
| 函数名 | 描述 | 示例 | 结果 |
|---|---|---|---|
| pi | 圆周率 | math.pi | 3.1415926535898 |
| abs | 取绝对值 | math.abs(-2012) | 2012 |
| ceil | 向上取整 | math.ceil(9.1) | 10 |
| floor | 向下取整 | math.floor(9.9) | 9 |
| max | 取参数最大值 | math.max(2,4,6,8) | 8 |
| min | 取参数最小值 | math.min(2,4,6,8) | 2 |
| pow | 计算x的y次幂 | math.pow(2,16) | 65536 |
| sqrt | 开平方 | math.sqrt(65536) | 256 |
| modf | 取整数和小数部分 | math.modf(20.12) | 20 0.12 |
| randomseed | 设随机数种子 | math.randomseed(os.time()) | |
| random | 取随机数 | math.random(5,90) | 5 ~ 90 |
| rad | 角度转弧度 | math.rad(180) | 3.1415926535898 |
| deg | 弧度转角度 | math.deg(math.pi) | 180 |
| exp | e的x次方 | math.exp(4) | 54.598150033144 |
| log | 计算x的自然对数 | math.log(54.598150033144) | 4 |
| log10 | 计算10为底,x的对数 | math.log10(1000) | 3 |
| frexp | 将参数拆成 x * (2 ^ y) 的形式 | math.frexp(160) | 0.625 8 |
| ldexp | 计算x * (2 ^ y) | math.ldexp(0.625,8) | 160 |
| sin | 正弦 | math.sin(math.rad(30)) | 0.5 |
| cos | 余弦 | math.cos(math.rad(60)) | 0.5 |
| tan | 正切 | math.tan(math.rad(45)) | 1 |
| asin | 反正弦 | math.deg(math.asin(0.5)) | 30 |
| acos | 反余弦 | math.deg(math.acos(0.5)) | 60 |
| atan | 反正切 | math.deg(math.atan(1)) | 45 |
如果您安装了以下插件导致触动精灵服务使用异常,请在Cydia 中卸载该插件后重新安装客户端。
| 冲突插件 | 导致问题 |
|---|---|
| Stashing(内存修正插件) | 会导致帮你玩无法注册和登录账号,提示文件获取失败 |
| StatusHUD2 插件 | 会导致脚本showUI无法弹 |
| PS/易天行(伪装地理位置插件) | 会导致点击失效或服务无法启动 |
| CCSettings(修改美化控制中心插件) | 会导致脚本showUI无法弹出 |
| 协奏助手 | 会导致点击失效 |
| 按键精灵iOS | 会导致UI弹出后点击【取消】【确定】无反应 |
| xxplugin - coc/cok(xxplugin 系列插件) | 会导致点击失效或服务无法启动 |
| XY苹果助手 | 会导致点击失效或服务无法启动 |
| 键名 | 描述 | 键值 |
|---|---|---|
| KEYCODE_HOME | 按键Home | 3 |
| KEYCODE_BACK | 返回键 | 4 |
| KEYCODE_CALL | 拨号键 | 5 |
| KEYCODE_ENDCALL | 挂机键 | 6 |
| KEYCODE_VOLUME_UP | 音量增加键 | 24 |
| KEYCODE_VOLUME_DOWN | 音量减小键 | 25 |
| KEYCODE_POWER | 电源键 | 26 |
| KEYCODE_CAMERA | 拍照键 | 27 |
| KEYCODE_FOCUS | 拍照对焦键 | 80 |
| KEYCODE_MENU | 菜单键 | 82 |
| KEYCODE_NOTIFICATION | 通知键 | 83 |
| KEYCODE_SEARCH | 搜索键 | 84 |
| KEYCODE_MUTE | 话筒静音键 | 91 |
| KEYCODE_VOLUME_MUTE | 扬声器静音键 | 164 |
| 键名 | 描述 | 键值 |
|---|---|---|
| KEYCODE_DPAD_UP | 导航键 向上 | 19 |
| KEYCODE_DPAD_DOWN | 导航键 向下 | 20 |
| KEYCODE_DPAD_LEFT | 导航键 向左 | 21 |
| KEYCODE_DPAD_RIGHT | 导航键 向右 | 22 |
| KEYCODE_DPAD_CENTER | 导航键 确定键 | 23 |
| KEYCODE_TAB | Tab键 | 61 |
| KEYCODE_ENTER | 回车键 | 66 |
| KEYCODE_DEL | 退格键 | 67 |
| KEYCODE_PAGE_UP | 向上翻页键 | 92 |
| KEYCODE_PAGE_DOWN | 向下翻页键 | 93 |
| KEYCODE_ESCAPE | ESC键 | 111 |
| KEYCODE_FORWARD_DEL | 删除键 | 112 |
| KEYCODE_CAPS_LOCK | 大写锁定键 | 115 |
| KEYCODE_SCROLL_LOCK | 滚动锁定键 | 116 |
| KEYCODE_BREAK | Break/Pause键 | 121 |
| KEYCODE_MOVE_HOME | 光标移动到开始键 | 122 |
| KEYCODE_MOVE_END | 光标移动到末尾键 | 123 |
| KEYCODE_INSERT | 插入键 | 124 |
| KEYCODE_NUM_LOCK | 小键盘锁 | 143 |
| KEYCODE_ZOOM_IN | 放大键 | 168 |
| KEYCODE_ZOOM_OUT | 缩小键 | 169 |
| 键名 | 描述 | 键值 |
|---|---|---|
| KEYCODE_0 | 按键'0' | 7 |
| KEYCODE_1 | 按键'1' | 8 |
| KEYCODE_2 | 按键'2' | 9 |
| KEYCODE_3 | 按键'3' | 10 |
| KEYCODE_4 | 按键'4' | 11 |
| KEYCODE_5 | 按键'5' | 12 |
| KEYCODE_6 | 按键'6' | 13 |
| KEYCODE_7 | 按键'7' | 14 |
| KEYCODE_8 | 按键'8' | 15 |
| KEYCODE_9 | 按键'9' | 16 |
| KEYCODE_A | 按键'A' | 29 |
| KEYCODE_B | 按键'B' | 30 |
| KEYCODE_C | 按键'C' | 31 |
| KEYCODE_D | 按键'D' | 32 |
| KEYCODE_E | 按键'E' | 33 |
| KEYCODE_F | 按键'F' | 34 |
| KEYCODE_G | 按键'G' | 35 |
| KEYCODE_H | 按键'H' | 36 |
| KEYCODE_I | 按键'I' | 37 |
| KEYCODE_J | 按键'J' | 38 |
| KEYCODE_K | 按键'K' | 39 |
| KEYCODE_L | 按键'L' | 40 |
| KEYCODE_M | 按键'M' | 41 |
| KEYCODE_N | 按键'N' | 42 |
| KEYCODE_O | 按键'O' | 43 |
| KEYCODE_P | 按键'P' | 44 |
| KEYCODE_Q | 按键'Q' | 45 |
| KEYCODE_R | 按键'R' | 46 |
| KEYCODE_S | 按键'S' | 47 |
| KEYCODE_T | 按键'T' | 48 |
| KEYCODE_U | 按键'U' | 49 |
| KEYCODE_V | 按键'V' | 50 |
| KEYCODE_W | 按键'W' | 51 |
| KEYCODE_X | 按键'X' | 52 |
| KEYCODE_Y | 按键'Y' | 53 |
| KEYCODE_Z | 按键'Z' | 54 |
小米
- 设置 - (界面底部)其他应用管理 - 触动精灵 - 应用详情界面上滑 - (底部)权限管理 - 悬浮窗管理 - (弹出的底部菜单)选择允许
- 安全中心 - 授权管理 - 应用权限管理 - 小精灵名称 - 显示悬浮窗 - 开启
华为
- 设置 - 全部设置 - 隐私和安全- 通知管理 - 悬浮窗管理 - 小精灵名称 - 打开开关
-手机管家 - 悬浮窗管理 - 小精灵名称 - 开启悬浮窗
魅族魅蓝
- 设置 - (左侧栏)应用管理 - 小精灵名称 - 权限管理- 弹框消息一览 - 点击右侧按钮 - 按钮为绿色时为打开状态
-安全中心 - 授权管理 - 小精灵名称 - 悬浮窗 - 开启
OPPO
- 安全中心 - 权限隐私 - 应用权限管理 - 悬浮窗管理 - 小精灵名称 - 打开开关
乐视
- 管家 - 权限管理 - 应用权限管理 - 权限管理 - 小精灵名称 - 显示悬浮窗 - 开启
锤子坚果
- 安全中心 - 应用程序权限管理 - 其他 - 桌面悬浮窗 - 小精灵名称 - 打开开关
默认开启悬浮窗权限的手机
- 三星
- vivo
- 酷派
- 金立
| 参数 | 说明 |
|---|---|
| prefs:root=WIFI | WIFI |
| prefs:root=INTERNET_TETHERING | 个人热点 |
| prefs:root=MOBILE_DATA_SETTINGS_ID | 蜂窝设置 |
| prefs:root=Privacy | 隐私 |
| prefs:root=General&path | 通用 |
| prefs:root=LOCATION_SERVICES | 定位服务 |
| prefs:root=VPN | VPN |
| prefs:root=General&path=About | 关于 |
| prefs:root=General&path=ACCESSIBILITY | 辅助功能 |
| prefs:root=AIRPLANE_MODE | 飞行模式 |
| prefs:root=General&path=AUTOLOCK | 自动锁屏时间 |
| prefs:root=General&path=USAGE | 用量 |
| prefs:root=Brightness | 亮度 |
| prefs:root=General&path=Bluetooth | 蓝牙 |
| prefs:root=General&path=DATE_AND_TIME | 日期和时间 |
| prefs:root=FACETIME | Facetime设置 |
| prefs:root=General&path=Keyboard | 键盘设置 |
| prefs:root=CASTLE | Icloud |
| prefs:root=CASTLE&path=STORAGE_AND_BACKUP | 备份 |
| prefs:root=General&path=INTERNATIONAL | 语言与地区设置 |
| prefs:root=ACCOUNT_SETTINGS | 账户设置 |
| prefs:root=MUSIC | 音乐 |
| prefs:root=MUSIC&path=EQ | EQ均衡器 |
| prefs:root= | 设置 |
| prefs:root=NOTES | 备忘录 |
| prefs:root=NOTIFICATIONS_ID | 通知 |
| prefs:root=Phone | 电话设置 |
| prefs:root=Photos | 照片与相机设置 |
| prefs:root=General&path=Reset | 还原 |
| prefs:root=Sounds&path=Ringtone | 铃声设置 |
| prefs:root=Safari | Safari |
| prefs:root=Sounds | 声音 |
| prefs:root=General&path=SOFTWARE_UPDATE_LINK | 系统更新 |
| prefs:root=STORE | STORE设置 |
| prefs:root=VIDEO | 视频设置 |
| prefs:root=Wallpaper | 壁纸设置 |
| 按键码 | 说明 |
|---|---|
| "a" | a or A |
| "b" | b or B |
| "c" | c or C |
| "d" | d or D |
| "e" | e or E |
| "f" | f or F |
| "g" | g or G |
| "h" | h or H |
| "i" | i or I |
| "j" | j or J |
| "k" | k or K |
| "l" | l or L |
| "m" | m or M |
| "n" | n or N |
| "o" | o or O |
| "p" | p or P |
| "q" | q or Q |
| "r" | r or R |
| "s" | s or S |
| "t" | t or T |
| "u" | u or U |
| "v" | v or V |
| "w" | w or W |
| "x" | x or X |
| "y" | y or Y |
| "z" | z or Z |
| 按键码 | 说明 |
|---|---|
| "0" | 1 or ! |
| "1" | 2 or @ |
| "2" | 3 or # |
| "3" | 4 or $ |
| "4" | 5 or % |
| "5" | 6 or ^ |
| "6" | 7 or & |
| "7" | 8 or * |
| "8" | 9 or ( |
| "9" | 0 or ) |
| 按键码 | 说明 |
|---|---|
| "Hyphen" | - or _ |
| "EqualSign" | = or + |
| "OpenBracket" | [ or { |
| "CloseBracket" | ] or } |
| "Backslash" | \ or l |
| "NonUSPound" | Non-US # or _ |
| "Semicolon" | ; or : |
| "Quote" | ' or " |
| "GraveAccentAndTilde" | Grave Accent and Tilde |
| "Comma" | , or < |
| "Period" | . or > |
| "Slash" | / or ? |
"ReturnOrEnter" /* Return (Enter) */"Escape" /* Escape */"DeleteOrBackspace" /* Delete (Backspace) */"Tab" /* Tab */"Spacebar" /* Spacebar */"CapsLock" /* Caps Lock */"F1" /* F1 */"F2" /* F2 */"F3" /* F3 */"F4" /* F4 */"F5" /* F5 */"F6" /* F6 */"F7" /* F7 */"F8" /* F8 */"F9" /* F9 */"F10" /* F10 */"F11" /* F11 */"F12" /* F12 */"PrintScreen" /* Print Screen */"ScrollLock" /* Scroll Lock */"Pause" /* Pause */"Insert" /* Insert */"Home" /* Home */"PageUp" /* Page Up */"DeleteForward" /* Delete Forward */"End" /* End */"PageDown", /* Page Down */"RightArrow" /* Right Arrow */"LeftArrow" /* Left Arrow */"DownArrow" /* Down Arrow */"UpArrow" /* Up Arrow */"KeypadNumLock" /* Keypad NumLock or Clear */"KeypadSlash" /* Keypad / */"KeypadAsterisk" /* Keypad * */"KeypadHyphen" /* Keypad - */"KeypadPlus" /* Keypad + */"KeypadEnter" /* Keypad Enter */"Keypad1" /* Keypad 1 or End */"Keypad2" /* Keypad 2 or Down Arrow */"Keypad3" /* Keypad 3 or Page Down */"Keypad4" /* Keypad 4 or Left Arrow */"Keypad5" /* Keypad 5 */"Keypad6" /* Keypad 6 or Right Arrow */"Keypad7" /* Keypad 7 or Home */"Keypad8" /* Keypad 8 or Up Arrow */"Keypad9" /* Keypad 9 or Page Up */"Keypad0" /* Keypad 0 or Insert */"KeypadPeriod" /* Keypad . or Delete */"NonUSBackslash" /* Non-US \ or | */"Application" /* Application */"Power" /* Power */"EqualSign" /* Keypad = */"F13" /* F13 */"F14" /* F14 */"F15" /* F15 */"F16" /* F16 */"F17" /* F17 */"F18" /* F18 */"F19" /* F19 */"F20" /* F20 */"F21" /* F21 */"F22" /* F22 */"F23" /* F23 */"F24" /* F24 */"Execute" /* Execute */"Help" /* Help */"Menu" /* Menu */"Select" /* Select */"Stop" /* Stop */"Again" /* Again */"Undo" /* Undo */"Cut" /* Cut */"Copy" /* Copy */"Paste" /* Paste */"Find" /* Find */"Mute" /* Mute */"VolumeUp" /* Volume Up */"VolumeDown" /* Volume Down */"LockingCapsLock" /* Locking Caps Lock */"LockingNumLock" /* Locking Num Lock */"LockingScrollLock" /* Locking Scroll Lock */"Comma" /* Keypad Comma */"EqualSignAS400", /* Keypad Equal Sign for AS/400 */"International1", /* International1 */"International2", /* International2 */"International3", /* International3 */"International4", /* International4 */"International5", /* International5 */"International6", /* International6 */"International7", /* International7 */"International8", /* International8 */"International9", /* International9 */"LANG1" /* LANG1 */"LANG2" /* LANG2 */"LANG3" /* LANG3 */"LANG4" /* LANG4 */"LANG5" /* LANG5 */"LANG6" /* LANG6 */"LANG7" /* LANG7 */"LANG8" /* LANG8 */"LANG9" /* LANG9 */"AlternateErase" /* AlternateErase */"SysReqOrAttention" /* SysReq/Attention */"Cancel" /* Cancel */"Clear" /* Clear */"Prior" /* Prior */"Return" /* Return */"Separator" /* Separator */"Out" /* Out */"Oper" /* Oper */"ClearOrAgain" /* Clear/Again */"CrSelOrProps" /* CrSel/Props */"ExSel" /* ExSel */"LeftControl" /* Left Control */"LeftShift" /* Left Shift */"LeftAlt" /* Left Alt */"LeftGUI" /* Left GUI */"RightControl" /* Right Control */"RightShift" /* Right Shift */"RightAlt" /* Right Alt */"RightGUI" /* Right GUI */"ErrorRollOver", /* ErrorRollOver */"POSTFail", /* POSTFail */"ErrorUndefined", /* ErrorUndefined */