
1.前言坐標操作是基于坐標模擬人的點擊、長按、滑動、觸摸等操作。雖然這部分內容比較簡單但是這是腳本開發最重要的部分。坐標操作貫穿腳本的整個過程每個腳本開發軟件都會帶有這些功能我這里就不過多介紹。2.setScreenMetrics屏幕寬高設置函數需要傳遞兩個參數分別為屏幕寬度和屏幕高度參數類型均為數字單位均為像素。這個函數一般在多屏幕分辨率場景下使用用于指定當前坐標操作在哪個分辨率下完成的當屏幕分辨率改變時會自動根據當前屏幕分辨率進行校對。比如指定手機寬度為720和高度為1280點擊200,400坐標到了手機寬度為360和高度為640的手機點擊坐標自動轉換為100,200。通過轉換規則會發現坐標轉換會完全按照屏幕比進行一比一轉換。其實我們在腳本開發過程中會在固定分辨率下完成腳本比如我常用的分辨率720*1280。。一般不會有人開發多個分辨率的腳本雖然坐標操作會自動轉換但是圖像處理要做多個分辨率的處理腳本開發的工作量成倍增加。正常情況下我們會在固定屏幕分辨率下完成腳本后面無論是在模擬器還是虛擬機下運行腳本都采用這個分辨率。這種情況下根本不需要進行坐標轉換因此這個函數大多數情況下不需要使用。3.坐標信息我們平時說的屏幕分辨率為豎屏情況下的寬度和高度的像素值比如720*1280就是代表豎屏情況下屏幕寬度為720像素高度為1280像素。為了坐標點擊更準確腳本會以屏幕左上角為原點以向右為x軸正方向以向下為y軸正方向生成一個二維坐標系。下面坐標點擊的xy值都是代表這個坐標系的值不會再過多介紹。一般情況下所有腳本軟件在豎屏情況下的橫縱坐標設置都是這個情況。但是在橫屏情況下橫縱坐標設置會五花八門這才是讓人頭疼的地方。autojs腳本腳本橫縱坐標設置還是按照我上面說的規則以屏幕左上角為原點以向右為x軸正方向以向下為y軸正方向生成一個二維坐標系。但是橫屏情況下豎屏情況下以寬度為橫坐標橫屏情況下以高度為橫坐標豎屏情況下以高度為縱坐標橫屏情況下以寬度為縱坐標。autojs比較好的就是原點還是左上角并且xy軸的正方向也沒有改變。如果你使用過按鍵精靈手機助手進行截圖會發現橫屏情況下的縱坐標的正方向都會改變那才是讓人頭疼的為了不誤解大家我就不截圖按鍵精靈手機助手坐標系了。默認情況下使用此橫屏坐標系如果不使用此坐標系時會進行說明。其實腳本開發過程中我們根本不關心這個坐標是怎么轉換的。雖然按鍵精靈手機助手橫屏轉換后坐標系很難讓人理解但是按鍵精靈手機助手有自己的截圖和選點助手我們只要保證我們選點和點擊位置能夠與屏幕對應就可以了到時候直接復制使用即可根本不需要關心坐標系問題。如果你看過其他人講解的autojs腳本開發教程他們都會采用各種方式獲取屏幕坐標點這種方式用于講解腳本還可以要是用于項目級別的腳本開發怎么辦尤其是圖像處理過程中一個處理就需要那么多點和顏色通過哪些方式開發個腳本得浪費都多少時間。可能有小伙伴說有個別教程上有截圖助手但是那些助手好獲取嗎真的好用嗎當然沒有截圖助手難道就不能開發腳本了嗎當然可以但是真的很慢很痛苦。我做了個豎屏的游戲腳本通過按鍵精靈手機助手獲取點坐標因為豎屏情況下兩者點坐標是一致的但是按鍵精靈手機助手和autojs的顏色表示不一致我當初還沒有找到轉換規律。只能想通過按鍵精靈手機助手先獲取需要比對點的信息然后通過我封裝的按鍵精靈點信息到autojs點信息轉換的函數打印需要的信息這個過程很復雜就不介紹了。但是每個圖像處理我都得先運行代碼獲取轉換信息然后將信息替換到代碼然后再運行代碼檢查是否識別到。就是每個圖像處理我都得運行兩次autojs代碼才行還得配合按鍵精靈手機助手使用速度真的很慢。我比較慶幸的是這個項目是豎屏項目我如果剛接觸是橫屏項目沒有理解按鍵精靈手機助手和autojs腳本之間的坐標轉換我真可能會放棄。那個游戲很老了是小時候那種直板機都可以玩的游戲。后來我去接觸橫屏游戲發現這種方式效率越來越低經過一系列為了提高效率的各種方式我直接通過html封裝了兩個轉換頁面最終達成直接復制按鍵精靈生成的點顏色信轉換成自己需要的點顏色信息。后面會介紹坐標轉換工具對于點顏色轉換工具在圖像處理模塊會進行介紹。4.無障礙操作1.click點擊屏幕需要傳遞兩個參數分別為x坐標和y坐標參數類型均為數字點擊過程大約150毫秒。2.longClick長按屏幕需要傳遞兩個參數分別為x坐標和y坐標參數類型均為數字長按過程大約600毫秒。3.press按住屏幕需要傳遞三個參數分別為x坐標、y坐標和按住時間參數類型均為數字。這個函數可以完成上面的click和longClick函數的功能按住時間較少時可以理解為點擊按住時間較長時間是可以理解為長按。一般對于上面兩個函數默認操作時間不滿意時可以通過這個函數完成功能。4.swipe兩點之間滑動屏幕需要傳遞5個參數分別為滑動起始位置的x坐標、滑動起始位置的y坐標、滑動結束位置的x坐標、滑動結束位置的y坐標和滑動時長單位毫秒參數類型均為數字。我自己感覺這個滑動起始位置和結束位置很容易弄反了每次使用這個函數時可以自己將手指放在屏幕上試下然后再取點。5.gesture一個手指多點滑動屏幕需要傳遞兩個參數分別為滑動時長單位毫秒和點數組參數類型分別為數字和數組。這個函數過程類似屏幕滑動解鎖的過程。gesture(1000, [[30, 296], [454, 350], [127, 553], [489, 599]]);6.gestures一個手指多點滑動屏幕需要至少一個參數參數類型為數組。傳遞一個參數時功能和gesture函數一致gestures函數可以理解為多個gesture函數同時操作。每個參數數組包含至少三個值分別代表延遲多久執行、執行時長和第三值以后代表點數組。這個函數我不建議使用我發現這個函數穩定性不太行。很容易導致應用閃退。建議如果使用多手指滑動不如執行gesture函數。gestures([0, 500, [1199, 527], [137, 500]], [500, 500, [743, 129], [389, 125]] );5.Root操作1.Tap使用方式以及作用與無障礙操作的click函數完全一致。但是Tap函數需要在Root權限的基礎上執行效率遠低于click函數一般不會使用。2.Swipe使用方式以及作用與無障礙操作的swipe函數完全一致。但是Swipe函數需要在Root權限的基礎上執行效率遠低于swipe函數一般不會使用。6.RootAutomator操作1.概況RootAutomator操作橫屏狀態下的坐標系與按鍵精靈手機助手的坐標系完全一致如果使用此對象進行坐標系操作就不會涉及坐標轉換。但是RootAutomator操作需要在root環境下完成目前很多手機已經沒有root環境因此無障礙操作還是我們使用最多的坐標操作。現在是學習情況下橫屏條件下使用此對象操作坐標的坐標情況如下圖雖然這個坐標系正方向感覺有點怪但是按鍵精靈手機助手的抓抓就是在此環境下完成的抓取的坐標可以直接使用。如果腳本環境是支持root的情況下用RootAutomator操作坐標也是不錯的選擇最起碼不用考慮坐標轉換問題了但是還要配合顏色信息轉換工具完成轉換具體使用到此工具時候再進行介紹。但是哪怕在root環境下我也會通過無障礙操作坐標因為無障礙兼容性最好操作速度也是最快的。2.構造函數所有的RootAutomator操作都是通過構造函數獲取的對象完成。也就是說使用RootAutomator操作之前先構造這個對象然后通過這個對象調用里面的函數。構造函數接受一個對象對象包含adb和inputDevice兩個參數參數分別代表是否使用adb權限和指定操作的設備參數類型分別為boolean和字符串類型。雖然這個構造函數可以傳遞對象信息但是我們在使用時不需要進行傳遞使用默認配置即可。這個對象參數我也沒有很深入的研究大家記得使用默認即可因為整個RootAutomator操作一般情況下都不會使用對于這部分有所了解即可。let currentObj new RootAutomator(); getAutojsObjectFunctions(currentObj); // 獲取Autojs對象所有的函數 function getAutojsObjectFunctions(obj) { if (obj null || typeof obj ! object) { console.log(參數必須是一個對象); return; } // 獲取對象自身的所有屬性名 var propertyNames Object.getOwnPropertyNames(obj); // 篩選出函數類型的屬性 var functionNames propertyNames.filter(function (prop) { return typeof obj[prop] function; }); if (functionNames.length 0) { console.log(該對象沒有函數屬性); return; } // 遍歷并打印每個函數的信息 functionNames.forEach(function (methodName) { // 按照指定格式打印 console.log(函數名: methodName ()); }); }3.exit退出函數用于銷毀創建的RootAutomator操作對象。如果想使用RootAutomator進行坐標操作可以想通過構造函數獲取操作對象然后進行一系列操作然后在腳本最后調用退出函數銷毀操作對象。也就是說整個腳本過程中可以通過構造函數只創建一個RootAutomator對象在腳本最后只通過exit函數銷毀一次操作對象。其實我們真正腳本開發中我們使用最多的還是無障礙操作其他坐標操作很少使用。注意如果用于簡單的功能測試時在操作函數調用之后加個延遲再調用exit函數。如果不加延遲會導致直接銷毀對象導致操作函數不生效。這種問題只是會出現在測試過程中由于exit函數比操作函數快導致未操作之前銷毀了對象。但是在實際腳本開發過程中坐標操作和圖像處理配合使用exit函數也就執行一次不會出現操作不執行的情況就是腳本最后一個操作注意一下就行為了不出現問題可以在exit函數退出之前都加個500毫秒的延遲。4.tap點擊屏幕需要傳遞三個參數分別為x坐標、y坐標、操作id參數類型均為數字。這個函數的功能和無障礙的click函數功能類似RootAutomator對象下的操作函數都是有個操作id這個id是操作的唯一標識用于區分不同的操作。后面操作函數的參數操作id功能相同不會再介紹。let currentObj new RootAutomator(); currentObj.tap(280, 540, 1); sleep(500); currentObj.exit();注意官方文檔中說操作id可以選填默認為1但是我不傳遞操作id操作會不執行。我們在單操作過程中為了保證函數執行也手動填寫一個值為1的操作id。5.swipe兩點之間滑動屏幕需要傳遞6個參數分別為滑動起始位置的x坐標、滑動起始位置的y坐標、滑動結束位置的x坐標、滑動結束位置的y坐標、滑動時長單位毫秒和操作id參數類型均為數字。功能和無障礙操作的swipe函數類似。swipe函數傳參可以和官方文檔中說明一致滑動時長和操作id可以不傳遞。6.press與longPresspress代表觸摸屏幕需要傳遞四個參數分別為x坐標、y坐標、按下時間單位毫秒、操作id參數類型均為數字。longPress代表長時間觸摸屏幕需要傳遞三個參數分別為x坐標、y坐標、操作id。press可以和官方文檔中說明一致操作id可以不傳遞默認為1。但是longPress官方文檔說可以傳遞按下時長實際上此函數只能傳遞上述三個參數最后一個參數操作id可以不傳遞。這兩個函數功能也類似只是longPress函數不能設置按下時間罷了。let currentObj new RootAutomator(); currentObj.press(574, 73, 100); sleep(1000); currentObj.exit();7.touchDown、touchMove和touchUptouchDown和touchMove分別代表手指按下和手指滑動均需要傳遞三個參數分別為x坐標、y坐標、操作id操作id可以不傳遞默認為1。touchUp代表手指彈起只需要傳遞操作id這一個參數這個參數可以不傳遞默認為1。通過這三個函數可以實現點擊、觸摸、滑動等操作這三個函數更像是將一個功能分步完成特別需要注意按下或者滑動后調用一下手指彈起函數。let currentObj new RootAutomator(); // 模擬點擊 currentObj.touchDown(574, 73); currentObj.touchUp(); sleep(1000); // 模擬滑動 currentObj.touchDown(116, 756, 2); currentObj.touchMove(326,748, 2); currentObj.touchUp(2); sleep(1000); currentObj.exit();7.RootAutomator2操作在官方第一代API文檔中存在RootAutomator2的相關內容但是實際上autojs免費版根本沒有RootAutomator2對象。我們使用免費版參考第一代API文檔內容能夠滿足大部分需求但是第一代API文檔中的部分內容與我們autojs免費版有沖突甚至有些對象或者函數在免費版中根本不存在這也是制作autojs教程的原因。下面代碼證明了RootAutomator對象存在但是RootAutomator2對象不存在。if (typeof RootAutomator ! undefined) { console.log(存在RootAutomator對象); } else { console.log(不存在RootAutomator對象); } if (typeof RootAutomator2 ! undefined) { console.log(存在RootAutomator2對象); } else { console.log(不存在RootAutomator2對象); }8.總結對于autojs免費版來說坐標操作有無障礙和RootAutomator兩種方式。豎屏狀態下兩者坐標系是一致的。在橫屏狀態下無障礙的坐標系利于理解RootAutomator的坐標系和按鍵精靈手機助手一致。無障礙的坐標系雖然和截圖軟件的坐標系會有沖突但是配合后面的顏色信息轉換工具使用就不存在這個問題。哪怕使用RootAutomator不用轉換坐標但是按鍵精靈手機助手的顏色信息和autojs的顏色信息有區別也要通過顏色信息轉換工具進行顏色轉換。因此無障礙的坐標系沖突顯得不那么重要哪怕點擊操作只需要獲取轉換后的坐標也有對應的坐標轉換工具。我不推薦RootAutomator的原因是現在很多環境是不支持Root的同時RootAutomator速度遠沒有無障礙快兼容性也沒無障礙好。