@xxzhushou
2018-11-26 15:38
字數 66115
閱讀 301220
叉叉腳本開發手冊
叉叉腳本
引擎版本: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 獲取腳本運行模式(安卓專用)
- 函數:createHUD 創建HUD內容
- 函數:showHUD 顯示HUD內容
- 函數:hideHUD 隱藏HUD內容
- 函數:asyncExec 異步網絡請求
- 函數:setUIOrientation 設置UI方向和HUD方向
- badboy開源工具庫
- JSON模塊
- StringUtils模塊
- UI模塊
- POS模塊
- utils模塊
- LuaSocket模塊
- 取色器使用說明
前言
叉叉腳本使用 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 運行應用 | 不支持 | 無效,返回非0 |
closeApp 關閉應用 | 不支持 | 無效,無返回值 |
setWifiEnable 設置無線局域網開關 | 不支持 | 無效,返回false |
setAirplaneMode 設置飛行模式開關 | 不支持 | 無效,返回false |
setBTEnable 設置藍牙開關 | 不支持 | 無效,返回false |
lockDevice 鎖定設備 | 不支持 | 無效,無返回值 |
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);
end
tap(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); --延遲
end
touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
- 多點觸控
touchDown(1, 100, 100); --ID為1的手指在 (100, 100) 按下
touchDown(2, 300, 500); --ID為2的手指在 (300, 500) 按下
mSleep(50);
for i = 1, 100, 1 do --使用 for 循環使兩只手指向不同方向分離
touchMove(1, 200 - i, 400 - i);
touchMove(2, 300 + i, 500 + i);
mSleep(50);
end
touchUp(1, 200 - 100, 400 - 100);
touchUp(2, 300 + 100, 500 + 100); --分別抬起2只手指
注意事項:
需要注意的是在使用 touchDown、touchUp 函數時,中間一定要插入一定的延時,建議大於 20毫秒,否則可能會出現點擊無效等異常情況。
函數:touchUp 觸摸抬起
函數功能:發送觸摸事件
函數語法:
touchUp(index, x, y)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
index | 整數型 | 手指序號,用於多點觸控中標記多只手指,分別控制它們的移動 |
x,y | 整數型 | 屏幕坐標 |
返回值:無
腳本實例:
- 划動
touchDown(1, 150, 150); --ID為1的手指在 (150, 150) 按下
mSleep(50);
touchMove(1, 150, 400); --移動到 (150, 400)
mSleep(50);
touchUp(1, 150, 400); --在 (150, 400) 抬起
- 連續划動
touchDown(1, 150, 550); --在 (150, 550) 按下
for i = 0, 200, 10 do --使用for循環連續滑動
touchMove(1, 150 + i, 550);
mSleep(150); --延遲
end
touchUp(1, 150 + 200, 550); --在 (350, 550) 抬起
- 多點觸控
touchDown(1, 100, 100); --ID為1的手指在 (100, 100) 按下
touchDown(2, 300, 500); --ID為2的手指在 (300, 500) 按下
mSleep(50);
for i = 1, 100, 1 do --使用 for 循環使兩只手指向不同方向分離
touchMove(1, 200 - i, 400 - i);
touchMove(2, 300 + i, 500 + i);
mSleep(50);
end
touchUp(1, 200 - 100, 400 - 100);
touchUp(2, 300 + 100, 500 + 100); --分別抬起2只手指
注意事項:
需要注意的是在使用 touchDown、touchUp 函數時,中間一定要插入一定的延時,建議大於 20毫秒,否則可能會出現點擊無效等異常情況。
函數:catchTouchPoint 獲取用戶點擊坐標
函數功能:調用該函數后,將等待用戶完成一次或多次屏幕點擊,並返回點擊的坐標
函數語法:
results = catchTouchPoint(touchCount)
x,y = catchTouchPoint()
參數說明:
參數 | 類型 | 說明 |
---|---|---|
touchCount | 整數型 | 所需獲取的 點/坐標 個數 |
返回值 | 類型 | 說明 |
---|---|---|
x,y | 整數型 | 單次點擊時,返回該點擊對應的屏幕坐標 |
results | table型 | 當touchCount參數有效時,將返回一個包含所有點擊坐標的table |
腳本實例:
- 獲取單個點擊坐標
dialog("請點擊屏幕一次", 0);
x,y = catchTouchPoint();
mSleep(1000);
dialog("x:"..x.." y:"..y, 0);
- 獲取多個點擊坐標
local results = catchTouchPoint(3);
for i = 1, #results do
sysLog("第"..i.."個坐標為:"..i..",x="..results[i].x..",y="..results[i].y);
end
注意事項:
1.此函數觸發后將一直等待用戶完成屏幕點擊,並阻止腳本繼續運行。
2.此函數獲取到的坐標為豎屏坐標,橫屏情況需要自行轉換。
3.此函數有較小的延遲,連續點擊時,請勿點擊過快。
函數: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表示從右到左,默認為0 |
vdir | 整數型 | [選填]垂直搜索方向,0表示從上到下,1表示從下到上,默認為0 |
priority | 整數型 | [選填]搜索優先級,0表示水平優先,1表示垂直優先,默認為0 |
說明:
1.起始點坐標值填寫0,0時,偏移位置坐標值使用相對坐標;填寫為非0,0的坐標時,則認為偏移位置坐標為絕對坐標,找色時,將根據填寫的絕對坐標換算出的相對坐標進行尋找。
2.偏移位置顏色的偏色值或精度可任意選用,同時填寫了偏色值和精度時,將以偏色為准,忽略精度值。
3.個別偏移位置顏色偏色值或精度優先於全局找色精度,全局找色精度對未指定偏色或精度的顏色有效。
返回值 | 類型 | 說明 |
---|---|---|
x,y | 整數型 | 找到的點坐標,如未找到則返回 -1,-1 |
腳本實例:
- 精確尋找指定單色的坐標
x, y = findColor({50, 50, 300, 300},0x112233)
if x ~= -1 and y ~= -1 then --如指定區域找到符合條件的某點
touchDown(1, x, y); --點擊該點
mSleep(50)
touchUp(1, x, y);
else --如找不到符合條件的點
dialog("沒找到你要的坐標呢",0);
end
使用以上方法找色時,常常會因為屏幕上有大量符合指定顏色的點而不能找到需要的坐標。該函數通過在尋找到一個符合指定顏色color的坐標后,進一步確認其周邊點坐標的方式,來確定准確目標。例如,現在我們在圖像上找到了我們需要的一個按鈕,這個按鈕的樣式是不變的,但是它的整體位置卻會在整個屏幕上變化,現在我們想要在腳本運行時得到其坐標。
首先確定一個參照點:
顏色為 0x181F85,坐標為 (268, 802),下表序號1。
記錄下來,繼續尋找周邊的幾個參照點,以及與第一個參照點的相對坐標,分別為下表序號2~4:
現在我們找到了需要的所有參照點:
序號 | 顏色 | 坐標 | 相對坐標 |
---|---|---|---|
1 | 0x181F85 | (268, 802) | (0, 0) |
2 | 0x00BBFE | (297, 803) | (29, 1) |
3 | 0x0B6BBE | (371, 798) | (103, -4) |
4 | 0x150972 | (333, 811) | (65, 9) |
應用上述坐標寫成多點找色腳本(以下4種任選1種):
- 相對坐標的寫法:
x, y = findColor(
{0, 0, 639, 959},
"0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-0x050505,65|9|0x150972")
x, y = findColor(
{0, 0, 639, 959},
{
{x = 0, y = 0, color = 0x181F85},
{x = 29, y = 1, color = 0x00BBFE, degree = 90},
{x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},
{x = 65, y = 9, color = 0x150972}
})
- 絕對坐標的寫法:
x, y = findColor(
{0, 0, 639, 959},
"268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972")
x, y = findColor(
{0, 0, 639, 959},
{
{x = 268, y = 802, color = 0x181F85},
{x = 297, y = 803 color = 0x00BBFE, degree = 90},
{x = 371, y = 798 color = 0x0B6BBE, offset = 0x050505},
{x = 333, y = 811 color = 0x150972}
})
新舊多點找色API對比:
findColorInRegionFuzzy = function(tcolor, degree, x1, y1, x2, y2, hdir, vdir)
return findColor(
{x1, y1, x2, y2},
tcolor,
degree,
hdir or 0,
vdir or 0
)
end
findMultiColorInRegionFuzzy = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)
return findColor(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
findMultiColorInRegionFuzzy2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})
return findColor(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
關於搜索方向:
hdir | vdir | priority | 區域搜索路徑 |
---|---|---|---|
0 | 0 | 0 | 左上角 右上角 左下角 右下角 |
0 | 0 | 1 | 左上角 左下角 右上角 右下角 |
0 | 1 | 0 | 左下角 右下角 左上角 右上角 |
0 | 1 | 1 | 左下角 左上角 右下角 右上角 |
1 | 0 | 0 | 右上角 左上角 右下角 左下角 |
1 | 0 | 1 | 右上角 右下角 左上角 左下角 |
1 | 1 | 0 | 右下角 左下角 右上角 左上角 |
1 | 1 | 1 | 右下角 右上角 左下角 左上角 |
注意事項:
1.未找到則返回 (-1, -1) ,所以找到時 x, y 均不等於 -1,~= 為不等於操作符,是 Lua 基本語法, 屬於邏輯控制。
2.該代碼應用過程中,建議使用"保持屏幕"優化找色速度。
3.顏色值的十六進制文本中,其順序為RGB。
4.相對坐標為偏移位置坐標相對於第一個點的坐標,即用這個點的橫坐標、縱坐標分別減去第一個點的橫坐標、縱坐標,可以為負數。
5.使用此函數時精度參數設置過低或允許的偏色多大,會導致性能大幅下降。
6.支持引擎版本:1.8.30或更新
函數: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表示從右到左,默認為0 |
vdir | 整數型 | [選填]垂直搜索方向,0表示從上到下,1表示從下到上,默認為0 |
priority | 整數型 | [選填]搜索優先級,0表示水平優先,1表示垂直優先,默認為0 |
說明:
1.起始點坐標值填寫0,0時,偏移位置坐標值使用相對坐標;填寫為非0,0的坐標時,則認為偏移位置坐標為絕對坐標,找色時,將根據填寫的絕對坐標換算出的相對坐標進行尋找。
2.偏移位置顏色的偏色值或精度可任意選用,同時填寫了偏色值和精度時,將以偏色為准,忽略精度值。
3.個別偏移位置顏色偏色值或精度優先於全局找色精度,全局找色精度對未指定偏色或精度的顏色有效。
返回值 | 類型 | 說明 |
---|---|---|
point | table類型 | 以 table 形式返回所有符合條件的參照點的坐標,如未找到則返回的table為空 |
返回的 table 為key-value的形式,如下:
point = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}
腳本實例:
point = findColors(
{0, 0, 639, 959},
0x181F85)
if #point ~= 0 then --如果找到符合條件的點
for var = 1, #point do
sysLog(point[var].x..":"..point[var].y)
end
end
point = findColors(
{0, 0, 639, 959},
"0|0|0x181F85,29|1|0x00BBFE|90,103|-4|0x0B6BBE-050505,65|9|0x150972")
if #point ~= 0 then --如果找到符合條件的點
for var = 1, #point do
sysLog(point[var].x..":"..point[var].y)
end
end
- 相對坐標的寫法:
point = findColors(
{0, 0, 639, 959},
{
{x = 0, y = 0, color = 0x181F85},
{x = 29, y = 1, color = 0x00BBFE, degree = 90},
{x = 103, y = -4, color = 0x0B6BBE, offset = 0x050505},
{x = 65, y = 9, color = 0x150972}
})
- 絕對坐標的寫法:
point = findColors(
{0, 0, 639, 959},
"268|802|0x181F85,297|803|0x00BBFE|90,371|798|0x0B6BBE-050505,333|811|0x150972")
point = findColors(
{0, 0, 639, 959},
{
{x = 268, y = 802, color = 0x181F85},
{x = 297, y = 803, color = 0x00BBFE, degree = 90},
{x = 371, y = 798, color = 0x0B6BBE, offset = 0x050505},
{x = 333, y = 811, color = 0x150972}
})
新舊高級多點區域找色API對比:
findMultiColorInRegionFuzzyExt = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
posandcolors = string.format("0|0|0x%x,%s", tcolor, posandcolors)
return findColors(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
findMultiColorInRegionFuzzyExt2 = function(tcolor, posandcolors, degree, x1, y1, x2, y2, hdir, vdir)
table.insert(posandcolors, 1, {x = 0, y = 0, color = tcolor})
return findColors(
{x1, y1, x2, y2},
posandcolors,
degree,
hdir or 0,
vdir or 0
)
end
注意事項:
1.高級區域多點找色函數目前最多支持返回99個。
2.支持引擎版本:1.8.30或更新
函數: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表示從右到左,默認為0 |
vdir | 整數型 | 垂直搜索方向,0表示從上到下,1表示從下到上,默認為0 |
返回值 | 類型 | 說明 |
---|---|---|
x,y | 整數型 | 找到的點坐標,如未找到則返回 -1,-1 |
腳本實例:
- 精確尋找指定顏色的坐標
x, y = findColorInRegionFuzzy(0x112233, 100, 50, 50, 300, 300);
if x ~= -1 and y ~= -1 then --如指定區域找到符合條件的某點
touchDown(1, x, y); --點擊該點
mSleep(50)
touchUp(1, x, y);
else --如找不到符合條件的點
dialog("沒找到你要的坐標呢",0);
end
- 模糊查找接近指定顏色的坐標
for deg = 100, 70, -1 do --使用 for 循環不斷降低精確度
x, y = findColorInRegionFuzzy(0xffffff, deg, 50, 50, 300, 300);
if x ~= -1 and y ~= -1 then --如指定區域找到符合條件的某點
touchDown(1, x, y); --點擊該點
mSleep(50)
touchUp(1, x, y);
break; --跳出循環
end
end
dialog("噢天哪!還是沒找到",0);
注意事項:
1.未找到則返回 (-1, -1) ,所以找到時 x, y 均不等於 -1,~= 為不等於操作符,是 Lua 基本語法, 屬於邏輯控制。
2.該代碼應用過程中,建議使用"保持屏幕"優化找色速度。
函數: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表示從右到左,默認為0 |
vdir | 整數型 | 垂直搜索方向,0表示從上到下,1表示從下到上,默認為0 |
返回值 | 類型 | 說明 |
---|---|---|
x, y | 整數型 | 返回符合條件的參照點的坐標,如未找到則返回 -1,-1 |
腳本實例:
使用“區域模糊找色”函數時,常常會因為屏幕上有大量符合指定顏色的點而不能找到需要的坐標。該函數通過在尋找到一個符合指定顏色color的坐標后,進一步確認其周邊點坐標的方式,來確定准確目標。例如,現在我們在圖像上找到了我們需要的一個按鈕,這個按鈕的樣式是不變的,但是它的整體位置卻會在整個屏幕上變化,現在我們想要在腳本運行時得到其坐標。
首先確定一個參照點:
顏色為 0x181F85,坐標為 (268, 802),下表序號1。
記錄下來,繼續尋找周邊的幾個參照點,以及與第一個參照點的相對坐標,分別為下表序號2~4:
現在我們找到了需要的所有參照點:
序號 | 顏色 | 坐標 | 相對坐標 |
---|---|---|---|
1 | 0x181F85 | (268, 802) | (0, 0) |
2 | 0x00BBFE | (297, 803) | (29, 1) |
3 | 0x0B6BBE | (371, 798) | (103, -4) |
4 | 0x150972 | (333, 811) | (65, 9) |
應用上述坐標寫成多點找色腳本:
- 多點找色
x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE,103|-4|0x0B6BBE,65|9|0x150972", 100, 0, 0, 639, 959);
注意事項:
1.posandcolor 參數中的坐標為相對坐標。
2.顏色值的十六進制文本中,其順序為RGB。
3.相對於第一個點的坐標,即用這個點的橫坐標、縱坐標分別減去第一個點的橫坐標、縱坐標,可以為負數。
4.使用此函數時精度參數設置過低,會導致性能大幅下降。
函數:findMultiColorInRegionFuzzy2 區域多點找色(推薦使用findColor代替)
函數功能:在指定區域,根據顏色以及其周邊點的顏色,尋找符合條件的點的坐標,支持模糊查找。(請使用findColor函數代替)
函數語法:
x, y = findMultiColorInRegionFuzzy2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
color | 整型 | 欲尋找的參照點顏色 |
posandcolor | table型 | 周邊點顏色參數 |
degree | 整數型 | 尋找精度,范圍:1 ~ 100,當是100時為完全匹配 |
x1, y1 | 整數型 | 欲尋找的區域左上角頂點屏幕坐標 |
x2,y2 | 整數型 | 欲尋找的區域右下角頂點屏幕坐標 |
hdir | 整數型 | 水平搜索方向,0表示從左到右,1表示從右到左,默認為0 |
vdir | 整數型 | 垂直搜索方向,0表示從上到下,1表示從下到上,默認為0 |
返回值 | 類型 | 說明 |
---|---|---|
x, y | 整數型 | 返回符合條件的參照點的坐標,如未找到則返回 -1,-1 |
腳本實例:
該函數是區域多點找色函數findMultiColorInRegionFuzzy的增強版,將周邊參照點的顏色及相對坐標寫成table的形式,更方便動態調整。
x, y = findMultiColorInRegionFuzzy2(0x181F85, {{x=29, y=1, color=0x00BBFE},{x=103,y=- 4,color=0x0B6BBE},{x=65,y=9,color=0x150972}}, 100, 0, 0, 639, 959)
函數: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表示從右到左,默認為0 |
vdir | 整數型 | 垂直搜索方向,0表示從上到下,1表示從下到上,默認為0 |
返回值 | 類型 | 說明 |
---|---|---|
point | table類型 | 以 table 形式返回所有符合條件的參照點的坐標,如未找到則返回的table為空 |
返回的 table 為key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}
腳本實例:
point = findMultiColorInRegionFuzzyExt(0xcf0000,"-37|3|0x942814,-38|20|0xeba62d,1|54|0xf2b054,28|22|0x8a5707", 90, 97, 220, 903, 701)
if #point ~= 0 then --如果找到符合條件的點
for var = 1,#point do
sysLog(point[var].x..":"..point[var].y)
end
end
注意事項:
1.高級區域多點找色函數目前最多支持返回99個點。
函數:findMultiColorInRegionFuzzyExt2 高級區域多點找色(推薦使用findColors代替)
函數功能:在指定區域,根據顏色以及其周邊點的顏色,尋找所有符合條件的點的坐標,支持模糊查找
函數語法:
point = findMultiColorInRegionFuzzyExt2(color, {{posandcolor}}, degree, x1, y1, x2, y2,hdir,vdir)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
color | 整型 | 欲尋找的參照點顏色 |
posandcolor | table型 | 周邊點顏色參數 |
degree | 整數型 | 尋找精度,范圍:1 ~ 100,當是100時為完全匹配 |
x1, y1 | 整數型 | 欲尋找的區域左上角頂點屏幕坐標 |
x2,y2 | 整數型 | 欲尋找的區域右下角頂點屏幕坐標 |
hdir | 整數型 | 水平搜索方向,0表示從左到右,1表示從右到左,默認為0 |
vdir | 整數型 | 垂直搜索方向,0表示從上到下,1表示從下到上,默認為0 |
返回值 | 類型 | 說明 |
---|---|---|
point | table類型 | 以 table 形式返回所有符合條件的參照點的坐標,如未找到則返回的table為空 |
返回的 table 為為key-value的形式,如下:
table = {
{x = 100,y = 110},
{x = 200,y = 210},
{x = 300,y = 310},
...
}
腳本實例:
該函數是高級區域多點找色函數findMultiColorInRegionFuzzyExt的增強版,將周邊參照點的顏色及相對坐標寫成table的形式,更方便動態調整。
point = findMultiColorInRegionFuzzyExt2(0xcf0000, {{x=-37,y=3,color=0x942814},{x=-38,y=20,color=0xeba62d},{x=1,y=54,color=0xf2b054},{x=28,y=22,color=0x8a5707}}, 90, 97, 220, 903, 701)
if #point ~= 0 then
for var = 1,#point do
sysLog(point[var].x..":"..point[var].y)
end
end
注意事項:
1.高級區域多點找色函數目前最多支持返回99個點。
函數: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.abs
s = fl(0xff*(100-s)*0.01)
local r,g,b = fl(c/0x10000),fl(c%0x10000/0x100),fl(c%0x100)
local rr,gg,bb = getColorRGB(x,y)
if abs(r-rr)<s and abs(g-gg)<s and abs(b-bb)<s then
return true
end
return false
end
if isColor(963, 961, 0x7b593f,90) then touchDown(963, 961)
mSleep(50)
touchUp(963, 961)
end
函數: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 do
for j = 1, 960, 10 do
--格式化顏色為十六進制文本
color = string.format("%X", getColor(k, j));
--輸出系統日志
sysLog("("..k..", "..j..") Color: "..color..".");
end
end
keepScreen(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) do
sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
end
注意事項:
1.ocr函數不支持多分辨率,不受setScreenScale影響
2.字庫文件“dict.txt”需注意文本編碼必須使用 UTF-8 格式,並放置於腳本內 res 目錄
3.搜索方向橫向或豎向時的檢索規則為:從識別到第一個匹配結果開始給予該位置橫向或豎向搜索,忽略選定區域內其他范圍;合理使用搜索方向參數可有效提高ocr函數性能。
函數:ocrText 文字點陣化識別
函數功能:識別屏幕上的文字。
函數語法:
result = ocrText(index, x1, y1, x2, y2, {"c0-c1"} , sim, flag, dir)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
index | 整數型 | 字庫標識,由 createOcrDict 函數返回值生成 |
x1, y1 | 整數型 | 識別區域左上角頂點屏幕坐標 |
x2, y2 | 整數型 | 識別區域右下角頂點屏幕坐標 |
c0, c1 | 文本型 | 偏色范圍,由字庫制作中獲取,需要與制作字庫時所設值保持一致,多組偏色用,分割 |
sim | 整數型 | 精確度,范圍 0 - 100 |
flag | 整數型 | 表示選擇返回結果的類型, 0 == 字符串形式返回識別結果,1 == table形式返回識別到的結果及其坐標 |
dir | 整數型 | 選填項,表示識別方向,0 == 區域內全部搜索,1 == 橫向搜索, 2 ==豎向搜索, 忽略此項則默認為0 |
返回值 | 類型 | 說明 |
---|---|---|
result | 文本型/table型 | 返回識別結果/返回識別到的結果及其坐標 |
腳本實例:
lines = {}
lines[1] = 'FFFFFC000000000000000000000001FFF$u$0.0.56$15'
lines[2] = 'FFFFFC$l$0.0.42$21'
lines[3] = '10EE1B06608811062084108218C1FF8FF$a$0.1.77$15'
lines[4] = 'FFFFFC03008030040080100200600F00F$h$0.0.71$21'
lines[5] = '0040080100200400801002FFFFFC010020040080100200400800400$王$4.2.83$21'
lines[6] = '1FE200400801002007F8000000000080601804030300E002002001001001001001$哈$0.1.118$26'
local dict = createOcrDict(lines)
--或者可以寫成這樣的形式 local dict = createOcrDict("dict.txt")
result = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020","0x797979-0x202020"}, 100, 0, 0) -- 表示范圍內全部搜索,以字符串形式返回識別結果
sysLog('result: ' .. result)
results = ocrText(dict, 0, 0, 1135, 639, {"0x613d3b-0x202020"}, 100, 1, 1) -- 表示范圍內橫向搜索,以table形式返回識別到的所有結果及其坐標
for k,v in pairs(results) do
sysLog(string.format('{x=%d, y=%d, text=%s}', v.x, v.y, v.text))
end
注意事項:
1.ocr函數不支持多分辨率,不受setScreenScale影響
2.字庫文件“dict.txt”需注意文本編碼必須使用 UTF-8 格式,並放置於腳本內 res 目錄
3.搜索方向橫向或豎向時的檢索規則為:從識別到第一個匹配結果開始給予該位置橫向或豎向搜索,忽略選定區域內其他范圍;合理使用搜索方向參數可有效提高ocr函數性能。
函數:createOCR 載入高級文字識別字庫(集成tesserOCR)
函數功能:載入高級文字識別字庫,並指定檢測方式
函數語法:
ocr, msg = createOCR({
type = "tesseract",
mode = mode,
path = path,
lang = lang
})
參數說明:
參數 | 類型 | 說明 |
---|---|---|
type | 文本型 | [必填]文字識別類型,暫只支持tesseract,更多ocr引擎逐步支持中 |
mode | 整數型 | [選填]引擎識別模式(參見下表),默認3 |
path | 文本型 | [選填]字庫路徑,不填默認使用eng字庫路徑;官方字庫擴展路徑、自定義路徑見下方說明 |
lang | 文本型 | [選填]字庫語言文件名稱,不填則默認eng(只支持一般的中英+數字+標點符號) |
path 自定義字庫,有兩種路徑選擇:
對於自定義字庫,有以下幾種路徑選擇:
1. 內置到xsp的res目錄下,直接指定res路徑:"res/"
2. 下載到public目錄下,指定[public]和子路徑:"[public]downloads/tessdata/"
3. 使用開發助手/叉叉助手的字庫擴展,指定[external]即可:"[external]"
特別注意:下載到public目錄的字庫路徑,traineddata的上層目錄必須命名為tessdata
lang 字庫語言文件:
1. lang 為.traineddata字庫文件名,叉叉助手、開發助手中可下載的字庫語言文件有:
chi_sim 簡體中文字庫
chi_tra 繁體中文字庫
eng_ext 英文增強版字庫
eng 內置默認精簡版中英數字標點字庫,免下載可用
2. 識別要求不高或識別數據比較標准,也可以path和lang都不填,使用默認字庫eng,只支持一般的中英+數字+標點符號。
字庫與語言配置樣例:
1. path & lang均不填: 使用內置eng字庫
2. path = [external] & lang = eng_ext/chi_sim/chi_tra:叉叉提供的字庫擴展(需下載)
3. path = "res/" & lang = dictname(dictname:xsp打包中res目錄字庫文件名)
引擎識別模式 | 說明 |
---|---|
0 | 僅執行Tesseract,速度最快 |
1 | 僅進行Cube處理,較慢但准確 |
2 | 結合Tesseract和Cube處理,最准確 |
3 | 根據字庫配置自動選擇 |
返回值 | 類型 | 說明 |
---|---|---|
ocr | 文本型 | ocr實例,創建失敗時ocr為nil |
msg | 文本型 | 創建成功返回版本號,創建失敗返回錯誤信息 |
腳本實例:
local ocr, msg = createOCR({
type = "tesseract", -- 指定tesseract引擎
path = "[external]", -- 使用開發助手/叉叉助手的擴展字庫,不填默認使用eng字庫路徑
lang = "eng_ext" -- 使用英文增強字庫(注意需要提前下載好)
})
if ocr ~= nil then
-- ocr 創建成功,使用該實例進行后續識別操作(參見下面函數文檔)
sysLog("createOCR succeed: Tesseract-OCR v" .. msg)
else
-- ocr 創建失敗,根據msg提示調整
sysLog("createOCR failed: " .. tostring(msg))
end
訓練字庫:
請參閱:【如何使用Tesseract-OCR(v3.02.02)訓練字庫】
注意事項:
支持引擎版本:1.8.10或更新
引擎內置Tesseract-OCR版本:3.02.02
函數: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(參見下表),默認6 |
rect | table | [必填]{x1, y1, x2, y2} 屏幕的識別范圍,越准確越好 |
diff | table | [必填]{"顏色1-誤差1", "顏色2-誤差2", ...} 色值范圍,可以提供多個,供二值化使用 |
data | table | [選填]二值化二維數組,1代表有效數據,其余代表無效數據) |
whitelist | 文本型 | [選填]僅識別為白名單中的字符 |
blacklist | 文本型 | [選填]識別時需排除的字符(對識別時易相互混淆的字符進行排除) |
psm選項 | 說明 |
---|---|
0 | 僅檢測方向和文本 |
1 | 自動檢測方向和文本(OSD) |
2 | 自動檢測,但不進行OSD或OCR處理 |
3 | 自動PSM模式(但不含OSD) |
4 | 所識別圖片的字體大小不一 |
5 | 所識別圖片當作整塊豎向文字區域 |
6 | 所識別圖片當作整塊橫向文字區域 (默認值) |
7 | 所識別圖片當作一行文字 |
8 | 所識別圖片當作單個詞語 |
9 | 所識別圖片當作單個圓型圍繞的詞語 |
10 | 所識別圖片當作單個英文/數字字符 |
11 | 盡可能識別更多的字符(無順序要求) |
12 | 分散稀疏的OSD檢測 |
返回值 | 類型 | 說明 |
---|---|---|
code | 整數型 | code = 0: 識別成功;code < 0: 識別失敗 |
text | 文本型 | 識別出的字符串(末尾可能有多余的換行或空格),識別失敗時,text為對應的錯誤提示 |
腳本實例:
local ocr, msg = createOCR({
type = "tesseract", -- 指定tesseract引擎
path = "[external]", -- 使用開發助手/叉叉助手的擴展字庫
lang = "eng_ext" -- 使用英文增強字庫(注意需要提前下載好)
})
if ocr ~= nil then
string.trim = function(s)
return s:match'^%s*(.*%S)' or ''
end
local code, text = 0, ""
mSleep(1000)
-- 識別屏幕圖像內容(例如5/5s設備的當前時間顯示)
code, text = ocr:getText({
rect = {249, 6, 249 + 144, 6 + 29},
diff = {"0x000000-0x101010"}, -- 時間顏色為純黑
whitelist = "0123456789APM:" -- 添加所有可能出現的字符作為白名單
})
-- 輸出示例:"code = 0, text = 5:24 PM" (末尾可能有多余換行符,為正常結果,可以參考trim處理)
sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
mSleep(1000)
-- 識別二值化二維數組(單個字符)
code, text = ocr:getText({
psm = 10, -- 所識別圖片當作單個英文/數字字符
data = {
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,0,0,0,0,0,0,0,0},
{0,1,0,1,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,1,1,0,0,0,0,0},
{1,0,1,1,0,0,0,0,1,1,1,0,0,0},
{0,1,0,1,0,0,0,0,0,0,1,1,0,0},
{1,1,1,0,0,0,0,0,0,0,1,1,0,0},
{1,0,0,0,0,0,0,0,0,0,1,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,1,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,1,0,0,0,0,0,0,0,1,0,0,0},
{0,1,1,1,0,1,0,0,1,1,1,0,0,0},
{0,0,0,1,1,1,0,1,1,0,0,0,0,0},
{0,0,0,0,0,0,1,0,1,0,0,0,0,0}
},
whitelist = "0123456789" -- 添加白名單為數字類型
})
-- 輸出示例:"code = 0, text = 6"
sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
mSleep(1000)
-- 識別二值化二維數組(多個字符)
code, text = ocr:getText({
psm = 7, -- 所識別圖片當作一行文字
data = {
{1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0},
{1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0},
{1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0},
{1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1},
{0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1},
{0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0},
{0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0}
},
whitelist = "0123456789"
})
-- 輸出示例:"code = 0, text = 53"
sysLog("code = " .. tostring(code) .. ", text = " .. text:trim())
else
sysLog("createOCR failed: " .. tostring(msg))
end
特別說明
diff = {"C1-D1", "C2-D2", …} 設置的意義是,當區域內任意一個顏色值Cxy,滿足條件 min(Ci - Di, 0x000000) ≤ Cxy ≤ max(Ci + Di, 0xffffff),i = 1, 2, … 的時候,這個位置的顏色就是有效顏色(0xffffff),否則,都是無效顏色(0x000000)。這個處理過程稱為二值化,經過這樣處理后的二值化數據,提交給OCR識別會更加精確。
注意事項:
支持引擎版本:1.8.10或更新
函數:ocr: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使用完畢,為避免內存峰值過高導致被系統強殺(主要是使用到字庫較大的情況下)
-- 建議及時手動釋放ocr
ocr:release()
注意事項:
支持引擎版本:1.8.11或更新
函數:binarizeImage 二值化圖片轉換為table 
函數功能:對當前屏幕指定范圍的圖像二值化,並轉換為table,得到的結果通過去噪或者矩陣運算后,可以提供給ocr:getText()識別成文字
函數語法:
colorTbl = binarizeImage({
rect = {x1, y1, x2, y2},
diff = {diff}
})
參數說明:
參數 | 類型 | 說明 |
---|---|---|
rect | table | [必填]{x1, y1, x2, y2} 屏幕二值化的識別范圍,越准確越好 |
diff | table | [必填]{"顏色1-誤差1", "顏色2-誤差2", ...} 色值范圍,可以提供多個,供二值化使用 |
返回值 | 類型 | 說明 |
---|---|---|
colorTbl | 文本型 | 圖像二值化后的table |
腳本實例:
colorTbl = binarizeImage({
rect = {30, 80, 53, 101},
diff = {"0xf7d363-0x1f1f1f", "0xefaa29-0x1f1f1f"}
})
-- 輸出colorTbl每一行測試轉換結果
for _, row in pairs(colorTbl) do
sysLog(table.concat(row, ','))
end
--[[
colorTbl格式類似這樣:
{
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,0,0,0,0,0,0,0,0},
{0,1,0,1,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,0,1,1,0,0,0,0,0},
{1,0,1,1,0,0,0,0,1,1,1,0,0,0},
{0,1,0,1,0,0,0,0,0,0,1,1,0,0},
{1,1,1,0,0,0,0,0,0,0,1,1,0,0},
{1,0,0,0,0,0,0,0,0,0,1,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,0},
{1,0,0,0,0,0,0,0,0,0,0,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,1,0,1},
{1,1,0,0,0,0,0,0,0,0,0,1,1,0},
{1,0,1,0,0,0,0,0,0,0,1,0,0,0},
{0,1,1,1,0,1,0,0,1,1,1,0,0,0},
{0,0,0,1,1,1,0,1,1,0,0,0,0,0},
{0,0,0,0,0,0,1,0,1,0,0,0,0,0}
}
]]--
-- 對colorTbl結果進行可選的去噪或者矩陣運算糾正等處理
-- (假設處理函數是denoising)
colorTbl = denoising(colorTbl)
local ocr, msg = createOCR({
type = "tesseract"
})
-- 使用ocr識別新的colorTbl
local code, text = ocr:getText({
data = colorTbl,
psm = 10 -- 單個字符模式識別
})
sysLog("code = " .. tostring(code) .. ", text = " .. text)
-- 輸出結果:code = 0, text = 6
注意事項:
支持引擎版本:1.8.30或更新
函數:runApp 運行應用
函數功能:打開一個應用程序。
函數語法:
flag = runApp(appid)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
appid | 文本型 | 應用程序的應用ID |
返回值 | 類型 | 說明 |
---|---|---|
flag | 整數型 | 0 == 應用啟動成功;非0 == 應用啟動失敗 |
腳本實例:
- 打開內置音樂應用,然后關閉
r = runApp("com.apple.Music");
mSleep(10 * 1000); --等待程序響應
if r == 0 then
closeApp("com.apple.Music");
else
toast("啟動應用失敗");
end
注意事項:
1.runApp函數需要系統響應時間,響應時間根據機型有所不同,調用此函數需做好延遲或判斷。
函數:closeApp 關閉應用
函數功能:關閉一個應用程序。
函數語法:
closeApp(appid)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
appid | 文本型 | 應用程序的應用ID |
返回值:無
腳本實例:
- 打開內置音樂應用,然后關閉
r = runApp("com.apple.Music");
mSleep(10 * 1000); --等待程序響應
if r == 0 then
closeApp("com.apple.Music");
else
toast("啟動應用失敗");
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 do
isfront = isFrontApp("com.xxAssistant"); --前台狀態
if isfront == 1 then
break
end
toast("請打開叉叉助手");
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 - 確定 |
results | table類型 | 返回用戶輸入的多項數據 |
腳本界面說明
腳本界面通過json格式存儲 ,以下是一個包含所有控件及其屬性的例子:
{
"style" : "default",
"config" : "save_111.dat",
"width" : 700,
"height" : 1080,
"cancelname" : "Cancel",
"okname" : "Let's Rock",
"cancelscroll" : true,
"countdown":10,
"views" : [
{
"text" : "基本設置",
"type" : "Page",
"views" : [
{
"align" : "center",
"color" : "0,0,225",
"size" : 30,
"bg" : "0,0,0", //RGB格式規定標簽的背景色,不指定為透明
"text" : "設置:這是一行文本",
"type" : "Label"
},
{
"id" : "RadioGroup1",
"list" : "選項1,選項2,選項3,選項4,選項5,選項6,選項7",
"select" : "0",
"size" : 30,
"type" : "RadioGroup",
"orientation" : "vertical" //選項排布方式為豎排
},
{
"align" : "left",
"color" : "0,100,0",
"id" : "Edit1",
"kbtype" : "number",
"prompt" : "這是提示文本",
"size" : 25,
"text" : "這是預輸入文本",
"type" : "Edit"
},
{
"id" : "CheckBoxGroup1",
"list" : "選項1,選項2,選項3,選項4,選項5,選項6,選項7",
"select" : "3@5",
"size" : 30,
"type" : "CheckBoxGroup",
"orientation" : "horizontal" //選項排布方式為智能橫排
},
{
"id" : "ComboBox1",
"list" : "選項1,選項2,選項3,選項4,選項5,選項6,選項7",
"select" : "1",
"size" : 30,
"type" : "ComboBox"
},
{
"src" : "b.png", //這是來源為本地文件的圖片
"type" : "Image"
},
{
"src" : "http://www.baidu.com/img/bdlogo.png", //這是來源為網絡地址的圖片
"type" : "Image"
}
]
},
{
"text" : "水平布局",
"type" : "Page",
"views" : [
{
"color" : "100,100,100",
"size" : 30,
"text" : "以下是水平布局排列的三個控件",
"type" : "Label"
},
{
"height" : 300,
"width" : 700,
"id" : "group1",
"type" : "LinearLayout", //這是LinearLayout控件
"valign" : "top",
"views" : [
//從這里開始是LinearLayout控件內部的子控件,不可嵌套LinearLayout控件,可添加LinearLayout、Page以外的所有控件
{
"color" : "100,100,100",
"size" : 30,
"text" : "選擇",
"type" : "Label",
"width" : 100
//LinearLayout控件內部的子控件均需要指定一個width屬性,不指定則無法顯示
},
{
"id" : "checkboxgroup2",
"list" : "選項1,選項2,選項3",
"select" : "2@3@",
"type" : "CheckBoxGroup",
"width" : 180
},
{
"id" : "4",
"list" : "選項1,選項2,選項3,選項4,選項5",
"select" : "1",
"size" : 20,
"type" : "ComboBox",
"width" : 250
}
]
},
{
"color" : "100,100,100",
"size" : 30,
"text" : "以下是一張默認布局方式的圖片,水平布局可與普通布局樣式聯合使用",
//這里是一個Label,跟上面的LinearLayout同層級
"type" : "Label",
"width" : 100
},
{
"src" : "b.png",
"type" : "Image"
},
{
"color" : "100,100,100",
"size" : 30,
"text" : "以下又是一個水平布局區域",
//這里也是一個Label,跟上面的LinearLayout同層級
"type" : "Label"
},
{
//在同層級的情況下,可以多個LinearLayout聯合使用,以下是第二個LinearLayout控件中的內容
"height" : 400,
"width" : 700,
"id" : "group1",
"type" : "LinearLayout",
"valign" : "top",
"views" : [
{
"color" : "100,100,100",
"size" : 30,
"text" : "右邊是一張圖片",
"type" : "Label",
"width" : 150
},
{
"src" : "b.png",
"type" : "Image",
"width" : "400"
}
]
}
]
},
{
"text" : "跳轉示例",
"type" : "Page",
"views" : [
{
"color" : "100,110,200",
"extra" : [ //附加屬性指定
{
"goto" : "http://www.baidu.com", //跳轉到網址
"text" : "閱讀原文"
},
{
"goto" : "qq", //跳轉到QQ咨詢
"text" : "1602127440"
}
],
"size" : 30,
"text" : "閱讀原文 QQ:1602127440",
"type" : "Label"
}
]
},
{
"text" : "V1.6.7更新",
"type" : "Page",
"views" : [
{
"align" : "left",
"color" : "0,0,0",
"size" : 40,
"text" : "標簽",
"type" : "Label",
"bg" : "100,100,100"
},
{
"id" : "web",
"url" : "http://www.baidu.com",
"type" : "WebView",
"height" : 500,
"width" : 800
},
{
"id" : "line",
"type" : "Line",
"color" : "0,0,255",
"height" : 7,
"width" : 800
}
]
}
]
}
創建一個界面,需要包含style和views兩個參數。
- 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窗口寬度賦值為500
lua_value.height = 400 --將ui窗口寬度賦值為450
showUI(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、touchMove
- findColor、findColors
- findColorInRegionFuzzy、findMultiColorInRegionFuzzy、findMultiColorInRegionFuzzy2
- findMultiColorInRegionFuzzyExt、findMultiColorInRegionFuzzyExt2
- getColor、getColorRGB
- showHUD
- ocr:getText
- binarizeImage
腳本實例:
假設一名作者在540*960分辨率的手機中開發了腳本,要在720*1280的設備中運行
setScreenScale(540,960) --或者setScreenScale(540,960,0)效果相同
touchDown(0, 100, 200) --此處實際點擊坐標為:100*(720/540),200*(1280/960)
mSleep(50)
touchMove(0, 100, 200) --此處實際移動坐標為:100*(720/540),200*(1280/960)
mSleep(50)
touchUp(0, 100, 200)
x, y = findMultiColorInRegionFuzzy(0x181F85, "29|1|0x00BBFE", 100, 0, 0, 400, 600)
--此處實際查找范圍為坐標(0,0)到(400*720/540,600*1280/960),同時坐標偏移也進行換算,即匹配首點x,y坐標后,再比對(x+29*720/540,y+1*1280/960)這個坐標是否為"0x00BBFE"
if x~=-1 then
touchDown(0, x, y) --第三參數為0或省略情況下返回的坐標為經過反向縮放的坐標,
mSleep(100)
touchUp(0, x, y)
end
注意事項:
1.通分辨率取色要點:取色點周邊顏色相近為佳,由於字體或圖形邊緣線的點就很可能由於縮放而消失,導致找色失敗。
2.只適用等比例分辨率:例如540*960,720*1280都是9:16就可通用,而540*960與400*800的一般不通用。
3.在最小分辨率開發,同比例的大分辨可用。例如:540*960下開發的腳本,在720*1280可用,反過來,一般不能通用。
函數: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); --打開 Wifi
setWifiEnable(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 then
dialog("未鎖定",3);
else
unlockDevice(); --解鎖
end
注意事項:
1.如果設備設置了鎖屏密碼,則此函數只能喚醒屏幕。
函數:deviceIsLock 設備鎖定狀態
函數功能:判斷當前設備的屏幕鎖定狀態
函數語法:
flag = deviceIsLock()
參數說明:
返回值 | 類型 | 說明 |
---|---|---|
flag | 整數型 | 0 == 表示設備未鎖定;非0 == 表示設備已鎖定 |
腳本實例:
- 判斷設備是否鎖定
flag = deviceIsLock(); --判斷屏幕鎖定狀態
if flag == 0 then
dialog("未鎖定",3);
else
unlockDevice(); --解鎖
end
函數:vibrator 手機振動
函數功能:使手機振動一次。
函數語法:
vibrator()
參數說明:
返回值:無
腳本實例:
for var = 1,5 do
vibrator(); --振動
mSleep(1000); --持續 1 秒
end
注意事項:
1.使用此函數需在移動設備設置里打開震動選項。
函數:resetIDLETimer 重置鎖屏時間
函數功能:重置系統空閑時間,阻止自動鎖屏,保持屏幕常亮。
函數語法:
resetIDLETimer()
參數說明:
返回值:無
腳本實例:
- 保持屏幕常亮
while true do
mSleep(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.mp3
mSleep(5000)
stopAudio() --停止播放音頻文件
注意事項:
1.如果播放一個音頻文件后,使用此函數播放另一音頻文件,將會先停止正在播放的音頻,再播放第二段音頻文件。
2.用於播放的音樂文件需置於腳本對應的res文件夾內。
函數:stopAudio 停止播放音頻
函數功能:停止正在播放的音頻
函數語法:
stopAudio()
參數說明:
返回值:無
腳本實例:
playAudio("music.mp3") -- 播放音樂文件music.mp3
mSleep(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+1
b=b+1
c=c+1
setTimer(2000,func,a,b,c)
end
setTimer(2000,func,0,1,2)
--等待運行
mSleep(2000)
mSleep(2000)
mSleep(2000)
mSleep(2000)
mSleep(2000)
注意事項:
1.如定義了一段時間運行的函數,需在函數調用之前預留充裕的時間。
2.支持引擎版本:1.7.4或更新
函數: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.log |
tag | 文本型 | 標簽,便於查看日志 |
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 then
dialog(content)
elseif err == 1 then
dialog("網絡錯誤")
elseif err == 999 then
dialog("未知錯誤")
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); --開始初始化
else
lua_exit(); --否則退出腳本
end
函數:lua_restart 重載腳本
函數功能:重新加載運行腳本
函數語法:
lua_restart()
參數說明:
返回值:無
注意事項:
此函數作用相當於停止腳本后重新運行腳本。
函數:onBeforeUserExit 腳本運行終止回調
函數功能:在用戶主動終止腳本運行之前執行的回調函數
函數語法:
onBeforeUserExit()
參數說明:
返回值:無
腳本實例:
- 當用戶在腳本運行過程中主動停止腳本,將會觸發 onBeforeUserExit 函數並執行函數體內的語句
function onBeforeUserExit()
dialog("OK",0)
end
for var = 1,30 do
mSleep(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" then
sysLog("安卓系統")
elseif ver == "iOS" then
sysLog("蘋果系統")
end
函數:isPrivateMode 獲取系統環境類型
函數功能:獲取系統環境類型
函數語法:
ver = isPrivateMode()
參數說明:
返回值 | 類型 | 說明 |
---|---|---|
ver | 文本型 | 返回當前系統的類型:返回值1、0;1-越獄/ROOT環境;0-免越獄/免ROOT環境 |
腳本實例:
ver = isPrivateMode()
if ver == 0 then
toast("當前為免越獄/免ROOT環境")
elseif ver == 1 then
toast("當前為越獄/root環境")
end
注意事項:
1.
isPriviateMode
支持引擎版本:1.7.4或更新
2.isPrivateMode
支持引擎版本:1.8.30或更新
函數: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 then
toast("當前電池未充電,電量剩余 "..level)
elseif charge == 1 then
toast("當前電池充電中,電量剩余 "..level)
elseif charge == -1 then
toast("當前電池充電狀態未知,電量剩余未知")
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 then
toast("當前屏幕方向為豎屏")
elseif ret == 1 then
ver = getOSType()
if ver == "iOS" then
toast("當前屏幕方向為橫屏,HOME鍵在右")
elseif ver == "android" then
toast("當前屏幕方向為橫屏")
end
elseif ret == 2 then
toast("當前屏幕方向為橫屏,HOME鍵在左")
elseif ret == -1 then
toast("當前屏幕方向Unknow")
end
注意事項:
1.iOS版開發助手中該函數返回值跟隨init指定的方向,未指定的情況下返回值為-1。
2.支持引擎版本:1.7.4或更新
函數:getUserCredit 獲取用戶付費類型和套餐剩余時間
函數功能:獲取用戶付費類型和套餐剩余時間
函數語法:
buyState,validTime,res=getUserCredit()
參數說明:
返回值 | 類型 | 說明 |
---|---|---|
buyState | 整數型 | 用戶付費類型,1 - 付費用戶,2 - 試用用戶,3 - 免費用戶,0 - 非購買非試用 |
validTime | 整數型 | 用戶當前套餐購買時長,單位為秒,試用用戶的情況下會返回0 |
res | 整數型 | 返回錯誤代碼,0 - 正常, 非0 - 出錯 |
腳本實例:
buyState,validTime,res=getUserCredit()
if buyState ~= 0 then
dialog("您是付費用戶")
end
注意事項:
1.支持引擎版本:1.8.30或更新
函數:getRuntimeMode 獲取腳本運行模式(安卓專用)
函數功能:獲取腳本運行模式,用於區分哪種運行模式跑腳本
函數語法:
int = getRuntimeMode()
參數說明:
返回值 | 類型 | 說明 |
---|---|---|
int | 整數型 | 腳本運行模式,0 - 通用模式(當做“免root免激活”處理),1 - 低版本兼容模式(當做“免root免激活”處理),2 - 極客模式(root或者激活) |
腳本實例:
int = getRuntimeMode()
if int == 0 then
dialog("當前模式:通用模式")
end
注意事項:
1.支持引擎版本:1.9.312或更新
函數:createHUD 創建HUD內容
函數功能:創建、顯示、隱藏HUD內容
函數語法:
id = createHUD()
參數說明:
返回值 | 類型 | 說明 |
---|---|---|
id | 整數型 | 用於標示HUD |
腳本實例:
init("0",1)
id = createHUD() --創建一個HUD
showHUD(id,"歡迎使用叉叉腳本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --顯示HUD內容
mSleep(2000)
showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --變更顯示的HUD內容
mSleep(5000)
hideHUD(id) --隱藏HUD
mSleep(3000)
注意事項:
1.隱藏標示為id的HUD信息后,如需再次顯示HUD信息內容,需要使用createHUD函數再次創建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。
函數:showHUD 顯示HUD內容
函數功能:創建、顯示、隱藏HUD內容
函數語法:
showHUD(id,text,size,color,bg,pos,x,y,width,height)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
id | 整數型 | 用於標示HUD |
text | 文本型 | 提示信息,將在屏幕上以HUD形式顯示 |
size | 整數型 | 表示提示信息的字體大小 |
color | 文本型 | 表示提示信息的字體顏色,格式為ARGB |
bg | 文本型 | 表示提示信息的背景顏色,可以是ARGB,也可以是圖片文件名稱 |
pos | 整數型 | 表示提示信息的原點位置,0 - 左上角,1 - 居中,2 - 水平居中, 3 - 垂直居中 |
x,y | 整數型 | 表示提示信息相對原點的坐標偏移值 |
width,height | 整數型 | 表示提示信息顯示的寬高 |
返回值:無
腳本實例:
init("0",1)
id = createHUD() --創建一個HUD
showHUD(id,"歡迎使用叉叉腳本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --顯示HUD內容
mSleep(2000)
showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --變更顯示的HUD內容
mSleep(5000)
hideHUD(id) --隱藏HUD
mSleep(3000)
注意事項:
1.隱藏標示為id的HUD信息后,如需再次顯示HUD信息內容,需要使用createHUD函數再次創建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。
函數:hideHUD 隱藏HUD內容
函數功能:創建、顯示、隱藏HUD內容
函數語法:
hideHUD(id)
參數說明:
參數 | 類型 | 說明 |
---|---|---|
id | 整數型 | 用於標示HUD |
返回值:無
腳本實例:
init("0",1)
id = createHUD() --創建一個HUD
showHUD(id,"歡迎使用叉叉腳本!",12,"0xffff0000","0xffffffff",0,100,0,228,32) --顯示HUD內容
mSleep(2000)
showHUD(id,"HelloWorld!",12,"0xffff0000","msgbox_click.png",0,100,0,228,32) --變更顯示的HUD內容
mSleep(5000)
hideHUD(id) --隱藏HUD
mSleep(3000)
注意事項:
1.隱藏標示為id的HUD信息后,如需再次顯示HUD信息內容,需要使用createHUD函數再次創建。
2.ARGB---Alpha,Red,Green,Blue;A表示透明度,00代表完全透明,ff代表完全不透明。
函數:asyncExec 異步網絡請求
函數功能:asyncExec 異步httpget、httppost請求
函數語法:
asyncExec({
type,
immediate,
url,
headers,
content,
callback
})
參數說明:
參數 | 類型 | 說明 |
---|---|---|
type | 文本型 | 目前僅支持httpget 和httppost |
immediate | 邏輯型 | 是否獨立開啟新線程運行(建議使用默認值false) |
url | 文本型 | 請求地址 |
headers | 文本型 | 網絡請求頭設置,格式key1:value1#key2:value2#... |
content | 文本型 | httppost 網絡請求的附加數據 |
callback | 函數 | 網絡請求結果回調函數,接受參數table = {code[int], data[string] } |
返回值:無
腳本實例:
local function urlencode(w)
pattern = "[^%w%d%?=&:/._%-%* ]"
s = string.gsub(w, pattern, function(c)
local c = string.format("%%%02X", string.byte(c))
return c
end)
s = string.gsub(s, " ", "+")
return s
end
-- 異步httpget請求
asyncExec({
type = "httpget", -- [string] 指定httpget類型
immediate = false, -- [bool] 默認false, 設置true會獨立開啟線程執行任務
url = urlencode("http://httpbin.org/get?x=測試x&y=測試y"), -- [string] 請求的URL地址,出現中文字符時需要使用urlencode進行編碼
callback = function (result) -- [function] 請求回調函數
-- 回調結果table
assert(type(result) == "table")
--[[
返回數據格式: { code = [int]錯誤碼, data = [string]服務器返回數據 }
code -1: 請求出錯
-2: 請求超時
-3: 強制關閉
其他: 同http status code
]]--
sysLog("httpget callback: code = " .. result.code .. " data = " .. result.data)
-- 注意: 雖然請求會異步執行, 但回調函數依然在lua主線程執行, 不要在回調里執行其他阻塞操作
end
})
-- 異步httppost請求
asyncExec({
type = "httppost", -- [string] 指定httppost類型
immediate = true, -- [bool] 默認false, 設置true會獨立開啟線程執行任務
url = "http:/httpbin.org/post", -- [string] 請求的URL地址
headers = "User-Agent:Test-Agent#Accept-Language:zh-CN", -- [string] 請求頭設置
content = "test content 2", -- [string] post請求的數據
callback = function (result) -- [function] 請求回調函數
-- 回調結果table
assert(type(result) == "table")
-- httpget和httppost返回數據格式一致
sysLog("httppost callback: code = " .. result.code .. " data = " .. result.data)
end
})
local t = 0
while t < 10 do
mSleep(1000)
t = t + 1
end
注意事項:
1.不論
immediate
為true還是false,asyncExec的網絡請求總是會在Lua線程之外的線程運行,區別是immediate設置為false時,使用已有的常駐線程(sentinel thread)運行,多次運行使用同一個線程;而immediate為true是,會即時創建一個新的線程獨立運行任務,多次運行創建多個線程
2.headers
設置僅在引擎版本1.8.30及以上生效,所有HTTP headers設置可以參閱 https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
函數: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 -- =1
local b_balue = lua_value.b -- ="boy"
local c_d_balue = lua_value.c.d -- =1
local raw_json_text = json.encode(lua_value)
local pretty_json_text = json.encode_pretty(lua_value)
sysLog(raw_json_text)
sysLog(pretty_json_text)
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:79
sha1:43386755b0ff2899e0a7895c45a0c051468d06cd
md5: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添加到rootview
rootview:addView(page2)
page:addView(label) --把label添加到page
-- page:addView(label) --label的id重復,這里會報錯
page:addView(image) --把image添加到page
page:addView(checkboxgroup)
page:addView(radiogroup)
page:removeView(label1) --從page中刪除label
uijson = json.encode(rootview)
showUI(uijson)
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 test
local bb = require("badboy")
bb.loadutilslib()
i = 3
j = 6.9
s = 'good boy'
sysLogFmt('i=%d, j=%f, s=%s', i, j, s)
sysLogLst(i, j, s)
LuaSocket模塊
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.socket
local dns = socket.dns
sysLog('localhostIP: ' .. dns.toip('localhost'))
sysLog('result: ' .. (dns.tohostname('59.37.96.63') or 'nil'))
sysLog('hostname: ' .. dns.gethostname())
sysLog('addinfo: ' .. tostring(dns.getaddrinfo('localhost')))
httpGet請求
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local ltn12 = bb.ltn12
res, code = http.request('http://www.baidu.com')
-- 等價於
-- local response_body = {}
-- res, code = http.request({
-- url = 'http://www.baidu.com',
-- sink = ltn12.sink.table(response_body)
-- })
if code == 200 then
sysLog(res)
dialog(res, 0)
end
--獲取外網ip地址
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local res, code = http.request('http://www.ip.cn/');
if code == 200 then
local i,j = string.find(res, '%d+%.%d+%.%d+%.%d+')
local ipaddr =string.sub(res,i,j)
dialog(ipaddr, 0)
end
1.返回的2個參數中,res 是 http body 的內容,也就是請求網頁的內容,code 是 http 狀態碼,返回200的話就表示正常返回。
2.如果傳入的是 table 的話,就需要用一個容器來接收 http body 的內容。
httpPost請求
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local response_body = {}
local post_data = 'asd';
res, code = http.request{
url = 'http://127.0.0.1/post.php',
method = "POST",
headers =
{
['Content-Type'] = 'application/x-www-form-urlencoded',
['Content-Length'] = #post_data,
},
source = ltn12.source.string('data=' .. post_data),
sink = ltn12.sink.table(response_body)
}
1.這里注意記得 method 傳入 POST, 因為默認是 GET。
2.headers 參數,由一個 table 組成,key 為 header,value 為 header 內容。
3.source 參數,這里是填入 POST 的參數,多個數據的情況用 & 隔開,例如 "data1=a&data2=b"。
4.此代碼僅為舉例說明,請勿直接復制使用。
掛載代理
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
http.PROXY = 'http://127.0.0.1:8888' --代理服務器地址
local result, code = http.request('http://www.baidu.com')
dialog(result or tostring(code), 0)
以socket的方式訪問
local bb = require("badboy")
bb.loadluasocket()
local http = bb.http
local host = 'www.baidu.com'
local file = "/"
local sock = assert(socket.connect(host, 80)) --創建一個 TCP 連接,連接到 HTTP 連接的標准 80 端口上
sock:send('GET ' .. file .. ' HTTP/1.0\r\n\r\n')
repeat
local chunk, status, partial = sock:receive(1024) --以 1K 的字節塊接收數據
until status ~= 'closed'
sock:close() -- 關閉 TCP 連接
smtp方法發送email
local bb = require("badboy")
bb.loadluasocket()
local smtp = bb.smtp
from = '<youmail@126.com>' -- 發件人
--發送列表
rcpt = {
'<youmail@126.com>',
'<youmail@qq.com>',
'<youmail@gmail.com>',
}
mesgt = {
headers = {
to = 'youmail@gmail.com', -- 收件人
cc = '<youmail@gmail.com>', -- 抄送
subject = "This is Mail Title"
},
body = "郵件內容"
}
r, e = smtp.send{
server = "smtp.126.com", --smtp服務器地址
user = "youmail@126.com",--smtp驗證用戶名
password = "******", --smtp驗證密碼
from = from,
rcpt = rcpt,
source = smtp.message(mesgt)
}
if not r then
dialog(e, 0)
else
dialog('發送成功!', 0)
end
實現獲取網絡時間
local bb = require("badboy")
bb.loadluasocket()
local socket = bb.socket
server_ip = {
"132.163.4.101",
"132.163.4.102",
"132.163.4.103",
"128.138.140.44",
"192.43.244.18",
"131.107.1.10",
"66.243.43.21",
"216.200.93.8",
"208.184.49.9",
"207.126.98.204",
"207.200.81.113",
"205.188.185.33"
}
local function nstol(str)
assert(str and #str == 4)
local t = {str:byte(1,-1)}
local n = 0
for k = 1, #t do
n= n*256 + t[k]
end
return n
end
local function gettime(ip)
local tcp = socket.tcp()
tcp:settimeout(10)
tcp:connect(ip, 37)
success, time = pcall(nstol, tcp:receive(4))
tcp:close()
return success and time or nil
end
local function nettime()
for _, ip in pairs(server_ip) do
time = gettime(ip)
if time then
return time
end
end
end
dialog(nettime(),0)
統計毫秒精度時間
local bb = require("badboy")
bb.loadluasocket()
local socket = bb.socket
local function sleep(sec)
socket.select(nil,nil,sec);
end
local t0 = socket.gettime()
sleep(0.4);
local t1 = socket.gettime()
dialog(t1 - t0, 0)
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,
}