叉叉开发文档

mac2026-05-22  5

@xxzhushou 2019-04-03 14:50 字数 66259 阅读 400563

叉叉脚本开发手册

叉叉脚本

引擎版本:1.9.314

 

叉叉脚本开发手册 前言开发文件夹路径 本地脚本存放路径公共文件夹路径截图存放路径日志文件路径脚本开发实用技巧(持续更新)叉叉脚本定制版发布指引iOS免越狱接口说明:适配免越狱引擎必读函数:init 初始化函数:touchDown 触摸按下函数:touchMove 移动函数:touchUp 触摸抬起函数:catchTouchPoint 获取用户点击坐标函数:findColor 区域多点找色(推荐使用)函数:findColors 高级区域多点找色(推荐使用)函数:findColorInRegionFuzzy 模糊区域找色(推荐使用findColor代替)函数:findMultiColorInRegionFuzzy 区域多点找色(推荐使用findColor代替)函数:findMultiColorInRegionFuzzy2 区域多点找色(推荐使用findColor代替)函数:findMultiColorInRegionFuzzyExt 高级区域多点找色(推荐使用findColors代替)函数:findMultiColorInRegionFuzzyExt2 高级区域多点找色(推荐使用findColors代替)函数:getColor 获取屏幕某点颜色值函数:getColorRGB 获取颜色RGB值函数:findImageInRegionFuzzy 模糊区域找图函数:snapshot 截图函数:keepScreen 保持屏幕函数:inputText 输入字符串函数:createOcrDict 加载自定义的点阵字库函数:ocrText 文字点阵化识别函数:createOCR 载入高级文字识别字库(集成tesserOCR)函数:ocr:getText 高级文字识别函数:ocr:release 释放字库函数:binarizeImage 二值化图片转换为table函数:runApp 运行应用函数:closeApp 关闭应用函数:appIsRunning 检测应用是否运行函数:isFrontApp 判断是否为前台应用函数:frontAppName 获取前台应用识别ID函数:showUI 自定义脚本界面 脚本界面说明函数:getUIContent 获取UI文件信息函数:resetUIConfig 重置UI默认选项函数:getScreenSize 获取屏幕分辨率函数:setScreenScale 设置屏幕缩放函数:mTime 获取Unix时间戳函数:getNetTime 获取网络时间函数:pressHomeKey 模拟主屏幕按键函数:doublePressHomeKey 双击HOME键函数:pressKey 导航栏按键函数:setWifiEnable 设置无线局域网开关函数:setAirplaneMode 设置飞行模式开关函数:setBTEnable 设置蓝牙开关函数:lockDevice 锁定设备函数:unlockDevice 解锁设备函数:deviceIsLock 设备锁定状态函数:vibrator 手机振动函数:resetIDLETimer 重置锁屏时间函数:resetScreenScale 取消屏幕缩放函数:playAudio 播放音频函数:stopAudio 停止播放音频函数:setTimer 规定时间之后调用指定函数函数:setSysConfig 设置系统参数函数:mSleep 延时函数:toast 提示函数:dialog 提示框函数:dialogRet 带按钮的对话框函数:dialogInput 带参数的对话框函数:sysLog 系统日志函数:fileLogWrite 输出日志到文件函数:getCloudContent 获取云端自定义公告函数:setStringConfig 存字符串函数:getStringConfig 取字符串函数:setNumberConfig 存入数值函数:getNumberConfig 读取数值函数:readPasteboard 读取剪贴板函数:writePasteboard 写入剪贴板函数:lua_exit 退出脚本执行函数:lua_restart 重载脚本函数:onBeforeUserExit 脚本运行终止回调函数:getEngineVersion 获取脚本引擎的版本号函数:getOSType 获取系统类型函数:isPrivateMode 获取系统环境类型函数:getSystemProperty 获取系统常量属性函数:getLocalInfo 获取当前系统语言属性函数:getUserID 获取用户ID函数:getScriptID 获取脚本ID函数:getScreenDPI 获取当前设备屏幕DPI函数:getDeviceIMEI 获取当前设备IMEI码函数:getDeviceIMSI 获取当前设备IMSI码函数:getDeviceUUID 获取当前设备UUID函数:getBatteryLevel 获取电池状态函数:getScreenDirection 获取屏幕方向函数:getUserCredit 获取用户付费类型和套餐剩余时间函数:getRuntimeMode 获取脚本运行模式(安卓专用)函数:getProduct 获取当前运行产品函数:createHUD 创建HUD内容函数:showHUD 显示HUD内容函数:hideHUD 隐藏HUD内容函数:asyncExec 异步网络请求函数:setUIOrientation 设置UI方向和HUD方向badboy开源工具库JSON模块StringUtils模块UI模块POS模块utils模块LuaSocket模块 DNShttpGet请求httpPost请求挂载代理以socket的方式访问smtp方法发送email实现获取网络时间统计毫秒精度时间FTP 测试取色器使用说明

 

前言

  叉叉脚本使用 Lua 语言进行编写,支持Lua的所有语法与基本函数,配合叉叉脚本特有的函数命令,实现找图、找色、触摸等高级功能。   编写脚本前请先学习 lua 的基本语法。   Lua官方手册:http://www.lua.org/manual/5.1/   Lua中文开发手册:http://book.luaer.cn/   叉叉开发者平台:http://dev.xxzhushou.cn/特别注意:

1.由于安全性方面的考虑,以下函数在叉叉脚本中不予以支持: debub库所有函数、io.tmpfile、io.popen、os.execute、os.exit、os.remove、os.rename、os.tmpname 2.io.open的用法比较特殊,参数中不能填写具体路径,只能是文件名,比如: io.open('aa.txt') 是正确的,io.open('../../../aa.txt')则运行会报错。 另外,io库支持公共文件夹,比如io.input('[public]xx.txt'),就会在[tengine]/public下读取xx.txt这个文件。

脚本文件格式支持说明:

 叉叉助手/IPA精灵开发助手说明生成方式xsp0不支持支持主要用于开发调试,没有加密处理IDE生成或者打包工具xsp1支持支持主要用于不开源的脚本免费分享,有加密处理上传后台直接加密xsp2支持不支持在国内开发者平台上架后,下载到叉叉助手,动态加密在用户下载时生成 xsp0 文件包复制到移动设备对应开发助手脚本存放目录中,进入开发助手客户端“本地脚本”列表即可运行保存好的脚本xsp1 文件包复制到移动设备对应叉叉助手存放目录中,进入叉叉客户端“我的”tab启动应用,打开悬浮窗即可运行保存好的脚本

 *iOS可使用ifunbox等工具将脚本文件复制到设备

开发文件夹路径

本地脚本存放路径

开发助手 Android:/sdcard/xsp/ iOS(开发助手版本>= 1.0.10):/var/mobile/Library/XXIDEHelper/xsp/ iOS(开发助手版本<1.0.10):/Library/ApplicationSupport/XXIDEHelper/xsp/

叉叉助手 Android:/sdcard/com.xxAssistant/script/ iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/LocalLuas/ iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/LocalLuas/

IPA精灵 IPA精灵:应用文件夹/Documents/Lua/LocalLuas

公共文件夹路径

开发助手 Android(引擎版本>=1.7.2):/data/data/com.xxscript.idehelper/tengine/public Android(引擎版本<1.7.2):/data/data/com.xxscript.idehelper/cache/tengine/public iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp/public iOS(开发助手版本<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp/public

叉叉助手 Android(引擎版本>=1.7.2):/data/data/com.xxAssistant/tengine/public Android(引擎版本<1.7.2):/data/data/com.xxAssistant/cache/tengine/public iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/Luas/Temp/public iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/Luas/Temp/public

IPA精灵 IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/public

截图存放路径

开发助手 Android(引擎版本>=1.7.2):/data/data/com.xxscript.idehelper/tengine/public Android(引擎版本<1.7.2):/data/data/com.xxscript.idehelper/cache/tengine/public iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp iOS(开发助手<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp

叉叉助手 Android(引擎版本>=1.7.2):/data/data/com.xxAssistant/tengine/public Android(引擎版本<1.7.2):/data/data/com.xxAssistant/cache/tengine/public iOS(叉叉版本>=2.5.0):/var/mobile/Library/XXAssistant/Lua/Luas/Temp iOS(叉叉版本<2.5.0):/Library/Application Support/XXAssistant/Lua/Luas/Temp

IPA精灵 IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/

日志文件路径

开发助手 Android:/sdcard/com.xxscript.idehelper/tengine/log/user/脚本名.log iOS:/tmp/user/脚本名.log

叉叉助手 Android:/sdcard/com.xxAssistant/tengine/log/user/脚本id.log Android免Root:/sdcard/com.noroot/tengine/log/user/脚本id.log iOS:/tmp/user/脚本id.log

叉叉小精灵 Android:/sdcard/小精灵包名/tengine/log/user/脚本id.log

IPA精灵 IPA精灵:应用文件夹/Document/Temp/脚本id.log IPA精灵(开发版):应用文件夹/Document/Temp/脚本名.log

脚本开发实用技巧(持续更新)

戳这里:https://www.zybuluo.com/xxzhushou/note/726742

叉叉脚本定制版发布指引

戳这里:https://www.zybuluo.com/xxzhushou/note/755911

iOS免越狱接口说明:适配免越狱引擎必读

API接口支持状态说明isPrivateMode新增返回值1、0;1-越狱/root环境;0-免越狱/免root环境;runApp 运行应用不支持无效,返回非0closeApp 关闭应用不支持无效,无返回值setWifiEnable 设置无线局域网开关不支持无效,返回falsesetAirplaneMode 设置飞行模式开关不支持无效,返回falsesetBTEnable 设置蓝牙开关不支持无效,返回falselockDevice 锁定设备不支持无效,无返回值unlockDevice 解锁设备不支持无效,无返回值deviceIsLock 设备锁定状态不支持无效,返回0-回未锁定pressHomeKey 模拟主屏幕按键不支持无效,无返回值doublePressHomeKey 双击HOME键不支持无效,无返回值appIsRunning 检测应用是否运行支持,有修改参数包名是该游戏返回1-目标应用运行中,否则返回0-目标应用未运行isFrontApp 判断是否为前台应用支持,有修改参数包名是该游戏返回1-在前台,否则返回0-不在前台frontAppName 获取前台应用识别ID支持,有修改只能返回重打包游戏的包名其他接口支持 

函数:init 初始化

函数功能:脚本使用触摸函数前必须调用,以指定应用程序以及坐标系函数语法:   init(appid, rotate)

参数说明:

参数类型说明appid文本型目标程序的应用ID,当填写"0"时,自动使用当前运行的应用rotate整数型屏幕方向,0 - 竖屏, 1 - Home键在右边, 2 - Home键在左边

返回值:无

脚本实例:

  init("com.apple.Music", 0); --以应用 "com.apple.Music" 竖屏初始化init("0", 1); --以当前应用 Home 键在右初始化

函数:touchDown 触摸按下

函数功能:发送触摸事件函数语法:   touchDown(index, x, y)

参数说明:

参数类型说明index整数型手指序号,用于多点触控中标记多只手指,分别控制它们的移动x,y整数型屏幕坐标

返回值:无

脚本实例:

点击和抬起   touchDown(1, 150, 150) --ID为1的手指在坐标(150,150)处按下mSleep(200) --延时200毫秒touchUp(1, 150, 150) --ID为1的手指抬起 封装点击函数   function tap(x, y)touchDown(0, x, y);mSleep(200);touchUp(0, x, y);endtap(100,100); --调用:点击坐标为100,100的点

注意事项:

需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。

函数:touchMove 移动

函数功能:发送触摸事件函数语法:   touchMove(index, x, y)

参数说明:

参数类型说明index整数型手指序号,用于多点触控中标记多只手指,分别控制它们的移动x,y整数型屏幕坐标

返回值:无

脚本实例:

连续划动   touchDown(1, 150, 550); --在 (150, 550) 按下for i = 0, 200, 10 do --使用for循环连续滑动touchMove(1, 150 + i, 550); mSleep(150); --延迟endtouchUp(1, 150 + 200, 550); --在 (350, 550) 抬起 多点触控   touchDown(1, 100, 100); --ID为1的手指在 (100, 100) 按下touchDown(2, 300, 500); --ID为2的手指在 (300, 500) 按下mSleep(50);for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离touchMove(1, 200 - i, 400 - i); touchMove(2, 300 + i, 500 + i);mSleep(50);endtouchUp(1, 200 - 100, 400 - 100); touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指

注意事项:

需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。

函数:touchUp 触摸抬起

函数功能:发送触摸事件函数语法:   touchUp(index, x, y)

参数说明:

参数类型说明index整数型手指序号,用于多点触控中标记多只手指,分别控制它们的移动x,y整数型屏幕坐标

返回值:无

脚本实例:

连续划动   touchDown(1, 150, 550); --在 (150, 550) 按下for i = 0, 200, 10 do --使用for循环连续滑动touchMove(1, 150 + i, 550); mSleep(150); --延迟endtouchUp(1, 150 + 200, 550); --在 (350, 550) 抬起 多点触控   touchDown(1, 100, 100); --ID为1的手指在 (100, 100) 按下touchDown(2, 300, 500); --ID为2的手指在 (300, 500) 按下mSleep(50);for i = 1, 100, 1 do --使用 for 循环使两只手指向不同方向分离touchMove(1, 200 - i, 400 - i); touchMove(2, 300 + i, 500 + i);mSleep(50);endtouchUp(1, 200 - 100, 400 - 100); touchUp(2, 300 + 100, 500 + 100); --分别抬起2只手指

注意事项:

需要注意的是在使用 touchDown、touchUp 函数时,中间一定要插入一定的延时,建议大于 20毫秒,否则可能会出现点击无效等异常情况。

函数:catchTouchPoint 获取用户点击坐标

函数功能:调用该函数后,将等待用户完成一次或多次屏幕点击,并返回点击的坐标函数语法:   results = catchTouchPoint(touchCount)   x,y = catchTouchPoint()

参数说明:

参数类型说明touchCount整数型所需获取的 点/坐标 个数 返回值类型说明x,y整数型单次点击时,返回该点击对应的屏幕坐标resultstable型当touchCount参数有效时,将返回一个包含所有点击坐标的table

脚本实例:

获取单个点击坐标   dialog("请点击屏幕一次", 0);x,y = catchTouchPoint();mSleep(1000);dialog("x:"..x.." y:"..y, 0); 获取多个点击坐标   local results = catchTouchPoint(3);for i = 1, #results dosysLog("第"..i.."个坐标为:"..i..",x="..results[i].x..",y="..results[i].y);end

注意事项:

1.此函数触发后将一直等待用户完成屏幕点击,并阻止脚本继续运行。 2.此函数获取到的坐标为竖屏坐标,横屏情况需要自行转换。 3.此函数有较小的延迟,连续点击时,请勿点击过快。

函数:findColor 区域多点找色(推荐使用)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找函数语法:     x, y = findColor(      {left, top, right, bottom},      color0,      degree,      hdir,      vdir,      priority     )          x, y = findColor(      {left, top, right, bottom},      "x0|y0|color0,x1|y1|color1(|degree1),x2|y2|color2(-offset2),...",      degree,      hdir,      vdir,      priority     )          x, y = findColor(      {left, top, right, bottom},      {       {x = x0, y = y0, color = color0},       {x = x1, y = y1, color = color1, (degree = degree1)},       {x = x2, y = y2, color = color2, (offset = offset2)},       ...      },      degree,      hdir,      vdir,      priority     )

参数说明:

参数类型说明left, top整数型[必填]寻找区域左上角顶点屏幕坐标right, bottom整数型[必填]寻找区域右下角顶点屏幕坐标x0,y0整数型[必填]起始点坐标值,填写0,0时使用相对坐标体系,填写非0坐标则根据所填绝对坐标换算color0整数型[必填]起始点颜色的十六进制颜色值x1,y1整数型[选填]偏移位置的坐标值color1整数型[选填]偏移位置需要匹配颜色的十六进制颜色值degree1整数型[选填]偏移位置找色精度,范围:1 ~ 100,当是100时为完全匹配offset1整数型[选填]偏移位置找色偏色值,十六进制颜色值,当是000000时为完全匹配degree整数型[必填]全局找色精度,范围:1 ~ 100,当是100时为完全匹配hdir整数型[选填]水平搜索方向,0表示从左到右,1表示从右到左,默认为0vdir整数型[选填]垂直搜索方向,0表示从上到下,1表示从下到上,默认为0priority整数型[选填]搜索优先级,0表示水平优先,1表示垂直优先,默认为0

说明: 1.起始点坐标值填写0,0时,偏移位置坐标值使用相对坐标;填写为非0,0的坐标时,则认为偏移位置坐标为绝对坐标,找色时,将根据填写的绝对坐标换算出的相对坐标进行寻找。 2.偏移位置颜色的偏色值或精度可任意选用,同时填写了偏色值和精度时,将以偏色为准,忽略精度值。 3.个别偏移位置颜色偏色值或精度优先于全局找色精度,全局找色精度对未指定偏色或精度的颜色有效。

返回值类型说明x,y整数型找到的点坐标,如未找到则返回 -1,-1

脚本实例:

精确寻找指定单色的坐标   x, y = findColor({50, 50, 300, 300},0x112233)if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点touchDown(1, x, y); --点击该点mSleep(50)touchUp(1, x, y);else --如找不到符合条件的点dialog("没找到你要的坐标呢",0);end

使用以上方法找色时,常常会因为屏幕上有大量符合指定颜色的点而不能找到需要的坐标。该函数通过在寻找到一个符合指定颜色color的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的样式是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。

首先确定一个参照点: 颜色为 0x181F85,坐标为 (268, 802),下表序号1。 记录下来,继续寻找周边的几个参照点,以及与第一个参照点的相对坐标,分别为下表序号2~4:

现在我们找到了需要的所有参照点:

序号颜色坐标相对坐标10x181F85(268, 802)(0, 0)20x00BBFE(297, 803)(29, 1)30x0B6BBE(371, 798)(103, -4)40x150972(333, 811)(65, 9)

应用上述坐标写成多点找色脚本(以下4种任选1种):

相对坐标的写法:   x, y = findColor({0, 0, 639, 959},"0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-0x050505,65|9|0x150972") x, y = findColor({0, 0, 639, 959},{{x = 0, y = 0, color = 0x181F85},{x = 29, y = 1, color = 0x00BBFE, degree = 90},{x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},{x = 65, y = 9, color = 0x150972}}) 绝对坐标的写法:   x, y = findColor({0, 0, 639, 959},"268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972") x, y = findColor({0, 0, 639, 959},{{x = 268, y = 802, color = 0x181F85},{x = 297, y = 803 color = 0x00BBFE, degree = 90},{x = 371, y = 798 color = 0x0B6BBE, offset = 0x050505},{x = 333, y = 811 color = 0x150972}})

新旧多点找色API对比:

  findColorInRegionFuzzy = function(tcolor, degree, x1, y1, x2, y2, hdir, vdir)return findColor({x1, y1, x2, y2},tcolor,degree,hdir or 0,vdir or 0)end findMultiColorInRegionFuzzy = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)return findColor({x1, y1, x2, y2},posandcolors,degree,hdir or 0,vdir or 0)end findMultiColorInRegionFuzzy2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})return findColor({x1, y1, x2, y2},posandcolors,degree,hdir or 0,vdir or 0)end

关于搜索方向:

hdirvdirpriority区域搜索路径000左上角  右上角  左下角  右下角001左上角  左下角  右上角  右下角010左下角  右下角  左上角  右上角011左下角  左上角  右下角  右上角100右上角  左上角  右下角  左下角101右上角  右下角  左上角  左下角110右下角  左下角  右上角  左上角111右下角  右上角  左下角  左上角

注意事项:

1.未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。 2.该代码应用过程中,建议使用"保持屏幕"优化找色速度。 3.颜色值的十六进制文本中,其顺序为RGB。 4.相对坐标为偏移位置坐标相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。 5.使用此函数时精度参数设置过低或允许的偏色多大,会导致性能大幅下降。 6.支持引擎版本:1.8.30或更新

函数:findColors 高级区域多点找色(推荐使用)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找函数语法:   point = findColors(    {left, top, right, bottom},    color0,    degree,    hdir,    vdir,    priority,   )      point = findColors(    {left, top, right, bottom},    "x0|y0|color0,x1|y1|color1(|degree1),x2|y2|color2(-offset2),...",    degree,    hdir,    vdir,    priority,   )      point = findColors(    {left, top, right, bottom},    {    {x = x0, y = y0, color = color0},    {x = x1, y = y1 color = color1, (degree = degree1)},    {x = x2, y = y2 color = color2, (offset = offset2)},    ...    },    degree,    hdir,    vdir,    priority,   )

参数说明:

参数类型说明left, top整数型[必填]寻找区域左上角顶点屏幕坐标right, bottom整数型[必填]寻找区域右下角顶点屏幕坐标x0,y0整数型[必填]起始点坐标值,填写0,0时使用相对坐标体系,填写非0坐标则根据所填绝对坐标换算color0整数型[必填]起始点颜色的十六进制颜色值x1,y1整数型[选填]偏移位置的坐标值color1整数型[选填]偏移位置需要匹配颜色的十六进制颜色值degree1整数型[选填]偏移位置找色精度,范围:1 ~ 100,当是100时为完全匹配offset1整数型[选填]偏移位置找色偏色值,十六进制颜色值,当是000000时为完全匹配degree整数型[必填]全局找色精度,范围:1 ~ 100,当是100时为完全匹配hdir整数型[选填]水平搜索方向,0表示从左到右,1表示从右到左,默认为0vdir整数型[选填]垂直搜索方向,0表示从上到下,1表示从下到上,默认为0priority整数型[选填]搜索优先级,0表示水平优先,1表示垂直优先,默认为0

说明: 1.起始点坐标值填写0,0时,偏移位置坐标值使用相对坐标;填写为非0,0的坐标时,则认为偏移位置坐标为绝对坐标,找色时,将根据填写的绝对坐标换算出的相对坐标进行寻找。 2.偏移位置颜色的偏色值或精度可任意选用,同时填写了偏色值和精度时,将以偏色为准,忽略精度值。 3.个别偏移位置颜色偏色值或精度优先于全局找色精度,全局找色精度对未指定偏色或精度的颜色有效。

返回值类型说明pointtable类型以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为key-value的形式,如下: point = {  {x = 100,y = 110},  {x = 200,y = 210},  {x = 300,y = 310},  ... }

脚本实例:

  point = findColors({0, 0, 639, 959}, 0x181F85)if #point ~= 0 then --如果找到符合条件的点for var = 1, #point dosysLog(point[var].x..":"..point[var].y)endend point = findColors({0, 0, 639, 959},"0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-050505,65|9|0x150972")if #point ~= 0 then --如果找到符合条件的点for var = 1, #point dosysLog(point[var].x..":"..point[var].y)endend 相对坐标的写法:   point = findColors({0, 0, 639, 959},{{x = 0, y = 0, color = 0x181F85},{x = 29, y = 1, color = 0x00BBFE, degree = 90},{x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},{x = 65, y = 9, color = 0x150972}}) 绝对坐标的写法:   point = findColors({0, 0, 639, 959},"268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972") point = findColors({0, 0, 639, 959},{{x = 268, y = 802, color = 0x181F85},{x = 297, y = 803, color = 0x00BBFE, degree = 90},{x = 371, y = 798, color = 0x0B6BBE, offset = 0x050505},{x = 333, y = 811, color = 0x150972}})

新旧高级多点区域找色API对比:

  findMultiColorInRegionFuzzyExt = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)return findColors({x1, y1, x2, y2},posandcolors,degree,hdir or 0,vdir or 0)end findMultiColorInRegionFuzzyExt2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})return findColors({x1, y1, x2, y2},posandcolors,degree,hdir or 0,vdir or 0)end

注意事项:

1.高级区域多点找色函数目前最多支持返回99个。 2.支持引擎版本:1.8.30或更新

函数:findColorInRegionFuzzy 模糊区域找色(推荐使用findColor代替)

函数功能:在指定区域中,寻找符合指定颜色的坐标,模糊查找。(请使用findColor函数代替)函数语法:   x, y = findColorInRegionFuzzy(color, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数类型说明color整数型将要找的十六进制颜色值degree整数型寻找精度,范围:1 ~ 100,当是100时为完全匹配x1,y1整数型欲寻找的区域左上角顶点屏幕坐标x2,y2整数型欲寻找的区域右下角顶点屏幕坐标hdir整数型水平搜索方向,0表示从左到右,1表示从右到左,默认为0vdir整数型垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 返回值类型说明x,y整数型找到的点坐标,如未找到则返回 -1,-1

脚本实例:

精确寻找指定颜色的坐标   x, y = findColorInRegionFuzzy(0x112233, 100, 50, 50, 300, 300); if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点touchDown(1, x, y); --点击该点mSleep(50)touchUp(1, x, y);else --如找不到符合条件的点dialog("没找到你要的坐标呢",0);end 模糊查找接近指定颜色的坐标   for deg = 100, 70, -1 do --使用 for 循环不断降低精确度x, y = findColorInRegionFuzzy(0xffffff, deg, 50, 50, 300, 300); if x ~= -1 and y ~= -1 then --如指定区域找到符合条件的某点touchDown(1, x, y); --点击该点mSleep(50)touchUp(1, x, y);break; --跳出循环endenddialog("噢天哪!还是没找到",0);

注意事项:

1.未找到则返回 (-1, -1) ,所以找到时 x, y 均不等于 -1,~= 为不等于操作符,是 Lua 基本语法, 属于逻辑控制。 2.该代码应用过程中,建议使用"保持屏幕"优化找色速度。

函数:findMultiColorInRegionFuzzy 区域多点找色(推荐使用findColor代替)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找。(请使用findColor函数代替)函数语法:   x, y = findMultiColorInRegionFuzzy(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数类型说明color整型欲寻找的参照点颜色posandcolor文本型周边点颜色参数degree整数型寻找精度,范围:1 ~ 100,当是100时为完全匹配x1, y1整数型欲寻找的区域左上角顶点屏幕坐标x2,y2整数型欲寻找的区域右下角顶点屏幕坐标hdir整数型水平搜索方向,0表示从左到右,1表示从右到左,默认为0vdir整数型垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 返回值类型说明x, y整数型返回符合条件的参照点的坐标,如未找到则返回 -1,-1

脚本实例: 使用“区域模糊找色”函数时,常常会因为屏幕上有大量符合指定颜色的点而不能找到需要的坐标。该函数通过在寻找到一个符合指定颜色color的坐标后,进一步确认其周边点坐标的方式,来确定准确目标。例如,现在我们在图像上找到了我们需要的一个按钮,这个按钮的样式是不变的,但是它的整体位置却会在整个屏幕上变化,现在我们想要在脚本运行时得到其坐标。

首先确定一个参照点: 颜色为 0x181F85,坐标为 (268, 802),下表序号1。 记录下来,继续寻找周边的几个参照点,以及与第一个参照点的相对坐标,分别为下表序号2~4:

现在我们找到了需要的所有参照点:

序号颜色坐标相对坐标10x181F85(268, 802)(0, 0)20x00BBFE(297, 803)(29, 1)30x0B6BBE(371, 798)(103, -4)40x150972(333, 811)(65, 9)

应用上述坐标写成多点找色脚本:

多点找色   x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE,103|-4|0x0B6BBE,65|9|0x150972", 100, 0, 0, 639, 959);

注意事项:

1.posandcolor 参数中的坐标为相对坐标。 2.颜色值的十六进制文本中,其顺序为RGB。 3.相对于第一个点的坐标,即用这个点的横坐标、纵坐标分别减去第一个点的横坐标、纵坐标,可以为负数。 4.使用此函数时精度参数设置过低,会导致性能大幅下降。

函数:findMultiColorInRegionFuzzy2 区域多点找色(推荐使用findColor代替)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找符合条件的点的坐标,支持模糊查找。(请使用findColor函数代替)函数语法:   x, y = findMultiColorInRegionFuzzy2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数类型说明color整型欲寻找的参照点颜色posandcolortable型周边点颜色参数degree整数型寻找精度,范围:1 ~ 100,当是100时为完全匹配x1, y1整数型欲寻找的区域左上角顶点屏幕坐标x2,y2整数型欲寻找的区域右下角顶点屏幕坐标hdir整数型水平搜索方向,0表示从左到右,1表示从右到左,默认为0vdir整数型垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 返回值类型说明x, y整数型返回符合条件的参照点的坐标,如未找到则返回 -1,-1

脚本实例: 该函数是区域多点找色函数findMultiColorInRegionFuzzy的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。

  x, y = findMultiColorInRegionFuzzy2(0x181F85, {{x=29, y=1, color=0x00BBFE},{x=103,y=- 4,color=0x0B6BBE},{x=65,y=9,color=0x150972}}, 100, 0, 0, 639, 959)

函数:findMultiColorInRegionFuzzyExt 高级区域多点找色(推荐使用findColors代替)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找函数语法:   point = findMultiColorInRegionFuzzyExt(color, posandcolor, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数类型说明color整型欲寻找的参照点颜色posandcolor文本型周边点颜色参数degree整数型寻找精度,范围:1 ~ 100,当是100时为完全匹配x1, y1整数型欲寻找的区域左上角顶点屏幕坐标x2,y2整数型欲寻找的区域右下角顶点屏幕坐标hdir整数型水平搜索方向,0表示从左到右,1表示从右到左,默认为0vdir整数型垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 返回值类型说明pointtable类型以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为key-value的形式,如下: table = { {x = 100,y = 110}, {x = 200,y = 210}, {x = 300,y = 310}, ... }

脚本实例:

  point = findMultiColorInRegionFuzzyExt(0xcf0000,"-37|3|0x942814,-38|20|0xeba62d,1|54|0xf2b054,28|22|0x8a5707", 90, 97, 220, 903, 701)if #point ~= 0 then --如果找到符合条件的点for var = 1,#point dosysLog(point[var].x..":"..point[var].y)endend

注意事项:

1.高级区域多点找色函数目前最多支持返回99个点。

函数:findMultiColorInRegionFuzzyExt2 高级区域多点找色(推荐使用findColors代替)

函数功能:在指定区域,根据颜色以及其周边点的颜色,寻找所有符合条件的点的坐标,支持模糊查找函数语法:   point = findMultiColorInRegionFuzzyExt2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)

参数说明:

参数类型说明color整型欲寻找的参照点颜色posandcolortable型周边点颜色参数degree整数型寻找精度,范围:1 ~ 100,当是100时为完全匹配x1, y1整数型欲寻找的区域左上角顶点屏幕坐标x2,y2整数型欲寻找的区域右下角顶点屏幕坐标hdir整数型水平搜索方向,0表示从左到右,1表示从右到左,默认为0vdir整数型垂直搜索方向,0表示从上到下,1表示从下到上,默认为0 返回值类型说明pointtable类型以 table 形式返回所有符合条件的参照点的坐标,如未找到则返回的table为空

返回的 table 为为key-value的形式,如下: table = { {x = 100,y = 110}, {x = 200,y = 210}, {x = 300,y = 310}, ... }

脚本实例: 该函数是高级区域多点找色函数findMultiColorInRegionFuzzyExt的增强版,将周边参照点的颜色及相对坐标写成table的形式,更方便动态调整。

  point = findMultiColorInRegionFuzzyExt2(0xcf0000, {{x=-37,y=3,color=0x942814},{x=-38,y=20,color=0xeba62d},{x=1,y=54,color=0xf2b054},{x=28,y=22,color=0x8a5707}}, 90, 97, 220, 903, 701)if #point ~= 0 then for var = 1,#point dosysLog(point[var].x..":"..point[var].y)endend

注意事项:

1.高级区域多点找色函数目前最多支持返回99个点。

函数:getColor 获取屏幕某点颜色值

函数功能:获取屏幕某点颜色值函数语法:   color = getColor(x, y)

参数说明:

参数类型说明x,y整数型将获取颜色值的屏幕坐标 返回值类型说明color整数型该点的十进制颜色值RGB

脚本实例:

如果某点符合某颜色则点击   if getColor(100, 100) == 0xffffff then touchDown(1, 100, 100);touchUp(1, 100, 100);end

注意事项:

getColor函数获得的颜色值十六进制文本中,实际顺序为RGB

函数:getColorRGB 获取颜色RGB值

函数功能:获取屏幕某点颜色值R,G,B 值。函数语法:   color_r, color_g, color_b = getColorRGB(x, y)

参数说明:

参数类型说明x,y整数型将获取颜色值的屏幕坐标 返回值类型说明color_r, color_g, color_b整数型该点颜色的RGB值

脚本实例:

判断某点的颜色与某颜色相似   r,g,b = getColorRGB(100,100); --获取该点的R,G,B值if r > 200 and b < 150 then --判断颜色强度touchDown(1,100,100); touchUp(1,100,100);end 封装一个单点模糊比色函数   function isColor(x,y,c,s) --x,y为坐标值,c为颜色值,s为相似度,范围0~100。local fl,abs = math.floor,math.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 trueendreturn falseend if isColor(963, 961, 0x7b593f,90) then touchDown(963, 961)mSleep(50)touchUp(963, 961)end

函数:findImageInRegionFuzzy 模糊区域找图

函数功能:在指定区域中,寻找指定的图案,返回其左上角顶点坐标,支持模糊查找。函数语法:   x, y = findImageInRegionFuzzy(picpath, degree, x1, y1, x2, y2, alpha)

参数说明:

参数类型说明picpath文本型将要寻找的图片文件名(需要预先存放于脚本中res文件夹)degree整数型寻找精度,范围:1 ~ 100,当是100时为完全匹配x1,y1整数型欲寻找的区域左上角顶点屏幕坐标x2,y2整数型欲寻找的区域右下角顶点屏幕坐标alpha整数型忽略的颜色值(透明色) 若无请填 0 返回值类型说明x,y整数型找到的图片的左上角顶点坐标,如未找到则返回 -1,-1

脚本实例:

寻找符合条件的图片   x, y = findImageInRegionFuzzy("test_alpha.png", 100, 0, 0, 320, 480, 0xffffff);if x ~= -1 and y ~= -1 then --忽略背景色白色的情况下找到符合条件的图片则点击touchDown(1, x, y); mSleep(50)touchUp(1, x, y);else --如果没找到符合条件的dialog("没找到 ╮(╯▽╰)╭",0);end

函数:snapshot 截图

函数功能:截取屏幕中指定区域的图像并生成指定格式的图片文件函数语法:   snapshot(picname, x1, y1, x2, y2, quality)

参数说明:

参数类型说明picname文本型截图保存的文件名x1,y1整数型欲截取的区域左上角顶点屏幕坐标x2,y2整数型欲截取的区域右下角顶点屏幕坐标quality数字型当截图格式选为jpg时,可用此参数控制图片质量,此参数值为大于0且小于等于1的值

返回值:无

脚本实例:

全屏截图(分辨率1080*1920),并以当前日期为文件名保存   current_time = os.date("%Y-%m-%d", os.time());snapshot(current_time..".png", 0, 0, 1079, 1919); --截图并以当前时间戳命名snapshot('[public]'..i..".jpg", 0, 0, 1079, 1919, 0.9); --使用jpg格式截图,质量为0.9

注意事项:

1.保存图片的格式可为 bmp, jpg, png,推荐选择 png。 2.截图时,如使用全屏截图,右下角顶点坐标最大为当前分辨率最大值,否则会出现越界错误。 3.默认图片路径为脚本私有文件夹,文件相同将会被覆盖 4.本文实例中 os.date 与 os.time 为 Lua 基本库函数,请查阅附录 Lua 操作系统函数库。 5.".." 为字符串连接操作符,可以将字符串变量、常量连接在一起。 6.截图保存路径: - 开发助手 Android:/data/data/com.xxscript.idehelper/tengine/public iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp iOS(开发助手<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp - 叉叉助手 android: /data/data/com.xxAssistant/tengine/public iOS(叉叉版本>=2.5.0):/var/mobile/Library/XXAssistant/Lua/Luas/Temp iOS(叉叉版本<2.5.0):/Library/Application Support/XXAssistant/Lua/Luas/Temp - IPA精灵 IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/ 7.公共目录路径: - 开发助手 Android:/data/data/com.xxscript.idehelper/tengine/public iOS(开发助手版本>=1.0.10):/var/mobile/Library/XXIDEHelper/xsp/Temp/public iOS(开发助手版本<1.0.10) :/Library/ApplicationSupport/XXIDEHelper/xsp/Temp/public - 叉叉助手 Android: /sdcard/com.xxAssistant/tengine/public iOS(叉叉版本>=2.5.0): /var/mobile/Library/XXAssistant/Lua/Luas/Temp/public iOS(叉叉版本<2.5.0): /Library/ApplicationSupport/XXAssistant/Lua/Luas/Temp/public - IPA精灵 IPA精灵:应用文件夹/Documents/Lua/Luas/Temp/public 8.引擎1.3.0版本增加对公共目录[public]访问支持,截图方向跟随init

函数:keepScreen 保持屏幕

函数功能:函数功能:在脚本中保持当前屏幕内容不变,多次调用取色、找色、截图、找图等函数时,直接调用保持的屏幕内容。该函数主要用于优化找图找色函数的效率。函数语法:   keepScreen(flag)

参数说明:

参数类型说明flag逻辑型保持开关

返回值:无

脚本实例:

遍历屏幕区块   keepScreen(true);for k = 1, 640, 10 dofor j = 1, 960, 10 do--格式化颜色为十六进制文本color = string.format("%X", getColor(k, j));--输出系统日志sysLog("("..k..", "..j..") Color: "..color..".");endendkeepScreen(false);

函数:inputText 输入字符串

函数功能:向输入框中输入文本函数语法:   inputText(string)

参数说明:

参数类型说明string文本型将输入的文本以及控制字符

返回值:无

脚本实例:

输入文本   touchDown(1,150,150); --点击输入框获取焦点(假设已知输入框坐标150,150)mSleep(50)touchUp(1,150,150);mSleep(1000); inputText("#CLEAR#") --删除输入框中的文字(假设输入框中已存在文字)mSleep(1000); inputText("Welcome.#ENTER#"); --在输入框中输入字符串"Welcome."并回车

注意事项:

1.使用该函数前,必须先点击输入框获取焦点(指使当前的输入光标停留在某一输入框中)。 2.iOS系统上,该函数不支持第三方输入法(指百度输入法、搜狗输入法等),请切换到系统内置输入法方可使用,对于弹出的窗口,需要先初始化再使用该函数,例如 App Store登录窗口(该窗口识别ID 为"com.apple.springboard"),安卓则无此限制。 3.可使用控制字符,包括 \n、\r、#ENTER#、#CLEAR#;#CLEAR#表示清空,需要注意的是,#ENTER#并非支持在所有应用中使用。

函数:createOcrDict 加载自定义的点阵字库

函数功能:加载自定义的点阵字库函数语法:   index = createOcrDict(dict)

参数说明:

参数类型说明dict文本型/table型字库名,如:dict.txt,需放置于脚本内 res 目录;或table型字库编码 返回值类型说明index整数型字库标识,由 createOcrDict 函数返回值生成,ocrText第一个参数需要用到此值

脚本实例:

  lines = {}lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'lines[2] = 'FFFFFC$l$0.0.42$21'lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26' local dict = createOcrDict(lines) --或者可以写成这样的形式 local dict = createOcrDict("dict.txt") result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果sysLog('result: ' .. result)results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标for k,v in pairs(results) dosysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))end

注意事项:

1.ocr函数不支持多分辨率,不受setScreenScale影响 2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录 3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。

函数:ocrText 文字点阵化识别

函数功能:识别屏幕上的文字。函数语法:   result = ocrText(index, x1, y1, x2, y2, {"c0-c1"} , sim, flag, dir)

参数说明:

参数类型说明index整数型字库标识,由 createOcrDict 函数返回值生成x1, y1整数型识别区域左上角顶点屏幕坐标x2, y2整数型识别区域右下角顶点屏幕坐标c0, c1文本型偏色范围,由字库制作中获取,需要与制作字库时所设值保持一致,多组偏色用,分割sim整数型精确度,范围 0 - 100flag整数型表示选择返回结果的类型, 0 == 字符串形式返回识别结果,1 == table形式返回识别到的结果及其坐标dir整数型选填项,表示识别方向,0 == 区域内全部搜索,1 == 横向搜索, 2 ==竖向搜索, 忽略此项则默认为0 返回值类型说明result文本型/table型返回识别结果/返回识别到的结果及其坐标

脚本实例:

  lines = {}lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'lines[2] = 'FFFFFC$l$0.0.42$21'lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26' local dict = createOcrDict(lines) --或者可以写成这样的形式 local dict = createOcrDict("dict.txt") result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范围内全部搜索,以字符串形式返回识别结果sysLog('result: ' .. result)results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范围内横向搜索,以table形式返回识别到的所有结果及其坐标for k,v in pairs(results) dosysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))end

注意事项:

1.ocr函数不支持多分辨率,不受setScreenScale影响 2.字库文件“dict.txt”需注意文本编码必须使用 UTF-8 格式,并放置于脚本内 res 目录 3.搜索方向横向或竖向时的检索规则为:从识别到第一个匹配结果开始给予该位置横向或竖向搜索,忽略选定区域内其他范围;合理使用搜索方向参数可有效提高ocr函数性能。

函数:createOCR 载入高级文字识别字库(集成tesserOCR)

函数功能:载入高级文字识别字库,并指定检测方式函数语法:   ocr, msg = createOCR({   type = "tesseract",   mode = mode,   path = path,   lang = lang   })

参数说明:

参数类型说明type文本型[必填]文字识别类型,暂只支持tesseract,更多ocr引擎逐步支持中mode整数型[选填]引擎识别模式(参见下表),默认3path文本型[选填]字库路径,不填默认使用eng字库路径;官方字库扩展路径、自定义路径见下方说明lang文本型[选填]字库语言文件名称,不填则默认eng(只支持一般的中英+数字+标点符号)

path 自定义字库,有两种路径选择: 对于自定义字库,有以下几种路径选择: 1. 内置到xsp的res目录下,直接指定res路径:"res/" 2. 下载到public目录下,指定[public]和子路径:"[public]downloads/tessdata/" 3. 使用开发助手/叉叉助手的字库扩展,指定[external]即可:"[external]" 特别注意:下载到public目录的字库路径,traineddata的上层目录必须命名为tessdata

lang 字库语言文件: 1. lang 为.traineddata字库文件名,叉叉助手、开发助手中可下载的字库语言文件有: chi_sim 简体中文字库 chi_tra 繁体中文字库 eng_ext 英文增强版字库 eng 内置默认精简版中英数字标点字库,免下载可用 2. 识别要求不高或识别数据比较标准,也可以path和lang都不填,使用默认字库eng,只支持一般的中英+数字+标点符号。

字库与语言配置样例: 1. path & lang均不填: 使用内置eng字库 2. path = [external] & lang = eng_ext/chi_sim/chi_tra:叉叉提供的字库扩展(需下载) 3. path = "res/" & lang = dictname(dictname:xsp打包中res目录字库文件名)

引擎识别模式说明0仅执行Tesseract,速度最快1仅进行Cube处理,较慢但准确2结合Tesseract和Cube处理,最准确3根据字库配置自动选择 返回值类型说明ocr文本型ocr实例,创建失败时ocr为nilmsg文本型创建成功返回版本号,创建失败返回错误信息

脚本实例:

  local ocr, msg = createOCR({type = "tesseract", -- 指定tesseract引擎path = "[external]", -- 使用开发助手/叉叉助手的扩展字库,不填默认使用eng字库路径lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)}) if ocr ~= nil then-- ocr 创建成功,使用该实例进行后续识别操作(参见下面函数文档)sysLog("createOCR succeed: Tesseract-OCR v" .. msg)else-- ocr 创建失败,根据msg提示调整sysLog("createOCR failed: " .. tostring(msg))end

训练字库: 请参阅:【如何使用Tesseract-OCR(v3.02.02)训练字库】

注意事项:

支持引擎版本:1.8.10或更新 引擎内置Tesseract-OCR版本:3.02.02

函数:ocr:getText 高级文字识别

函数功能:使用已载入的高级文字识别字库进行识别函数语法:   local code, text = ocr:getText({   psm = psm,   rect = {x1, y1, x2, y2},   diff = {diff},   data = data,   whitelist = whitelist,   blacklist = blacklist   })

参数说明:

参数类型说明psm整数型[选填]int: page segmentation mode(参见下表),默认6recttable[必填]{x1, y1, x2, y2} 屏幕的识别范围,越准确越好difftable[必填]{"颜色1-误差1", "颜色2-误差2", ...} 色值范围,可以提供多个,供二值化使用datatable[选填]二值化二维数组,1代表有效数据,其余代表无效数据)whitelist文本型[选填]仅识别为白名单中的字符blacklist文本型[选填]识别时需排除的字符(对识别时易相互混淆的字符进行排除) psm选项说明0仅检测方向和文本1自动检测方向和文本(OSD)2自动检测,但不进行OSD或OCR处理3自动PSM模式(但不含OSD)4所识别图片的字体大小不一5所识别图片当作整块竖向文字区域6所识别图片当作整块横向文字区域 (默认值)7所识别图片当作一行文字8所识别图片当作单个词语9所识别图片当作单个圆型围绕的词语10所识别图片当作单个英文/数字字符11尽可能识别更多的字符(无顺序要求)12分散稀疏的OSD检测 返回值类型说明code整数型code = 0: 识别成功;code < 0: 识别失败text文本型识别出的字符串(末尾可能有多余的换行或空格),识别失败时,text为对应的错误提示

脚本实例:

  local ocr, msg = createOCR({type = "tesseract", -- 指定tesseract引擎path = "[external]", -- 使用开发助手/叉叉助手的扩展字库lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)}) if ocr ~= nil thenstring.trim = function(s)return s:match'^%s*(.*%S)' or ''end local code, text = 0, ""mSleep(1000)-- 识别屏幕图像内容(例如5/5s设备的当前时间显示)code, text = ocr:getText({rect = {249, 6, 249 + 144, 6 + 29},diff = {"0x000000-0x101010"}, -- 时间颜色为纯黑whitelist = "0123456789APM:" -- 添加所有可能出现的字符作为白名单})-- 输出示例:"code = 0, text = 5:24 PM" (末尾可能有多余换行符,为正常结果,可以参考trim处理)sysLog("code = " .. tostring(code) .. ", text = " .. text:trim()) mSleep(1000)-- 识别二值化二维数组(单个字符)code, text = ocr:getText({psm = 10, -- 所识别图片当作单个英文/数字字符data = {{0,0,0,0,1,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,1,0,0,0,0,0,0,0,0},{0,0,0,0,1,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0,0,0,0,0},{0,0,1,1,0,0,0,0,0,0,0,0,0,0},{0,1,0,1,0,0,0,0,0,0,0,0,0,0},{0,1,1,1,1,1,0,1,1,0,0,0,0,0},{1,0,1,1,0,0,0,0,1,1,1,0,0,0},{0,1,0,1,0,0,0,0,0,0,1,1,0,0},{1,1,1,0,0,0,0,0,0,0,1,1,0,0},{1,0,0,0,0,0,0,0,0,0,1,0,1,0},{1,0,0,0,0,0,0,0,0,0,0,1,1,0},{1,0,0,0,0,0,0,0,0,0,0,1,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,1,0},{1,0,0,0,0,0,0,0,0,0,0,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,1,0,1},{1,1,0,0,0,0,0,0,0,0,0,1,1,0},{1,0,1,0,0,0,0,0,0,0,1,0,0,0},{0,1,1,1,0,1,0,0,1,1,1,0,0,0},{0,0,0,1,1,1,0,1,1,0,0,0,0,0},{0,0,0,0,0,0,1,0,1,0,0,0,0,0}},whitelist = "0123456789" -- 添加白名单为数字类型})-- 输出示例:"code = 0, text = 6"sysLog("code = " .. tostring(code) .. ", text = " .. text:trim()) mSleep(1000)-- 识别二值化二维数组(多个字符)code, text = ocr:getText({psm = 7, -- 所识别图片当作一行文字data = {{1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0},{1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0},{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0},{1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0},{1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0},{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1},{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1},{1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1},{0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0},{0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0}},whitelist = "0123456789"})-- 输出示例:"code = 0, text = 53"sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())elsesysLog("createOCR failed: " .. tostring(msg))end

特别说明

diff = {"C1-D1", "C2-D2", …} 设置的意义是,当区域内任意一个颜色值Cxy,满足条件 min(Ci - Di, 0x000000) ≤ Cxy ≤ max(Ci + Di, 0xffffff),i = 1, 2, … 的时候,这个位置的颜色就是有效颜色(0xffffff),否则,都是无效颜色(0x000000)。这个处理过程称为二值化,经过这样处理后的二值化数据,提交给OCR识别会更加精确。

注意事项:

支持引擎版本:1.8.10或更新

函数:ocr:release 释放字库

函数功能:主动释放OCR字库,避免内存峰值过高导致被系统强杀函数语法:   ocr:release()

参数说明: 使用到字库较大的情况下,为避免内存峰值过高导致被系统强杀,请在OCR使用完毕时调用API释放ocr,否则只能依赖lua的gc自动清理。

脚本实例:

  local ocr, msg = createOCR({type = "tesseract", -- 指定tesseract引擎path = "[external]", -- 使用开发助手/叉叉助手的扩展字库lang = "eng_ext" -- 使用英文增强字库(注意需要提前下载好)}) local code, text = ocr:getText({rect = {249, 6, 249 + 144, 6 + 29},diff = {"0x000000-0x101010"},whitelist = "0123456789APM:"}) -- ocr使用完毕,为避免内存峰值过高导致被系统强杀(主要是使用到字库较大的情况下)-- 建议及时手动释放ocrocr:release()

注意事项:

支持引擎版本:1.8.11或更新

函数:binarizeImage 二值化图片转换为table 

函数功能:对当前屏幕指定范围的图像二值化,并转换为table,得到的结果通过去噪或者矩阵运算后,可以提供给ocr:getText()识别成文字函数语法:   colorTbl = binarizeImage({    rect = {x1, y1, x2, y2},    diff = {diff}   })

参数说明:

参数类型说明recttable[必填]{x1, y1, x2, y2} 屏幕二值化的识别范围,越准确越好difftable[必填]{"颜色1-误差1", "颜色2-误差2", ...} 色值范围,可以提供多个,供二值化使用 返回值类型说明colorTbl文本型图像二值化后的table

脚本实例:

  colorTbl = binarizeImage({rect = {30, 80, 53, 101},diff = {"0xf7d363-0x1f1f1f", "0xefaa29-0x1f1f1f"}}) -- 输出colorTbl每一行测试转换结果for _, row in pairs(colorTbl) dosysLog(table.concat(row, ','))end --[[colorTbl格式类似这样:{{0,0,0,0,1,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,1,0,0,0,0,0,0,0,0},{0,0,0,0,1,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0,0,0,0,0},{0,0,0,1,0,0,0,0,0,0,0,0,0,0},{0,0,1,1,0,0,0,0,0,0,0,0,0,0},{0,1,0,1,0,0,0,0,0,0,0,0,0,0},{0,1,1,1,1,1,0,1,1,0,0,0,0,0},{1,0,1,1,0,0,0,0,1,1,1,0,0,0},{0,1,0,1,0,0,0,0,0,0,1,1,0,0},{1,1,1,0,0,0,0,0,0,0,1,1,0,0},{1,0,0,0,0,0,0,0,0,0,1,0,1,0},{1,0,0,0,0,0,0,0,0,0,0,1,1,0},{1,0,0,0,0,0,0,0,0,0,0,1,0,1},{1,0,0,0,0,0,0,0,0,0,0,0,1,0},{1,0,0,0,0,0,0,0,0,0,0,1,1,1},{1,0,0,0,0,0,0,0,0,0,0,1,0,1},{1,1,0,0,0,0,0,0,0,0,0,1,1,0},{1,0,1,0,0,0,0,0,0,0,1,0,0,0},{0,1,1,1,0,1,0,0,1,1,1,0,0,0},{0,0,0,1,1,1,0,1,1,0,0,0,0,0},{0,0,0,0,0,0,1,0,1,0,0,0,0,0}}]]-- -- 对colorTbl结果进行可选的去噪或者矩阵运算纠正等处理-- (假设处理函数是denoising)colorTbl = denoising(colorTbl) local ocr, msg = createOCR({type = "tesseract"}) -- 使用ocr识别新的colorTbllocal code, text = ocr:getText({data = colorTbl,psm = 10 -- 单个字符模式识别}) sysLog("code = " .. tostring(code) .. ", text = " .. text)-- 输出结果:code = 0, text = 6

注意事项:

支持引擎版本:1.8.30或更新

函数:runApp 运行应用

函数功能:打开一个应用程序。函数语法:   flag = runApp(appid)

参数说明:

参数类型说明appid文本型应用程序的应用ID 返回值类型说明flag整数型0 == 应用启动成功;非0 == 应用启动失败

脚本实例:

打开内置音乐应用,然后关闭   r = runApp("com.apple.Music"); mSleep(10 * 1000); --等待程序响应if r == 0 thencloseApp("com.apple.Music");elsetoast("启动应用失败");end

注意事项:

1.runApp函数需要系统响应时间,响应时间根据机型有所不同,调用此函数需做好延迟或判断。

函数:closeApp 关闭应用

函数功能:关闭一个应用程序。函数语法:   closeApp(appid)

参数说明:

参数类型说明appid文本型应用程序的应用ID

返回值:无

脚本实例:

打开内置音乐应用,然后关闭   r = runApp("com.apple.Music"); mSleep(10 * 1000); --等待程序响应if r == 0 thencloseApp("com.apple.Music");elsetoast("启动应用失败");end

函数:appIsRunning 检测应用是否运行

函数功能:检测应用是否运行函数语法:   flag = appIsRunning(appid)

参数说明:

参数类型说明appid文本型目标应用程序的应用ID 返回值类型说明flag整数型0 - 目标应用未运行;1 - 目标应用运行中

脚本实例:

  flag = appIsRunning("com.xxAssistant"); --检测叉叉助手是否在运行if flag == 0 then runApp("com.xxAssistant") --运行叉叉助手end

注意事项:

此函数将判断目标应用的运行状态,目标应用前台运行或者后台运行返回值都为 1。

函数:isFrontApp 判断是否为前台应用

函数功能:根据应用ID判断应用是否处于前台。函数语法:   flag = isFrontApp(appid)

参数说明:

参数类型说明appid文本型待检测的应用程序的应用ID 返回值类型说明flag整数型0 == 不在前台运行;1 == 在前台运行

脚本实例:

监听应用状态   while true doisfront = isFrontApp("com.xxAssistant"); --前台状态if isfront == 1 thenbreakendtoast("请打开叉叉助手"); mSleep(3000)end

函数:frontAppName 获取前台应用识别ID

函数功能:获取前台应用程序的应用ID。函数语法:   appid = frontAppName()

参数说明:

返回值类型说明appid文本型返回前台应用程序的应用ID,若无应用处于前台,则返回空字符串

脚本实例:

检查指定应用是否开启   appid = frontAppName();if appid ~= "com.apple.mobilesafari" then dialog("请打开 Safari 再运行该脚本!", 5);mSleep(3000); lua_exit();end

函数:showUI 自定义脚本界面

函数功能:显示一个自定义的界面,用来接收用户相关的自定义配置。函数语法:   ret,results = showUI(ui_json)

参数说明:

参数类型说明ui_json文本型自定义界面json格式字符串,或UI目录下的json文件名称 返回值类型说明ret整数型返回用户按下的按钮 0 - 取消;1 - 确定resultstable类型返回用户输入的多项数据

脚本界面说明

脚本界面通过json格式存储 ,以下是一个包含所有控件及其属性的例子:

  {"style" : "default","config" : "save_111.dat","width" : 700,"height" : 1080,"cancelname" : "Cancel","okname" : "Let's Rock","cancelscroll" : true,"countdown":10,"views" : [{"text" : "基本设置","type" : "Page","views" : [{"align" : "center","color" : "0,0,225","size" : 30,"bg" : "0,0,0", //RGB格式规定标签的背景色,不指定为透明"text" : "设置:这是一行文本","type" : "Label"},{"id" : "RadioGroup1","list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select" : "0","size" : 30,"type" : "RadioGroup","orientation" : "vertical" //选项排布方式为竖排},{"align" : "left","color" : "0,100,0","id" : "Edit1","kbtype" : "number","prompt" : "这是提示文本","size" : 25,"text" : "这是预输入文本","type" : "Edit"},{"id" : "CheckBoxGroup1","list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select" : "3@5","size" : 30,"type" : "CheckBoxGroup","orientation" : "horizontal" //选项排布方式为智能横排},{"id" : "ComboBox1","list" : "选项1,选项2,选项3,选项4,选项5,选项6,选项7","select" : "1","size" : 30,"type" : "ComboBox"},{"src" : "b.png", //这是来源为本地文件的图片"type" : "Image"},{"src" : "http://www.baidu.com/img/bdlogo.png", //这是来源为网络地址的图片"type" : "Image"}]},{"text" : "水平布局","type" : "Page","views" : [{"color" : "100,100,100","size" : 30,"text" : "以下是水平布局排列的三个控件","type" : "Label"},{"height" : 300,"width" : 700,"id" : "group1","type" : "LinearLayout", //这是LinearLayout控件"valign" : "top","views" : [//从这里开始是LinearLayout控件内部的子控件,不可嵌套LinearLayout控件,可添加LinearLayout、Page以外的所有控件{"color" : "100,100,100","size" : 30,"text" : "选择","type" : "Label","width" : 100 //LinearLayout控件内部的子控件均需要指定一个width属性,不指定则无法显示},{"id" : "checkboxgroup2","list" : "选项1,选项2,选项3","select" : "2@3@","type" : "CheckBoxGroup","width" : 180},{"id" : "4","list" : "选项1,选项2,选项3,选项4,选项5","select" : "1","size" : 20,"type" : "ComboBox","width" : 250}]},{"color" : "100,100,100","size" : 30,"text" : "以下是一张默认布局方式的图片,水平布局可与普通布局样式联合使用", //这里是一个Label,跟上面的LinearLayout同层级"type" : "Label","width" : 100},{"src" : "b.png","type" : "Image"},{"color" : "100,100,100","size" : 30,"text" : "以下又是一个水平布局区域", //这里也是一个Label,跟上面的LinearLayout同层级"type" : "Label"},{//在同层级的情况下,可以多个LinearLayout联合使用,以下是第二个LinearLayout控件中的内容"height" : 400,"width" : 700,"id" : "group1","type" : "LinearLayout",  "valign" : "top","views" : [{"color" : "100,100,100","size" : 30,"text" : "右边是一张图片","type" : "Label","width" : 150},{"src" : "b.png","type" : "Image","width" : "400"}]}]},{"text" : "跳转示例","type" : "Page","views" : [{"color" : "100,110,200","extra" : [ //附加属性指定{"goto" : "http://www.baidu.com", //跳转到网址"text" : "阅读原文"},{"goto" : "qq", //跳转到QQ咨询"text" : "1602127440"}],"size" : 30,"text" : "阅读原文 QQ:1602127440","type" : "Label"}]},{"text" : "V1.6.7更新","type" : "Page","views" : [{"align" : "left","color" : "0,0,0","size" : 40,"text" : "标签","type" : "Label","bg" : "100,100,100"},{"id" : "web","url" : "http://www.baidu.com","type" : "WebView","height" : 500,"width" : 800},{"id" : "line","type" : "Line","color" : "0,0,255","height" : 7,"width" : 800}]}]} 

创建一个界面,需要包含style和views两个参数。

style表示界面样式,目前支持两种: 1.default 控件垂直排列 2.custom 界面中所有控件都必须设置大小和位置,后面有补充说明views数组则是界面上的全部控件,要根据views数组的长度来生成若干个可切换的tab;width与height分别指定了界面的宽和高(单位是像素); bg 指定界面的背景图片; text 指定页面的名称,当存在Page控件时,Tab上会显示该名称; okname,cancelname 分别为底部的确定和取消按钮显示的文字; config表示自动配置文件名,界面打开的时候,如果存在此配置文件,UI会自动读取该配置文件中的参数,用户点击确定按钮时,也会去更新该配置文件 cancelscroll 用于控制当设定控件超出UI宽度时是否支持滑动,默认true false - UI界面支持滑动 true - UI界面不支持滑动 countdown 此属性会在生成UI上进行倒计时,自动确认UI输入。

界面控件: 界面包含有8种控件:标签 Label,单选框 RadioGroup,编辑框 Edit,多选框CheckBoxGroup,下拉框 ComboBox,图片 Image,页面Page,水平布局LinearLayout。 例如一个标签控件的例子:

  {"type": "Label","text": "设置","size": 25,"align": "center","color": "0,0,255"}

标签 Label 一共有六种属性: 文本/标题/text 必填,一般来用显示说明文字或者标题,该控件没有任何返回值,只用作显示。此类型可支持多行显示,在字符串中插入 \n 可以进行换行,例如:\"测试\n测试 1\n测试2\" 数值/字体大小/size 如果不指定该属性,则默认值为 15。 文本/对齐方式/align 对齐方式 align 可取值为:左对齐 left,右对齐 right,居中 center。 文本/字体颜色/color 字体颜色 color 使用RGB十进制数值,以英文半角逗号分割。 文本/背景颜色/bg 背景颜色 bg 使用RGB十进制数值,以英文半角逗号分割;或输入图片文件名以使用图片文件。 附加属性/extra,指定了该标签内部分文本的属性。 支持多种类型的跳转 goto,对应跳转类型的属性类别为url、qq;跳转网址 url:属性类别中直接输入该url; 跳转QQ:属性类别填写"qq"。

单选框 RadioGroup 一共有四种属性: 文本/ID/id 必填,全局唯一,用来标示控件 文本/可选项目标题 /list 可选项目标题 list 用英文半角逗号分割。 文本/字体颜色/color 字体颜色 color 使用RGB十进制数值,以英文半角逗号分割。 文本/默认选中项编号/select 默认选中项编号 select 只允许填写一个,序号从 0 开始,与可选项目标题中的顺序保持一致。 文本/分行显示控制/orientation 用于控制多个选项的排布方式,填写horizontal为水平方向智能排版,填写vertical为全部选项竖排,不水平排版,不填写则默认为水平方向智能排版 数值/字体大小/size 如果不指定该属性,则默认值为 30。

编辑框 Edit 一共有七种属性: 文本/ID/id 必填,全局唯一,用来标示控件 文本/编辑框提示文本/prompt 编辑框提示文本prompt为编辑框中无任何内容时显示的底色文本。 文本/编辑框默认内容/text 界面载入时已经存在于编辑框中的文本。 文本/对齐方式/align 文本/字体颜色/color 文本/键盘类型/kbtype 设置获取焦点时弹出的键盘类型,number ascii default 数值/字体大小/size 如果不指定该属性,则默认值为15

多选框 CheckBoxGroup,又称作检查框,一共有三种属性: 文本/ID/id 必填,全局唯一,用来标示控件 文本/可选项目标题/list 文本/默认选中项编号/select 默认选中项编号 select 允许填写一个或多个,填写多个时以 @ 分割编号。 文本/字体颜色/color 字体颜色 color 使用RGB十进制数值,以英文半角逗号分割。 文本/分行显示控制/orientation 用于控制多个选项的排布方式,填写horizontal为水平方向智能排版,填写vertical为全部选项竖排,不水平排版,不填写则默认为水平方向智能排版 数值/字体大小/size 如果不指定该属性,则默认值为 30。

下拉框 ComboBox,一共有四种属性: 文本/ID/id 必填,全局唯一,用来标示控件 文本/可选项目标题/list 多个项目标题之间以” ,”分割 数值/字体大小/size 如果不指定该属性,则默认值为 30。 文本/默认选中项编号/select 默认选中项编号 select 只允许填写一个,序号从 0 开始

图片 Image,放置一个图片到 UI 上,属性: 路径/插入图片的路径/src 可以是本地路径或者网络路径 例如:"type":"Image","src":"http://www.baidu.com" 或者"src":"1.png"

页面 Page,生成一个独立页面到UI上,该页面可自由添加若干个控件,在上一级页面有Tab的页面索引,可点击切换页面,一共有两个属性: 文本/Tab标题/text 数组/控件容器/views (要特别注意的是,如果存在Page控件,那么别的同级控件都就只能是Page控件,否则会导致UI解析出错,返回长度为0的字符串作为结果。)

WebView页面 WebView,在UI上规定一个范围,作为webview展示区域,可显示任意url网页内容,共有四种种属性: 文本/ID/id 必填,全局唯一,用来标示控件 文本/地址/url 指定该webview区域展示的目标地址 数字/宽度/width 指定展示区域的宽度 数字/高度/height 指定展示区域的高度

直线 line,在UI上放置一条直线,共有四种种属性: 文本/ID/id 必填,全局唯一,用来标示控件 文本/颜色/color 使用RGB十进制数值,以英文半角逗号分割。 数字/宽度/width 指定线条长度 数字/高度/height 指定线条粗细

以上九种控件均可重复使用,这个界面的样式 style 为 default,即默认样式,这个样式下的控件将会自动排列,不需要指定其坐标。部分控件带有id参数,id不可重复,需要注意的是,涉及到用户操作的控件,其id参数为必填项。

水平布局 LinearLayout,指定一个区域,区域内的子控件按照水平布局显示,控件内可添加page、LinearLayout以外的控件作为子控件,该控件一共有三个属性: 文本/控件宽度/width 必填,标示水平布局控件宽度 文本/控件高度/height 必填,标示水平布局控件高度 文本/垂直对齐属性/valign 指定水平布局控件内子控件之间的垂直对齐属性,有top, center, bottom三个值,省略不填则默认为top注意: LinearLayout 控件内的所有子控件都需要加入width属性指定宽度,不指定width属性的控件不予显示 以下是一个关于LinearLayout控件的示例   {"id" : "group1","width" : 1780,"height" : 600,"type" : "LinearLayout","views" : [{"color" : "100,110,200","size" : 30,"text" : "标题栏","type" : "Label","width" : 100},{"id" : "checkboxgroup2","list" : "选项1,选项2,选项3","select" : "2@3@","type" : "CheckBoxGroup","width" : 250},{"id" : "4","list" : "选项1,选项2,选项3,选项4,选项5","select" : "1","size" : 20,"type" : "ComboBox","width" : 210}]}

另一种界面style样式为 custom,当界面样式被指定为这种,则必须指定每个控件的 rect 属性以调整控件的尺寸以及位置,例如:

  {"type": "Edit", "size": 15, "align": "left","prompt": "提示文字","text": "默认文字","color": "255,0,0","rect": "0,0,100,40"} 文本/尺寸与位置/rect 该属性适用于除页面page外的全部六种控件,将控件的左上角顶点横坐标、纵坐标,控件宽度、高度分别以英文半角逗号分割。返回值 除了标签 Label,页面Page 其余四种控件均存在文本型返回值,按照定义时的id,会返回以id为key的Map类型数据。单选框返回当前选中项的编号;编辑框返回其中的内容;多选框返回 当前选中项的编号(从 0 开始),多个选项以 @ 分割。如:3@5 表示多选框组编号为 3 和 5 的两个选项已被选中。 解析函数的第1个返回值为整数型,用户单击右下角的“确认”时返回 1,单击左下角的“取消”时返回 0。

函数:getUIContent 获取UI文件信息

函数功能:获取json文件中的内容函数语法:   content = getUIContent(string)

参数说明:

参数、返回值类型说明string文本型脚本UI目录下json文件名称content文本型所获取的json文件内容

脚本实例:

一个简单的动态UI例子   --ui.json文件内具体内容如下{"style": "default", "config": "save.dat","width": 400,"height": 300, "cancelname": "Quit", "okname": "Let's Rock!", "views": [{"type": "Page","text": "settings","views": [ {"type": "Label","text": "Settings","size": 25,"align": "center","color": "0,0,255",}]}]} 更改ui窗口的宽、高的实例   --lua文件中示例如下local bb = require("badboy")local json = bb.getJSON() ret,results=showUI("ui.json"); --显示未更改的UI界面 content = getUIContent("ui.json") --获得文件ui.json的内容lua_value = json.decode(content) --对获取到的json字符串解码lua_value.width = 500 --将ui窗口宽度赋值为500lua_value.height = 400 --将ui窗口宽度赋值为450showUI(json.encode(lua_value)) --重新编码json字符串,窗口将按照新设定的尺寸显示

注意事项:

1.badboy是专为叉叉脚本开发的开源工具库,具体使用方法参照对应章节

函数:resetUIConfig 重置UI默认选项

函数功能:重置UI默认选项函数语法:   resetUIConfig(file)

参数说明:

参数类型说明file文本型需要重置的UI配置文件,例"save.dat"

返回值:无

脚本实例:

  ret,results = showUI("ui.json")mSleep(500)resetUIConfig("save_111.dat")mSleep(500)toast("UI默认选项已重置")mSleep(2500)ret,results = showUI("ui.json")

注意事项:

支持引擎版本:1.7.4或更新

函数:getScreenSize 获取屏幕分辨率

函数功能:获取设备屏幕的分辨率,用来判断坐标系的使用。函数语法:   width,height = getScreenSize()

参数说明:

返回值类型说明width整数型获取到的屏幕宽度height整数型获取到的屏幕高度

注意事项:

统一为竖直(Home 键在下方时)屏幕的宽度和高度。

函数:setScreenScale 设置屏幕缩放

函数功能:设置当前脚本开发环境的屏幕分辩率,使脚本适配不同分辩率的设备。函数语法:   setScreenScale(width, height, scale)

参数说明:

参数类型说明width整数型脚本开发时使用的设备宽度height整数型脚本开发时使用的设备高度scale整数型返回坐标缩放参数, 默认为0; 0 - 返回的坐标进行反向缩放,1 - 返回的坐标不缩放

  该函数使脚本根据开发环境的屏幕分辩率和当前使用环境分辨率自动将脚本里XY坐标进行等比换算   受影响命令包括:

touchDown、touchUp、touchMovefindColor、findColorsfindColorInRegionFuzzy、findMultiColorInRegionFuzzy、findMultiColorInRegionFuzzy2findMultiColorInRegionFuzzyExt、findMultiColorInRegionFuzzyExt2getColor、getColorRGBshowHUDocr:getTextbinarizeImage

脚本实例: 假设一名作者在540*960分辨率的手机中开发了脚本,要在720*1280的设备中运行

  setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同 touchDown(0, 100, 200) --此处实际点击坐标为:100*(720/540),200*(1280/960)mSleep(50)touchMove(0, 100, 200) --此处实际移动坐标为:100*(720/540),200*(1280/960)mSleep(50)touchUp(0, 100, 200)  x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE", 100, 0, 0, 400, 600) --此处实际查找范围为坐标(0,0)到(400*720/540,600*1280/960),同时坐标偏移也进行换算,即匹配首点x,y坐标后,再比对(x+29*720/540,y+1*1280/960)这个坐标是否为"0x00BBFE" if x~=-1 thentouchDown(0, x, y) --第三参数为0或省略情况下返回的坐标为经过反向缩放的坐标,mSleep(100)touchUp(0, x, y)end 

注意事项:

1.通分辨率取色要点:取色点周边颜色相近为佳,由于字体或图形边缘线的点就很可能由于缩放而消失,导致找色失败。 2.只适用等比例分辨率:例如540*960,720*1280都是9:16就可通用,而540*960与400*800的一般不通用。 3.在最小分辨率开发,同比例的大分辨可用。例如:540*960下开发的脚本,在720*1280可用,反过来,一般不能通用。

函数:mTime 获取Unix时间戳

函数功能:显示从1970年到现在经过的毫秒数函数语法:   t = mTime()

参数说明:

返回值类型说明t整数型表示从1970年到现在经过的毫秒数

脚本实例:

  sysLog('mTime:' .. mTime())

函数:getNetTime 获取网络时间

函数功能:获取GMT时区从1970年到现在经过的秒数函数语法:   t = getNetTime()

参数说明:

返回值类型说明t整数型表示网络时间GMT时区从1970年到现在经过的秒数,无网络情况下返回值为0

脚本实例:

  sysLog("NetTime:" .. getNetTime())

函数:pressHomeKey 模拟主屏幕按键

函数功能:模拟用户点击主屏幕按键的操作。函数语法:   pressHomeKey()

参数说明: 返回值:无

函数:doublePressHomeKey 双击HOME键

函数功能:模拟用户双击HOME键的操作,用于打开后台。函数语法:   doublePressHomeKey()

参数说明: 返回值:无

脚本实例:

双击HOME键打开后台   doublePressHomeKey();

函数:pressKey 导航栏按键

函数功能:模拟用户点击导航栏按键的操作,仅安卓适用函数语法:   ret = pressKey(keyname,mode)

参数说明:

参数/返回值类型说明keyname文本型必填参数,为'BACK','MENU'和'HOME'三项之一mode逻辑型可选参数,控制是否长按,true表示长按,false表示不长按ret文本型返回值为0时表示成功

脚本实例: ret = pressKey('BACK',false)

函数:setWifiEnable 设置无线局域网开关

函数功能:设置无线局域网开关函数语法:   setWifiEnable(flag)

参数说明:

参数类型说明flag逻辑型打开WIFI - true; 关闭WIFI - false 返回值类型说明ret逻辑型开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  setWifiEnable(true); --打开 WifisetWifiEnable(false); --关闭 Wifi

函数:setAirplaneMode 设置飞行模式开关

函数功能:设置飞行模式开关函数语法:   setAirplaneMode(flag)

参数说明:

参数类型说明flag逻辑型打开飞行模式 - true;关闭飞行模式 - false 返回值类型说明ret逻辑型开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  setAirplaneMode(true); --打开 飞行模式setAirplaneMode(false); --关闭 飞行模式

函数:setBTEnable 设置蓝牙开关

函数功能:设置蓝牙开关函数语法:   setBTEnable(flag)

参数说明:

参数类型说明flag逻辑型打开蓝牙 - true;关闭蓝牙 - false 返回值类型说明ret逻辑型开关设置变更前的状态 false - 关闭;true - 开启

脚本实例:

  setBTEnable(true); --打开 蓝牙setBTEnable(false); --关闭 蓝牙

函数:lockDevice 锁定设备

函数功能:锁定设备并关闭屏幕,仅支持iOS。函数语法:   lockDevice()

参数说明: 返回值:无

脚本实例:

  lockDevice(); lua_exit();

函数:unlockDevice 解锁设备

函数功能:解除屏幕锁定状态,仅支持iOS。函数语法:   unlockDevice()

参数说明: 返回值:无

脚本实例:

解锁设备   flag = deviceIsLock(); --判断屏幕锁定状态if flag == 0 thendialog("未锁定",3);elseunlockDevice(); --解锁end

注意事项:

1.如果设备设置了锁屏密码,则此函数只能唤醒屏幕。

函数:deviceIsLock 设备锁定状态

函数功能:判断当前设备的屏幕锁定状态函数语法:   flag = deviceIsLock()

参数说明:

返回值类型说明flag整数型0 == 表示设备未锁定;非0 == 表示设备已锁定

脚本实例:

判断设备是否锁定   flag = deviceIsLock(); --判断屏幕锁定状态if flag == 0 thendialog("未锁定",3);elseunlockDevice(); --解锁end

函数:vibrator 手机振动

函数功能:使手机振动一次。函数语法:   vibrator()

参数说明: 返回值:无

脚本实例:

  for var = 1,5 dovibrator(); --振动mSleep(1000); --持续 1 秒end

注意事项:

1.使用此函数需在移动设备设置里打开震动选项。

函数:resetIDLETimer 重置锁屏时间

函数功能:重置系统空闲时间,阻止自动锁屏,保持屏幕常亮。函数语法:   resetIDLETimer()

参数说明: 返回值:无

脚本实例:

保持屏幕常亮   while true domSleep(30 * 1000); --等待 30 秒resetIDLETimer(); --重置锁屏计时end

注意事项:

安卓暂不支持此功能。

函数:resetScreenScale 取消屏幕缩放

函数功能:取消屏幕比例缩放设置,一般与setScreenScale配套使用。函数语法:   resetScreenScale()

参数说明: 返回值:无

脚本实例:

  setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同resetScreenScale() --取消缩放

函数:playAudio 播放音频

函数功能:在后台播放指定的声音文件函数语法:   playAudio(file)

参数说明:

参数类型说明file文本型音频文件名,支持mp3

返回值:无

脚本实例:

  playAudio("music.mp3") -- 播放音乐文件music.mp3mSleep(5000)stopAudio() --停止播放音频文件

注意事项:

1.如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。 2.用于播放的音乐文件需置于脚本对应的res文件夹内。

函数:stopAudio 停止播放音频

函数功能:停止正在播放的音频函数语法:   stopAudio()

参数说明: 返回值:无

脚本实例:

  playAudio("music.mp3") -- 播放音乐文件music.mp3mSleep(5000)stopAudio() --停止播放音频文件

注意事项:

如果播放一个音频文件后,使用此函数播放另一音频文件,将会先停止正在播放的音频,再播放第二段音频文件。

函数:setTimer 规定时间之后调用指定函数

函数功能:规定时间之后,调用指定的函数,同时把参数输入函数语法:   setTimer(time,func,arg1,arg2,...)

参数说明:

参数类型说明time数字型当前时间到调用函数的时间间隔,毫秒func函数需要调用的函数名称arg1,arg2,...变量调用指定的函数时需要输入的参数,不定项

返回值:无

脚本实例:

  --每隔2000毫秒toast提示一次a+b+c的结果function func(a,b,c)toast(a+b+c)a=a+1b=b+1c=c+1setTimer(2000,func,a,b,c)end setTimer(2000,func,0,1,2) --等待运行mSleep(2000)mSleep(2000)mSleep(2000)mSleep(2000)mSleep(2000)

注意事项:

1.如定义了一段时间运行的函数,需在函数调用之前预留充裕的时间。 2.支持引擎版本:1.7.4或更新

函数:setSysConfig 设置系统参数

函数功能:设置系统参数,脚本API行为受这些参数决定函数语法:   setSysConfig(key,value)

参数说明:

参数类型说明key文本型要设置的系统参数项目value文本型该API行为的控制选项

返回值:无

可设置系统参数:

设置项目(key)控制选项说明(value)isLogFile:令系统日志sysLog写入到文件中0 - 关闭,1 - 开启

脚本实例:

  --设置开启将API:系统日志sysLog写入到文件。setSysConfig("isLogFile","1") --设置关闭将API:系统日志sysLog写入到文件。setSysConfig("isLogFile","0")

日志文件路径

开发助手 Android:/sdcard/com.xxscript.idehelper/tengine/log/user/脚本名.log iOS:/tmp/user/脚本名.log

叉叉助手 Android:/sdcard/com.xxAssistant/tengine/log/user/脚本id.log Android免Root:/sdcard/com.noroot/tengine/log/user/脚本id.log iOS:/tmp/user/脚本id.log

叉叉小精灵 Android:/sdcard/小精灵包名/tengine/log/user/脚本id.log

IPA精灵 IPA精灵:应用文件夹/Document/Temp/脚本id.log IPA精灵(开发版):应用文件夹/Document/Temp/脚本名.log

注意事项:

1.支持引擎版本:1.9.00或更新. 2.安卓叉叉小精灵应用内可直接查看日志,小精灵需更新到1.0.8或以上。

函数:mSleep 延时

函数功能:发送系统等待事件。函数语法:   mSleep(interval)

参数说明:

参数类型说明interval整数型单位为毫秒,脚本暂停执行的时间长度

脚本实例:

延迟5秒   mSleep(5000); 长按 3 秒   touchDown(1, 200, 300); --按下mSleep(3000); --延迟 3 秒touchUp(1, 200, 300); --抬起

注意事项:

1.延迟函数一般是用来模拟人在界面上的操作,因此要考虑人在各种情况下的延迟、界面加载时的响应时间。 2.延迟间隔不可过短,当 interval <= 50 ms 时,延迟精确度大幅下降,当 interval <= 16 ms 时,实际延迟约在16 ms左右。 3.请勿将此函数用于长时间的精确计时。 4.1 秒 (s) = 1000 毫秒 (ms)。

函数:toast 提示

函数功能:以HUD方式显示提示信息。函数语法:   toast(text)

参数说明:

参数类型说明text文本型提示信息,将在设备屏幕上以HUD形式显示,2秒后消失

返回值:无

脚本实例:

欢迎使用   toast("欢迎使用叉叉脚本!");mSleep(1000);toast("本脚本仅供演示toast函数效果。\n提示信息可以换行。");

注意事项:

该函数所产生的提示信息将以HUD形式显示在屏幕上,该函数所产生的提示信息可能会影响当前屏幕的找色,请合理使用。

函数:dialog 提示框

函数功能:弹出提示信息函数语法:   dialog(text, time)

参数说明:

参数类型说明text文本型提示信息,将在设备屏幕上以弹窗形式显示time整数型提示信息显示的时间,不限时间请填0

返回值:无

脚本实例:

欢迎使用   dialog("欢迎使用叉叉脚本!", 5);mSleep(1000);dialog("本脚本仅供演示对话框的用法。\n提示信息可以换行。",0);

注意事项:

1.time 参数时间设置过短有可能因出现时间太短看不清楚。 2.该函数仅供呈现提示信息给用户,不可接收返回值。 3.该函数所产生的提示窗口显示的时候会影响当前屏幕取色,请在合理的位置使用该函数。 4.关于转义字符:\n 为换行,请查阅 Lua 转义字符表。 5.time 参数可省略,如省略将按 0 处理。

函数:dialogRet 带按钮的对话框

函数功能:弹出提示信息,并提供 1 ~ 3 个按钮给用户选择。函数语法:   choice = dialogRet(text, cbtn, btn1, btn2, time)

参数说明:

参数类型说明Text文本型提示信息cbtn文本型默认按钮标题,不需要请填 ""btn1文本型可选按钮 1,不需要请填 ""btn2文本型可选按钮 2,不需要请填 ""time整数型提示信息显示的时间,不限时间请填 0 返回值类型说明choice整数型返回用户按下按钮的序号 cbtn == 0;btn1 == 1;btn2 == 2;如用户在规定显示时间内未进行选择,返回值为 -1

脚本实例:

选择屏幕方向(二选一)   choice = dialogRet("请选择您的屏幕方向:", "横屏", "竖屏", "", 0); 选择屏幕方向(三选一)   choice = dialogRet("请选择您的屏幕方向:", "HOME键在下", "HOME键在左", "HOME键在右", 0); 请阅读许可协议   dialogRet("请花30秒仔细阅读该许可协议。", "", "", "", 30);

注意事项:

1.请勿将三个按钮都设置为空,再将 time 参数设置为 0,这样将造成出现无法消失也没有按钮的 对话框,造成设备无法进行其它操作,只能重启。

函数:dialogInput 带参数的对话框

函数功能:弹出提示信息,并提供 1 ~ 2 个编辑框给用户输入。函数语法:   text_a,text_b = dialogInput(title, format, btn)

参数说明:

参数类型说明title文本型提示标题format文本型编辑框中浅色的提示文字btn文本型确认按钮标题 返回值类型说明text_a,text_b文本型返回用户输入的文本

脚本实例:

输入重复打本的次数   text_a = dialogInput("请输入循环副本的次数", "在这里输入次数", "确认");mSleep(1000); 输入打副本的设置和次数   text_a, text_b = dialogInput("请输入使用的设置方案","在这里输入方案编号#在这里输入次数","确认");mSleep(1000);if text_b ~= "" and text_a ~= "" then --如果均已填写dialog("打本信息:"..text_b.." 次数 "..text_a.." 。", 5);mSleep(1000);else --未填写完整dialog("请完整填写打本的设置信息", 5);mSleep(1000);lua_exit()end

注意事项:

1.使用该函数都要对用户输入的数据进行一定的检查,例如要求非空、长度不得少于。 2.需要注意使用双编辑框时,函数返回的两个字符串顺序与 format中的顺序相反。 3.由于对话框事件需要响应时间,所以建议使用对话框时配合设置相应的延迟。

函数:sysLog 系统日志

函数功能:输出系统日志 NSLog函数语法:   sysLog(contents)

参数说明:

参数类型说明content文本型需要显示的日志内容

返回值:无

注意事项:

1.该函数将日志输出到对应平台的开发窗口 2.该函数可通过setSysConfig设置项"isFileLog"设置为写入日志到文件,详情查看“setSysConfig 设置系统参数”条目(引擎支持:需1.9.00或更新)。

函数:fileLogWrite 输出日志到文件

函数功能:输出日志到文件函数语法:   fileLogWrite(file,date,tag,msg)

参数说明:

参数类型说明file文本型日志名date整数型文件名是否添加日期后缀,0-不添加,1-添加。选择1的文件名称-/tmp/Good-20170401.logtag文本型标签,便于查看日志msg文本型写入日志文件的内容

返回值:无

脚本实例:

  fileLogWrite("Name",1,"INFO","这是写入日志文件的内容")

注意事项:

1.该函数目前仅支持开发助手 2.该函数将日志输出到对应平台日志文件路径: android:/sdcard/ iOS越狱:/tmp/ 3.支持引擎版本:1.7.4或更新

函数:getCloudContent 获取云端自定义公告

函数功能:获取开发者平台公告服务模块中表单的内容函数语法:   content, err = getCloudContent(key,token,default_msg)

参数说明:

参数类型说明key文本型指定需要获取公告服务表中的key值token文本型开发助手调试中用于获取公告服务测试环境表单中数据的调试口令,在开发者平台中获取default_msg文本型(选填)获取key对应value值失败时,将该默认值作为结果返回 返回值类型说明content文本型从公告服务表单中取得对应的value值,正式环境与测试环境的数据分别配置err整数型返回错误的类型:0 - 正常获取,1 - 网络错误,999 - 未知错误

脚本实例:

从开发者平台中配置的数据表中获取文本作为公告发布   content, err = getCloudContent("key", "此处十六位调试口令", "没有正确获取到公告信息") sysLog(string.format("getCloudContent return content = %s, err = %s", tostring(content), tostring(err))); if err == 0 thendialog(content)elseif err == 1 thendialog("网络错误")elseif err == 999 thendialog("未知错误")end 

注意事项:

1.调试口令在开发者平台中生成,用于开发助手测试时获取测试环境的公告服务表单使用,正式环境中该密钥参数不生效。 2.该API需要保证网络通畅才能获取到对应信息,请勿用于存放重要信息。 3.支持引擎版本:1.7.5或更新。

函数:setStringConfig 存字符串

函数功能:将字符串存入配置文件函数语法:   setStringConfig("key","string")

参数说明:

参数类型说明key1文本型将要写入的参数名称string1文本型将要写入参数的内容

返回值:无

脚本实例:

  sex = getStringConfig("gender","male");toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"setStringConfig("gender","female");sex = getStringConfig("gender","male");toast(sex) -- toast结果为新的赋值"female"

函数:getStringConfig 取字符串

函数功能:读取配置文件的字符串函数语法:   ret = getStringConfig("key","default_string")

参数说明:

参数类型说明key1文本型将要读取的参数名称default_string文本型参数"key1"所对应的默认值,如果没有对key1进行新的赋值,或无法找到对key1的赋值,将返回默认值“default_string” 返回值类型说明ret文本型获取到名为"key1"的参数当前的值

脚本实例:

  sex = getStringConfig("gender","male");toast(sex) -- 未对“gender”进行新的赋值,toast结果为默认值"male"setStringConfig("gender","female");sex = getStringConfig("gender","male");toast(sex) -- toast结果为新的赋值"female"

函数:setNumberConfig 存入数值

函数功能:将数值存入配置文件函数语法:   setNumberConfig("key",num)

参数说明:

参数类型说明key2文本型将要写入的参数名称num1数字型将要写入参数的数值

返回值:无

脚本实例:

  a = getNumberConfig("age",18);toast(a) -- toast结果"18"setNumberConfig("age",20);a = getNumberConfig("age",18);toast(a) -- toast结果"20"

函数:getNumberConfig 读取数值

函数功能:读取配置文件的数值函数语法:   num = getNumberConfig("key",default_num)

参数说明:

参数类型说明key2文本型将要读取的参数名称default_num数字型参数"key2"所对应的默认值,如果没有对key2进行新的赋值,或无法找到对key2的赋值,将返回默认值 default_num 返回值类型说明num数字型获取到名为"key2"的参数当前的值

脚本实例:

  a = getNumberConfig("age",18);toast(a) -- toast结果"18"setNumberConfig("age",20);a = getNumberConfig("age",18);toast(a) -- toast结果"20"

函数:readPasteboard 读取剪贴板

函数功能:读写系统剪贴板函数语法:   string = readPasteboard()

参数说明:

返回值类型说明string文本型写入或读出的剪贴板字符串

脚本实例:

从剪贴板中写出到编辑框   string = readPasteboard(); --读取剪贴板内容mSleep(1000); --延迟 1 秒等待响应inputText(string); --输入字符串

函数:writePasteboard 写入剪贴板

函数功能:读写系统剪贴板函数语法:   writePasteboard(string)

参数说明:

参数类型说明string文本型写入的剪贴板字符串

返回值:无

脚本实例:

从文件中读入一行并储存到剪贴板   file = io.open("test.txt" ,"r"); --以只读方式打开一个文本文件if file then --如打开成功writePasteboard(file:read()); --写入到剪贴板file:close(); --关闭文件end

注意事项:

1.该函数将覆盖系统剪贴板,如有重要数据储存在剪贴板请事先备份。

函数:lua_exit 退出脚本执行

函数功能:直接终止脚本。函数语法:   lua_exit()   

参数说明: 返回值:无

脚本实例:

弹出提示框,确认退出则结束脚本执行   ret = dialogRet("该脚本不支持当前手机分辨率", "继续", "退出","",0);if ret == 0 then --如果按下"继续"按钮init("0",0); --开始初始化elselua_exit(); --否则退出脚本end

函数:lua_restart 重载脚本

函数功能:重新加载运行脚本函数语法:   lua_restart()   

参数说明: 返回值:无

注意事项:

此函数作用相当于停止脚本后重新运行脚本。

函数:onBeforeUserExit 脚本运行终止回调

函数功能:在用户主动终止脚本运行之前执行的回调函数函数语法:   onBeforeUserExit()

参数说明: 返回值:无

脚本实例:

当用户在脚本运行过程中主动停止脚本,将会触发 onBeforeUserExit 函数并执行函数体内的语句   function onBeforeUserExit()dialog("OK",0)endfor var = 1,30 domSleep(1000)sysLog("var")end

注意事项:

1.函数名必须为 onBeforeUserExit才能够被识别(旧版本为beforeUserExit,依然兼容),请勿在函数体中使用死循环,否则会造成脚本无法终止或其他不可预料的问题。 2.此函数可以被 lua_exit()、悬浮窗停止、远程接口停止 触发。

函数:getEngineVersion 获取脚本引擎的版本号

函数功能:获取当前应用使用中的脚本引擎的版本号函数语法:   ver = getEngineVersion()

参数说明:

返回值类型说明ver文本型返回当前引擎的版本号

脚本实例:

  ver = getEngineVersion()sysLog(string.format('当前版本号: %s', ver))

函数:getOSType 获取系统类型

函数功能:获取系统类型函数语法:   ver = getOSType()

参数说明:

返回值类型说明ver文本型返回当前系统的类型;android系统返回“android”,iOS系统返回“iOS”

脚本实例:

  ver = getOSType()if ver == "android" thensysLog("安卓系统")elseif ver == "iOS" thensysLog("苹果系统")end

函数:isPrivateMode 获取系统环境类型

函数功能:获取系统环境类型函数语法:   ver = isPrivateMode()

参数说明:

返回值类型说明ver文本型返回当前系统的类型:返回值1、0;1-越狱/ROOT环境;0-免越狱/免ROOT环境

脚本实例:

  ver = isPrivateMode()if ver == 0 thentoast("当前为免越狱/免ROOT环境")elseif ver == 1 then toast("当前为越狱/root环境")end

注意事项:

1.isPriviateMode支持引擎版本:1.7.4或更新 2.isPrivateMode支持引擎版本:1.8.30或更新

函数:getSystemProperty 获取系统常量属性

函数功能:获取系统常量属性,仅安卓可用函数语法:   value = getSystemProperty('key')

参数说明:

参数类型说明key文本型CPU构架 - 'ro.arch'; 手机产品号 - 'ro.build.product' 返回值类型说明value文本型返回所获取的系统常量属性结果

脚本实例:

  sysLog('CPU构架: ' .. getSystemProperty('ro.arch'))sysLog('手机产品号:' .. getSystemProperty('ro.build.product'))

函数:getLocalInfo 获取当前系统语言属性

函数功能:获取当前系统语言属性函数语法:   ret = getLocalInfo()

参数说明:

返回值类型说明ret文本型获取到的当前系统语言,格式:语言-国家,例如:zh-CN, es-US,用于支持多语言脚本适配

脚本实例:

  ret = getLocalInfo()sysLog(string.format('当前系统语言: %s', ret))

函数:getUserID 获取用户ID

函数功能:获取用户的识别ID函数语法:   id = getUserID()

参数说明:

返回值类型说明id文本型表示拿到的用户的ID,没有登录时则返回null

脚本实例:

  sysLog("id: "..getUserID())

函数:getScriptID 获取脚本ID 

函数功能:获取脚本的识别ID函数语法:   id = getScriptID()

参数说明:

返回值类型说明id文本型表示拿到的脚本上架的ID,否则返回-1

脚本实例:

  sysLog("id: "..getScriptID())

注意事项:

支持引擎版本:1.8.30或更新

函数:getScreenDPI 获取当前设备屏幕DPI

函数功能:获取当前设备屏幕DPI,仅安卓适用函数语法:   ret = getScreenDPI()

参数说明:

返回值类型说明ret文本型返回的当前设备屏幕DPI

脚本实例:

  ret = getScreenDPI()sysLog(string.format('当前设备屏幕DPI: %s', ret))

函数:getDeviceIMEI 获取当前设备IMEI码

函数功能:获取当前设备IMEI码,仅安卓适用函数语法:   ret = getDeviceIMEI()

参数说明:

返回值类型说明ret文本型返回的当前设备IMEI码

脚本实例:

  ret = getDeviceIMEI()sysLog(string.format('当前设备IMEI码: %s', ret))

函数:getDeviceIMSI 获取当前设备IMSI码

函数功能:获取当前设备IMSI码,仅安卓适用函数语法:   ret = getDeviceIMSI()

参数说明:

返回值类型说明ret文本型返回的当前设备IMSI码

脚本实例:

  ret = getDeviceIMSI()sysLog(string.format('当前设备IMSI码: %s', ret))

函数:getDeviceUUID 获取当前设备UUID

函数功能:获取当前设备UUID,仅iOS适用函数语法:   ret = getDeviceUUID()

参数说明:

返回值类型说明ret文本型返回的当前设备UUID

脚本实例:

  ret = getDeviceUUID()sysLog(string.format('当前设备UUID: %s', ret))

函数:getBatteryLevel 获取电池状态

函数功能:获取电池充电状态、电量函数语法:   charge,level = getBatteryLevel()

参数说明:

返回值类型说明charge整数型0表示没充电,1表示充电 (充电状态未知返回-1,同时剩余电量为-1)level整数型表示剩余电量,0-100

脚本实例:

  charge,level = getBatteryLevel()if charge == 0 thentoast("当前电池未充电,电量剩余 "..level)elseif charge == 1 thentoast("当前电池充电中,电量剩余 "..level)elseif charge == -1 thentoast("当前电池充电状态未知,电量剩余未知")end

注意事项:

1.支持引擎版本:1.7.4或更新

函数:getScreenDirection 获取屏幕方向

函数功能:获取设备当前屏幕方向函数语法:   ret = getScreenDirection()

参数说明:

返回值类型说明ret整数型Android:0-竖屏, 1-橫屏; iOS:0-竖屏,1-横屏(Home右),2-横屏(Home左), -1(Unknow)

脚本实例:

  ret = getScreenDirection()if ret == 0 thentoast("当前屏幕方向为竖屏")elseif ret == 1 thenver = getOSType()if ver == "iOS" thentoast("当前屏幕方向为横屏,HOME键在右")elseif ver == "android" thentoast("当前屏幕方向为横屏")endelseif ret == 2 then toast("当前屏幕方向为横屏,HOME键在左")elseif ret == -1 thentoast("当前屏幕方向Unknow")end

注意事项:

1.iOS版开发助手中该函数返回值跟随init指定的方向,未指定的情况下返回值为-1。 2.支持引擎版本:1.7.4或更新

函数:getUserCredit 获取用户付费类型和套餐剩余时间

函数功能:获取用户付费类型和套餐剩余时间函数语法:   buyState,validTime,res=getUserCredit()

参数说明:

返回值类型说明buyState整数型用户付费类型,1 - 付费用户,2 - 试用用户,3 - 免费用户,0 - 非购买非试用validTime整数型用户当前套餐购买时长,单位为秒,试用用户的情况下会返回0res整数型返回错误代码,0 - 正常, 非0 - 出错

脚本实例:

  buyState,validTime,res=getUserCredit()if buyState ~= 0 thendialog("您是付费用户")end

注意事项:

1.支持引擎版本:1.8.30或更新

函数:getRuntimeMode 获取脚本运行模式(安卓专用)

函数功能:获取脚本运行模式,用于区分哪种运行模式跑脚本函数语法:   int = getRuntimeMode()

参数说明:

返回值类型说明int整数型脚本运行模式,0 - 通用模式(当做“免root免激活”处理),1 - 低版本兼容模式(当做“免root免激活”处理),2 - 极客模式(root或者激活)

脚本实例:

  int = getRuntimeMode()if int == 0 thendialog("当前模式:通用模式")end

注意事项:

1.支持引擎版本:1.9.312或更新

函数:getProduct 获取当前运行产品

函数功能:获取当前运行脚本产品函数语法:   int = getProduct()

参数说明:

返回值类型说明int整数型1-叉叉/免root叉叉;2-内部使用;3-开发助手;4-内部使用;5-叉叉IPA精灵;6-叉叉小精灵;7-叉叉酷玩;8-叉叉云游

脚本实例:

  --打印产品idproduct_id = getProduct()if product_id ~= nil thensysLog("product_id="..product_id);end

注意事项:

1.支持引擎版本:1.9.23或更新

函数:createHUD 创建HUD内容

函数功能:创建、显示、隐藏HUD内容函数语法:   id = createHUD()

参数说明:

返回值类型说明id整数型用于标示HUD

脚本实例:

  init("0",1)id = createHUD() --创建一个HUDshowHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容mSleep(2000)showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容mSleep(5000)hideHUD(id) --隐藏HUDmSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。 2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:showHUD 显示HUD内容

函数功能:创建、显示、隐藏HUD内容函数语法:   showHUD(id,text,size,color,bg,pos,x,y,width,height)

参数说明:

参数类型说明id整数型用于标示HUDtext文本型提示信息,将在屏幕上以HUD形式显示size整数型表示提示信息的字体大小color文本型表示提示信息的字体颜色,格式为ARGBbg文本型表示提示信息的背景颜色,可以是ARGB,也可以是图片文件名称pos整数型表示提示信息的原点位置,0 - 左上角,1 - 居中,2 - 水平居中, 3 - 垂直居中x,y整数型表示提示信息相对原点的坐标偏移值width,height整数型表示提示信息显示的宽高

返回值:无

脚本实例:

  init("0",1)id = createHUD() --创建一个HUDshowHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容mSleep(2000)showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容mSleep(5000)hideHUD(id) --隐藏HUDmSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。 2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:hideHUD 隐藏HUD内容

函数功能:创建、显示、隐藏HUD内容函数语法:   hideHUD(id)

参数说明:

参数类型说明id整数型用于标示HUD

返回值:无

脚本实例:

  init("0",1)id = createHUD() --创建一个HUDshowHUD(id,"欢迎使用叉叉脚本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --显示HUD内容mSleep(2000)showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --变更显示的HUD内容mSleep(5000)hideHUD(id) --隐藏HUDmSleep(3000)

注意事项:

1.隐藏标示为id的HUD信息后,如需再次显示HUD信息内容,需要使用createHUD函数再次创建。 2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。

函数:asyncExec 异步网络请求

函数功能:asyncExec 异步httpget、httppost请求函数语法:   asyncExec({    type,    immediate,    url,    headers,    content,    callback   })

参数说明:

参数类型说明type文本型目前仅支持httpget和httppostimmediate逻辑型是否独立开启新线程运行(建议使用默认值false)url文本型请求地址headers文本型网络请求头设置,格式key1:value1#key2:value2#...content文本型httppost网络请求的附加数据callback函数网络请求结果回调函数,接受参数table = {code[int], data[string]}

返回值:无

脚本实例:

  local function urlencode(w)pattern = "[^%w%d%?=&:/._%-%* ]"s = string.gsub(w, pattern, function(c)local c = string.format("%%%02X", string.byte(c))return cend)s = string.gsub(s, " ", "+")return send -- 异步httpget请求asyncExec({type = "httpget", -- [string] 指定httpget类型immediate = false, -- [bool] 默认false, 设置true会独立开启线程执行任务url = urlencode("http://httpbin.org/get?x=测试x&y=测试y"), -- [string] 请求的URL地址,出现中文字符时需要使用urlencode进行编码callback = function (result) -- [function] 请求回调函数-- 回调结果tableassert(type(result) == "table")--[[返回数据格式: { code = [int]错误码, data = [string]服务器返回数据 }code -1: 请求出错-2: 请求超时-3: 强制关闭其他: 同http status code]]--sysLog("httpget callback: code = " .. result.code .. " data = " .. result.data)-- 注意: 虽然请求会异步执行, 但回调函数依然在lua主线程执行, 不要在回调里执行其他阻塞操作end}) -- 异步httppost请求asyncExec({type = "httppost", -- [string] 指定httppost类型immediate = true, -- [bool] 默认false, 设置true会独立开启线程执行任务url = "http:/httpbin.org/post", -- [string] 请求的URL地址headers = "User-Agent:Test-Agent#Accept-Language:zh-CN", -- [string] 请求头设置content = "test content 2", -- [string] post请求的数据callback = function (result) -- [function] 请求回调函数-- 回调结果tableassert(type(result) == "table")-- httpget和httppost返回数据格式一致sysLog("httppost callback: code = " .. result.code .. " data = " .. result.data)end}) local t = 0while t < 10 domSleep(1000)t = t + 1end

注意事项:

1.不论immediate为true还是false,asyncExec的网络请求总是会在Lua线程之外的线程运行,区别是immediate设置为false时,使用已有的常驻线程(sentinel thread)运行,多次运行使用同一个线程;而immediate为true是,会即时创建一个新的线程独立运行任务,多次运行创建多个线程 2.headers设置仅在引擎版本1.8.30及以上生效,所有HTTP headers设置可以参阅 https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

函数:setUIOrientation 设置UI方向和HUD方向

函数功能:设置UI方向和HUD方向,仅iOS可用函数语法:   setUIOrientation(mode)

参数说明:

参数类型说明mode整数型用于设置UI及HUD的全局方向类型,0表示跟随游戏;1表示home在右侧;2表示home在左侧

返回值:无

脚本实例:

  init("",1)setUIOrientation(0)

注意事项:

1.只适用于iOS系统,Andorid系统不可用

badboy开源工具库

Badboy是专为叉叉脚本引擎开发的工具类,代码全部以开源的方式提供,目前有以下的模块:

进入https://github.com/boyliang/lua_badboy,下载项目源码;把项目当中内容,复制到src目录下;在main.lua中加入你的脚本逻辑;使用xsp打包工具即完成out.xsp

使用方法: 请在脚本开头插入 local bb = require("badboy") 即可调用扩展库中所有函数。

JSON模块

newArray 新建数组对象 newObject 新建对象 decode json字符串转成talbe对象 encode table对象转换成压缩的json字符 encode_pretty table对象转换成优雅的json字符

脚本实例:

  local bb = require("badboy")local json = bb.getJSON()local lua_value = json.decode('{"a": 1, "b":"boy", "c":{"d":1}}')local a_value = lua_value.a -- =1local b_balue = lua_value.b -- ="boy"local c_d_balue = lua_value.c.d -- =1 local raw_json_text = json.encode(lua_value)local pretty_json_text = json.encode_pretty(lua_value) sysLog(raw_json_text)sysLog(pretty_json_text)

StringUtils模块

toCharTable 从字符串转字符数组 fromCharTable 从字符数组转字符串 toByteTable 从字符串转字节数组 fromByteTale 从字节数组转字符串 contains 是否包含子串 startWith 是否以某个子串开头 endsWith 是否以某个子中结束 ...更多API请关注badboy项目源码文件\bblibs\StrUtilsAPI.lua

脚本实例:

  local bb = require("badboy")local strutils = bb.getStrUtils()local str = 'i am a badboy' --十六进制编码转换、SHA1计算、MD5计算local hex = str:tohex() -- 等同于 strutils.toHex(str)local sha1 = str:sha1() -- 等同于 strutils.SHA1(str)local md5 = str:md5() -- 等同于 strutils.md5(str) sysLog('hex:' .. hex)sysLog('sha1:' .. sha1)sysLog('md5:' .. md5) 输出内容:hex:69:20:61:6D:20:61:20:62:61:64:62:6F:79sha1:43386755b0ff2899e0a7895c45a0c051468d06cdmd5:0663e75e1087668c30b527f5d9519185

UI模块

RootView:create 构造UI根对象 RootView:addView 添加子view RootView:removeView 删除子view RootView:removeViewByID 删除子view Page:create 构建Page控件 Page:addView 添加子view Page:removeView 删除子view Page:removeViewByID 删除子view Image:create 构造Image控件 Edit:create 构造Edit控件 Label:create 构造Label控件 ...(所有属性都可以直接通过对象访问)

  local bb = require("badboy")bb.loaduilib()local json = bb.getJSON()local rootview = RootView:create({style = ViewStyle.CUSTOME})local page = Page:create("page")page.text = "Page1"local page2 = Page:create("page2")page2.text = "Page2"local label = Label:create("Label", {color = "255, 255, 0"})label.text = "I love XX"local image = Image:create("image")image.src = "bg.png"local edit = Edit:create("edit", {prompt = "提示"})edit.align = TextAlign.LEFT local radiogroup = RadioGroup:create("radiogroup")radiogroup:setList('男', '女', '嬲', '奻')radiogroup:setSelect(3) local checkboxgroup = CheckBoxGroup:create('checkboxgroup')checkboxgroup:setList('XX', 'OO', 'AA', 'BB')checkboxgroup:setSelects(2, 3) rootview:addView(page) --把page添加到rootviewrootview:addView(page2) page:addView(label) --把label添加到page-- page:addView(label) --label的id重复,这里会报错page:addView(image) --把image添加到pagepage:addView(checkboxgroup)page:addView(radiogroup)page:removeView(label1) --从page中删除label uijson = json.encode(rootview)showUI(uijson)

POS模块

distanceBetween 计算距离 click 单击 touchMoveTo 精确滑动 angleBetween 计算角度 polarProjection 根据角度和距离找点 isColorClick 根据颜色进行点击

  local bb = require("badboy")local pos = bb.loadpos()p1 = pos:new(0, 0, 0x123456)p2 = pos:new(1, 2)sysLog(p1:distanceBetween(p2))sysLog(p1:angleBetween(p2))p2 = p1:polarProjection(4, 30)sysLogFmt('p2[%d, %d]', p2.x, p2.y)

utils模块

sysLogFmt 格式化字符串输出 sysLogLst 任意内容输出 tap 模拟一次点击 swip 模拟一次滑动 cmpColor 指定颜色对比

  -- utils testlocal bb = require("badboy")bb.loadutilslib()i = 3j = 6.9s = 'good boy'sysLogFmt('i=%d, j=%f, s=%s', i, j, s)sysLogLst(i, j, s)

LuaSocket模块

LuaSocket 是 Lua 的网络模块库,它可以很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。详细使用说明关注badboy项目源码文件main.lua,API参考见http://w3.impa.br/~diego/software/luasocket/reference.html

DNS

  local bb = require("badboy")bb.loadluasocket()local socket = bb.socketlocal dns = socket.dnssysLog('localhostIP: ' .. dns.toip('localhost'))sysLog('result: ' .. (dns.tohostname('59.37.96.63') or 'nil'))sysLog('hostname: ' .. dns.gethostname())sysLog('addinfo: ' .. tostring(dns.getaddrinfo('localhost')))

httpGet请求

  local bb = require("badboy")bb.loadluasocket()local http = bb.httplocal ltn12 = bb.ltn12res, code = http.request('http://www.baidu.com')-- 等价于 -- local response_body = {} -- res, code = http.request({-- url = 'http://www.baidu.com', -- sink = ltn12.sink.table(response_body)-- })if code == 200 thensysLog(res)dialog(res, 0)end --获取外网ip地址 local bb = require("badboy")bb.loadluasocket()local http = bb.httplocal res, code = http.request('http://www.ip.cn/');if code == 200 thenlocal i,j = string.find(res, '%d+%.%d+%.%d+%.%d+')local ipaddr =string.sub(res,i,j)dialog(ipaddr, 0)end

1.返回的2个参数中,res 是 http body 的内容,也就是请求网页的内容,code 是 http 状态码,返回200的话就表示正常返回。 2.如果传入的是 table 的话,就需要用一个容器来接收 http body 的内容。

httpPost请求

  local bb = require("badboy")bb.loadluasocket()local http = bb.httplocal response_body = {}local post_data = 'asd'; res, code = http.request{ url = 'http://127.0.0.1/post.php', method = "POST", headers = { ['Content-Type'] = 'application/x-www-form-urlencoded', ['Content-Length'] = #post_data, }, source = ltn12.source.string('data=' .. post_data), sink = ltn12.sink.table(response_body) }

1.这里注意记得 method 传入 POST, 因为默认是 GET。 2.headers 参数,由一个 table 组成,key 为 header,value 为 header 内容。 3.source 参数,这里是填入 POST 的参数,多个数据的情况用 & 隔开,例如 "data1=a&data2=b"。 4.此代码仅为举例说明,请勿直接复制使用。

挂载代理

  local bb = require("badboy")bb.loadluasocket()local http = bb.httphttp.PROXY = 'http://127.0.0.1:8888' --代理服务器地址local result, code = http.request('http://www.baidu.com')dialog(result or tostring(code), 0)

以socket的方式访问

  local bb = require("badboy")bb.loadluasocket()local http = bb.httplocal host = 'www.baidu.com'local file = "/"local sock = assert(socket.connect(host, 80)) --创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上sock:send('GET ' .. file .. ' HTTP/1.0\r\n\r\n')repeatlocal chunk, status, partial = sock:receive(1024) --以 1K 的字节块接收数据until status ~= 'closed'sock:close() -- 关闭 TCP 连接

smtp方法发送email

  local bb = require("badboy")bb.loadluasocket()local smtp = bb.smtpfrom = '<youmail@126.com>' -- 发件人--发送列表rcpt = {'<youmail@126.com>','<youmail@qq.com>','<youmail@gmail.com>',}mesgt = {headers = {to = 'youmail@gmail.com', -- 收件人cc = '<youmail@gmail.com>', -- 抄送subject = "This is Mail Title"},body = "邮件内容"} r, e = smtp.send{server = "smtp.126.com", --smtp服务器地址user = "youmail@126.com",--smtp验证用户名password = "******", --smtp验证密码 from = from,rcpt = rcpt,source = smtp.message(mesgt)} if not r thendialog(e, 0)elsedialog('发送成功!', 0)end

实现获取网络时间

  local bb = require("badboy")bb.loadluasocket()local socket = bb.socketserver_ip = {"132.163.4.101","132.163.4.102","132.163.4.103","128.138.140.44","192.43.244.18","131.107.1.10","66.243.43.21","216.200.93.8","208.184.49.9","207.126.98.204","207.200.81.113","205.188.185.33"} local function nstol(str)assert(str and #str == 4)local t = {str:byte(1,-1)}local n = 0for k = 1, #t don= n*256 + t[k]endreturn nend local function gettime(ip)local tcp = socket.tcp()tcp:settimeout(10)tcp:connect(ip, 37)success, time = pcall(nstol, tcp:receive(4))tcp:close()return success and time or nilend local function nettime()for _, ip in pairs(server_ip) dotime = gettime(ip)if time then return timeendendend dialog(nettime(),0)

统计毫秒精度时间

  local bb = require("badboy")bb.loadluasocket()local socket = bb.socketlocal function sleep(sec)socket.select(nil,nil,sec);endlocal t0 = socket.gettime()sleep(0.4);local t1 = socket.gettime()dialog(t1 - t0, 0)

FTP 测试

  local bb = require("badboy")bb.loadluasocket() -- [ftp://][<user>[:<password>]@]<host>[:<port>][/<path>][type=a|i]-- The following constants in the namespace can be set to control the default behavior of the FTP module:-- PASSWORD: default anonymous password.-- PORT: default port used for the control connection;-- TIMEOUT: sets the timeout for all I/O operations;-- USER: default anonymous user; local ftp = bb.ftp -- Log as user "anonymous" on server "ftp.tecgraf.puc-rio.br",-- and get file "lua.tar.gz" from directory "pub/lua" as binary.f, e = ftp.get("ftp://ftp.tecgraf.puc-rio.br/pub/lua/lua.tar.gz;type=i") -- Log as user "fulano" on server "ftp.example.com",-- using password "silva", and store a file "README" with contents -- "wrong password, of course"f, e = ftp.put("ftp://fulano:silva@ftp.example.com/README", "wrong password, of course") -- Log as user "fulano" on server "ftp.example.com",-- using password "silva", and append to the remote file "LOG", sending the-- contents of the local file "LOCAL-LOG"f, e = ftp.put{host = "ftp.example.com", user = "fulano",password = "silva",command = "appe",argument = "LOG",source = ltn12.source.file(io.open("LOCAL-LOG", "r"))}

取色器使用说明

取色器需连接到设备才能使用

抓图说明: 截图:于设备截图,会出现精度条圆圈标志,等待时间过长或其他意外情况 点击叉或者按Esc结束.截图后显示图片,右键图片名显示菜单,可关闭图片 保存:保存当前图片 载入:载入图片,也可以拖入图片 左转:左边旋转90度 右转:右边旋转90度 放大:快捷键ctrl + 滚轮上, 放大当前图片 缩小:快捷键ctrl + 滚轮下, 缩小当前图片 1:1 :快捷键ctrl + o, 100%显示当前图片 截图旋转方向: 截图默认旋转的方向 Home键在下相当于init("0", 0) Home键在右相当于init("0", 1) Home键左相当于init("0", 2)

尺寸显示:旋转后改变方向 取色:快捷键 1,2,3,4,5,6,7,8,9,0 或鼠标右键菜单取色 取色微调:键盘上下左右方向键移动

取色器快捷键表

数字键(1 2 3 4 5 6 7 8 9 0) 分别取色到第1~10个位置

Ctrl + 数字键(1 2 3 4 5 6 7 8 9 0) 分别取色到11~20个位置

A、S 取 [坐标位 A] 和 [坐标位 S] 作为左上右下坐标到选择范围

光标(↑ ↓ ← →) 鼠标指针定位移动 1 个像素

回车键/Ctrl + 鼠标左键点击 取色到剪贴板的首个空白位置,已取色的位置不会被覆盖,如果无空白位置则不取色

Shift + Delete 清除已勾选的点色信息

Ctrl + Shift + Delete 清除所有点色信息

F5 刷新所有点色信息为当前图片的值

Ctrl + L/Ctrl + R 分别对代码窗口1、2的内容进行代码测试

Shift + L/Shift + R 分别复制代码窗口1、2的内容

- 缩小视图

= 放大视图

Ctrl + Tab 切换到下一个文档

Ctrl + Shift + Tab 切换到上一个文档

放大镜功能说明: 选择范围: A,S快捷键或 按钮点击选择范围.会出现红色线,按Esc键取消选择.注意选取范围时可鼠标滚动滚轮 颜色数据反选:在复选框上按住鼠标左键往下或者往上拖动,移动范围内反选颜色数据 可全选全删

格式:自定义生成代码. 在IDE目录下data.lua可以编辑格式 在datacolorfg中自己添加格式为:

  {title = "",fScript = function(poslist,area, degree)end,sScript = function (poslist,area, degree)end,}

+

         
最新回复(0)