新闻详情

新闻详情

首页 / 资讯中心 / 详情

Autojs坐标操作全攻略:从点击滑动到分辨率适配

发布时间:2026/9/19 3:46:42来源:尧图网络
Autojs坐标操作全攻略:从点击滑动到分辨率适配
1. 屏幕坐标体系Autojs坐标操作的地基逻辑先说一个我自己的观察很多刚开始接触Autojs的朋友第一反应是找怎么自动点击某个按钮结果翻遍文档发现最核心、最绕不开的反而是两个基础问题——怎么拿到坐标和拿到坐标之后怎么用。而这两个问题说白了就是屏幕坐标系的问题。Autojs的坐标操作本质上就是在Android设备的屏幕二维平面上用x, y这个数值对去描述手指应该落在哪里、怎么移动。这个逻辑听起来简单但里面有几个细节决定了你脚本的稳定性。1.1 Android屏幕坐标系的原点、取值和单位Android的屏幕坐标系原点固定在屏幕左上角x轴向右增长y轴向下增长。x的取值范围是0到屏幕宽度y的取值范围是0到屏幕高度单位是像素px。这就引出一个非常关键的常识不同手机的像素密度不同。同样是屏幕中间这个位置在1080x2340分辨率的手机上x可能是540在1440x3200分辨率的手机上x就变成了720。如果你把坐标写死脚本换一台手机就彻底废了。Autojs官方其实提供了一个适配方案——setScreenMetrics()方法。这个方法的作用是按照你设计脚本时使用的分辨率来映射坐标然后在不同分辨率的设备上运行时自动做等比缩放。// 脚本开头声明设计分辨率 setScreenMetrics(1080, 2340); // 之后这段脚本运行在任何设备上都会按1080*2340的比例来找坐标 click(540, 1200);实操建议写任何坐标脚本的第一步先确定当前设备的分辨率和dpi再决定是用固定坐标还是走缩放适配。我通常是先在开发者文档页执行device.width x device.height拿真实分辨率再规划坐标策略。1.2 拿到坐标的三种手段开发者选项、截图工具、Auto.js自身那怎么知道目标位置的具体坐标值是多少别靠猜实测中我常用的有三个办法开发者选项里的指针位置Android系统自带的功能。开启后屏幕顶部会实时显示手指触点坐标。这是最原始、最直接的办法就算不走Autojs调试任何屏幕操作类工具都能用。Auto.js悬浮窗截图Autojs界面自带截图并查看坐标的功能截图后可以上下左右移动十字线定位能直接复制坐标值。但我个人觉得逐点比对效率偏低。运行时打印节点信息执行dump()或者遍历clickable节点把可点击控件的文本和bounds()打出来然后从控件边界推导出手指的落点。这个办法最精准因为可以直接拿到元素的中心点。其中第三种办法最值得养成习惯因为坐标操作不只是点击屏幕某一点更多时候是点击某一个控件所在的区域而控件区域会被各种列表、弹窗、加载状态影响位置变化。这时候纯粹的固定坐标就是空中楼阁必须结合节点查找。2. 坐标操作的四大核心动作click、press、swipe、longClick如果只记一类API那必然是动作类API。Autojs里坐标相关的动作归根结底是四个基本动作点击、按住、滑动、长按。所有的高级功能——翻页、拖拽、多指手势——都是在这几个动作基础上组合出来的。2.1 click与press的本质区别click(x, y)和press(x, y, duration)很多人以为可以互相替代其实用途完全不同。click()是模拟一次完整的手指点击系统层面会自动处理按下和抬起的时序适合绝大多数场景——比如点开App、点击按钮、确认弹窗。它的特点是快一旦触发立刻抬起。press()则是按住屏幕需要你明确指定按住多久单位是毫秒。这个API通常用在一些特殊场景里例如长按某个App图标触发桌面编辑模式。按住语音消息切换成扬声器播放。在游戏中控制角色持续施法。所以我的习惯是凡是点一下就有效果的操作用click凡是按住后发生动作的操作用press。不要混用否则容易出现脚本逻辑上一闪而过的bug。2.2 swipe滑动坐标操作的灵魂swipe(x1, y1, x2, y2, duration)是坐标操作中使用频率最高的函数之一。它的参数含义是从点A滑到点B过程耗时多少毫秒。这里的核心是理解滑动是两个点之间的路径插值不是滑动某个方向。Autojs底层会把直线路径切成很多小片段一步一步地移动手指所以滑动轨迹基本是直线。这也带来一个后果如果你想模拟真实用户那种略带弧度的滑动光靠swipe是不够的需要自己写多点路径插值。// 从屏幕中点滑到屏幕上方耗时800毫秒 swipe(540, 1200, 540, 300, 800); // 向上滑动分三次模拟逐屏翻页的效果 for (let i 0; i 3; i) { swipe(device.width / 2, device.height * 0.7, device.width / 2, device.height * 0.3, 600); sleep(800); }注意swipe的坐标范围必须在屏幕内。如果你传入的y2小于0或者大于屏幕高度部分机型会直接忽略这次滑动。我踩过这个坑——在开发平板脚本时想快速滑到顶部结果传了一个y20的坐标后来发现屏幕最顶端其实是状态栏区域实际生效范围被系统限制住了。2.3 longClick长按与手势进阶longClick(x, y)大家应该不陌生就是长按某个位置。它最快能解决的是复制文字场景先长按某个文本区域系统弹出选择框再通过坐标点击复制按钮。// 长按一个按钮触发上下文菜单 longClick(540, 1500); sleep(800); // 等待菜单出现后点击复制 click(540, 1900);再加上Autojs的gesture()函数你可以自定义多段连续滑动路径。// 自定义一条先向右再向上的路径 gesture(800, [300, 1500], [600, 1200], [600, 400]);这个函数适合用在滑动验证、地图拖动这类需要连续操作的环境里。不过说实话90%的日常自动化需求用不到gesture把click和swipe吃透就已经能解决绝大部分场景。3. 固定坐标与控件坐标什么时候该硬点什么时候该找节点Autojs刚入门的时候几乎所有人都沉迷于硬点坐标——找到位置写上数字跑通了就觉得大功告成。但用不了多久就会发现脚本在A手机上跑得好好的到了B手机上全乱套或者同一个手机昨天还好好的今天列表多了一个元素所有坐标全部偏移。这个问题的根源在于固定坐标是对位置的直觉描述而控件坐标才是对界面的逻辑描述。前者在静态界面上有效后者在动态界面上才可靠。3.1 固定坐标适合的场景启动页跳过广告广告图片位置每次固定坐标直接点右上角。固定的弹窗确认/关闭按钮如果系统弹窗位置不变点击坐标是最快的方案。游戏辅助类操作游戏画面中按钮位置固定控件树往往拿不到节点。自己设计的页面或测试环境界面完全可控坐标必然稳定。这些场景的共同特点是界面静态、内容固定、无外界数据干扰。3.2 控件坐标适合的场景App列表滚动加载内容项高度、位置随数据变化必须通过text()、desc()定位。社交App、资讯App上的点赞、评论每个条目的位置完全随机。弹窗与页面切换频繁的场景节点会给你等它出现的能力。实际项目中我通常采用混合策略先用节点找到目标元素的bounds再取bounds的中心点做坐标点击。这样兼顾了稳定性和灵活性。// 找文本为立即领取的控件点击它的中心 let btn text(立即领取).findOnce(); if (btn ! null) { let bounds btn.bounds(); click(bounds.centerX(), bounds.centerY()); }3.3 节点查找失败时的坐标兜底方案节点方案不是万能的。很多App把界面渲染到了WebView里或者用自绘引擎比如游戏Unity这时候Autojs拿不到控件树只能靠坐标。我的兜底策略是先截图然后通过找色找图的方式定位目标。// 找图示例在截图中找到目标图片的位置 let img images.captureScreen(); let p images.findImage(img, images.read(/sdcard/target.png)); if (p) { click(p.x targetImage.width / 2, p.y targetImage.height / 2); }这里有个细节images.findImage()找到的是图片左上角的位置所以如果你想点击图片正中心必须手动加半个图片宽高。很多新手脚本没注意这个偏移导致图找到了但点不到。4. 向上翻页的三种写法与循环处理热搜词里有autojs往上翻页这个确实是个高频需求。自动签到、自动浏览文章、自动采集内容第一步往往是往上翻。但往上翻也有讲究用哪种方式翻、翻多少、什么时候停直接决定脚本的完成度。4.1 基于swipe的通用翻页最直接的方案就是swipe从屏幕中下部向中上部滑动模拟手指一拨的动作。function swipeUp() { let w device.width; let h device.height; swipe(w / 2, h * 0.75, w / 2, h * 0.25, 400); }注意起始点和结束点不要贴着屏幕边缘最好保留15%到25%的余量。原因有两个一是边缘区域容易触发系统手势比如从底部上滑触发多任务、从顶部下滑触发通知栏二是从屏幕中间区域开始滑动视觉上更接近真实用户操作。4.2 基于控件和滚动的翻页有些场景下swipe翻页会拉过头。比如一个很长的图文页面你只是想往下翻一屏但页面惯性滚动过头导致错过了中间内容。这种情况更适合用控件的scrollForward()方法。// 找到可滚动的控件执行向前滚动 let scrollableWidget className(android.widget.ScrollView).findOnce(); if (scrollableWidget ! null) { scrollableWidget.scrollForward(); }这种方法相当于调用系统界面原生的滚动逻辑滚动量由系统面板决定不会出现过冲问题。4.3 翻页循环与停止条件判断光会翻还不行循环翻页逻辑才是脚本的核心。我常用的循环框架如下function scrollToTopWithCheck(maxTimes) { let count 0; while (count maxTimes) { // 如果出现了目标内容提前结束 if (textContains(目标关键词).findOnce() ! null) { toast(找到目标内容); return true; } // 如果界面没有变化说明已经到顶了 let before text(加载更多).findOnce() ! null; swipeUp(); sleep(1000); let after text(加载更多).findOnce() ! null; if (before after) { count; if (count 3) { toast(可能到达底部); return false; } } } return false; }细节重点判断是否翻到底部不能只看有没有出现某个新元素还要结合连续几次翻页后界面是否变化来判断。我见过不少脚本遇到加载更多就会一直去点击结果陷入了点了之后还出现加载更多的无限循环里。加一个基于连续次数的判断逻辑基本能拦住这种问题。5. 分辨率适配与多点触摸把坐标脚本写活这部分是我认为坐标操作里决定了脚本能用多久的关键。很多人的脚本换个手机就废要么变砖要么乱点核心问题就是没有做分辨率适配。5.1 setScreenMetrics与相对坐标换算前面提过setScreenMetrics(1080, 2340)可以在脚本运行时转换坐标。但它的作用是把脚本里写的坐标等比映射到当前屏而不是自动找到元素。所以如果你想基于相对位置计算最简单的方式是用比例。let x device.width * 0.5; let y device.height * 0.75; click(x, y);用比例代替绝对像素值可以让同一个脚本在不同尺寸的屏幕上保持相对位置不变。比如屏幕中间偏下位置用device.width * 0.5, device.height * 0.75描述到任何手机上都是一个意思而写死540, 1400换台平板就完全不是那么回事了。5.2 坐标偏移和区域随机提升稳健性还有一个小技巧可能有人不知道点击辅助类App时系统会检测过于精确的坐标点击作为机器行为特征之一。所以我们的坐标不要每次都完完全全一样可以加一点点随机偏移。// 在原坐标基础上偏移0-10像素 function clickRandom(x, y) { let ox random(0, 10); let oy random(0, 10); click(x ox, y oy); }这个偏移量不要太大3到10像素就够。太大反而容易点到不该点的东西。同时在连续滑动之间加入随机的延时也能让脚本行为更自然。5.3 多点触控的模拟思路如果场景需要双指操作比如图片缩放、双指滚动列表Autojs提供了multiTouch()方法。它可以同时控制多个手指的路径。// 双指同时向内滑动模拟缩放 multiTouch(function () { let finger1 [300, 800, 400, 800, 500, 800]; let finger2 [800, 800, 700, 800, 600, 800]; for (let i 0; i finger1.length / 2; i) { let x1 finger1[i * 2]; let y1 finger1[i * 2 1]; let x2 finger2[i * 2]; let y2 finger2[i * 2 1]; touchDown(0, x1, y1); touchDown(1, x2, y2); sleep(50); } touchUp(0); touchUp(1); });不过说实话日常脚本里使用多点触控的频率很低。大多数App的核心自动化场景用单击、双击、滑动就能覆盖。多点触控更多是用在玩一些特定游戏或者做手势演示的时候。作为了解即可不建议新手一上来就在这一步花太多时间。6. 坐标操作的边界情况无障碍服务、悬浮窗与异常处理不管是写什么Autojs脚本最终运行都绕不开两个前置条件无障碍服务权限和悬浮窗权限。这两个是脚本能够执行UI操作的前提。坐标操作本身也有不少边界情况我把实际遇到的坑集中列出来。6.1 无障碍服务与坐标操作的关系值得明确的是Autojs的坐标点击能力本质上是依赖无障碍服务。无障碍服务提供了全局手势注入的能力让脚本可以像用户手指一样操作屏幕。所以如果无障碍服务没开或者被系统杀掉了整个坐标操作就会失效。我见过有人排查半天为什么点击没反应最后发现是手机的电池优化功能在后台把Autojs的无障碍服务给关了。建议在设置里把Autojs加入白名单同时开启自启动权限。脚本开头也最好做一次判断auto.waitFor();auto.waitFor()会阻塞执行直到无障碍服务可用。如果服务被禁用会一直等待用户可以从日志面板看到等待提示。6.2 悬浮窗权限在坐标调试中的作用悬浮窗权限很多人第一反应是这和坐标有什么关系。其实关系很大Autojs的悬浮窗可以显示脚本运行状态、调试按钮、坐标信息还可以作为一个可视化指示器告诉你当前坐标点在哪。在实际调试坐标的时候我的习惯是写一个临时脚本在屏幕上方生成一个悬浮窗每0.5秒刷新一次显示当前手指位置。这样可以很直观地看到每次swipe到底是从哪里开始、在哪里结束的。// 简单示例悬浮窗显示当前设备分辨率 let window floaty.rawWindow( frame bg#66000000 w200px h50px text idinfo textSize14sp textColor#ffffff gravitycenter/ /frame ); window.setPosition(0, 0); setInterval(() { window.info.text(device.width x device.height); }, 1000);6.3 坐标操作的异常保护不要让脚本乱点坐标操作最大的风险是点错了。如果脚本运行过程中某个界面提前弹出或者坐标偏了脚本可能点到完全不相干的地方轻则操作失败重则触发一些不想触发的行为。所以我在写所有涉及坐标的脚本时都会加一层操作前检查。// 点击前先确认目标区域有预期控件 function safeClick(desc, x, y) { if (desc ! null) { let target desc(desc).findOnce(); if (target null) { log(未找到目标跳过点击); return false; } } click(x, y); return true; }这套逻辑虽然会增加代码量但它能大幅降低点飞了的概率。尤其是跑长时间批处理任务的时候脚本自己跑到一半乱点一通那才是麻烦大了。7. 坐标自动化能做什么从签到、浏览到内容采集协调操作聊了这么多很多人最关心的还是我能用这个做什么。尤其是搜到自动化赚钱这个热词的人大概率是想知道坐标操作能不能带来实际收益。我的看法是Autojs本身只是工具关键看你怎么设计任务流程。下面列几个真实可行、合规范围内的应用方向。7.1 自动签到和每日任务很多App都有每日签到领积分的机制比如电商类、社区类、运动类App。签到的入口位置通常固定每天点一下就行。用坐标操作写一个自动签到脚本配合定时任务可以每天固定时间自动完成。实现思路很简单打开App等待首页加载完成。通过文本查找签到领奖入口点击进入。在签到页根据坐标点击立即签到。重点在于异常处理如果今天已经签到过了页面可能没有立即签到按钮脚本需要能识别这种状态不要傻乎乎地继续点。7.2 自动浏览与阅读任务一些资讯类或学习类平台会通过浏览文章、看视频奖励积分。这类任务的核心就是翻页”——往下滑看一会儿再往下滑持续一段时间。坐标操作在这里就是主力for (let i 0; i 20; i) { swipe(device.width / 2, device.height * 0.7, device.width / 2, device.height * 0.3, 500); sleep(random(3000, 6000)); }这里我特意用了random(3000, 6000)的随机延时既是为了模拟真实阅读节奏也是为了避免每次点击间隔过于规律被平台识别。7.3 自动化信息采集更进阶一些的用法是自动化采集。比如你想收集某类商品的用户评价或者监控某个页面的价格变化坐标操作可以帮你完成滚动页面 截屏保存的工作。再配合OCR识别就能把屏幕上的文字批量提取出来。这种做法本质上是把人从枯燥的人工浏览-复制粘贴中解放出来。我建议往这个方向走的读者重点研究翻页边界检测和数据去重这两点决定了采集数据的质量和脚本效率。7.4 合规与风险提示最后我必须说一句实在话任何自动化操作都应该在平台允许的范围内展开。有些平台对自动化脚本零容忍检测到之后轻则功能受限重则封号。所以做自动化项目的时候建议控制操作频率不要短时间暴力点击。优先选择不涉及真实资金、不干扰他人正常使用的场景。二次确认脚本逻辑避免因坐标错乱而产生错误操作。坐标操作本身不违规关键是用途和尺度。把这行字刻在心里的脚本作者通常能走得更远。8. 坐标操作性能优化与小技巧少踩坑多跑量这一节与其说是优化不如说是**血泪经验清单**。都是我在实际写脚本过程中踩过、修过的坑今天一次性整理出来给做坐标操作的朋友们少走点弯路。8.1 避免频繁刷新界面的坐标跳动有些界面的坐标会因为加载状态、广告位、占位图而发生偏移。解决思路是等待界面稳定后再做操作而等待界面稳定的方式不能只用sleep()死等最好配合节点判断。function waitForStable(selector, timeout) { let start new Date().getTime(); while (new Date().getTime() - start timeout) { if (selector.findOnce() ! null) { sleep(300); // 额外多等300ms确保动画结束 return true; } sleep(200); } return false; }8.2 大量坐标操作时注意帧率和任务队列如果你在一个循环里高频执行点击比如每秒执行几十次部分低端手机会出现点击事件丢失或界面卡顿的情况。这时候可以适当降低频率在每次操作之间加入20到50毫秒的间隔。不要小看这几十毫秒它对整个脚本的稳定性影响很大。for (let i 0; i 100; i) { clickRandom(x, y); sleep(30); }8.3 日志与调试把坐标信息打印出来写坐标脚本最忌讳的是盲写。跑一次不行再改再跑效率很低。更聪明的做法是让脚本自己输出坐标信息你只需要读日志就能知道哪里不对。log(准备点击: ( x , y ));然后配合Autojs的Logcat窗口你可以在PC端用USB调试查看日志这样连手机都不用拿在手里就能定位问题。8.4 定时任务与长期运行省电策略Autojs脚本如果长期挂机运行耗电量会非常高。尤其是使用悬浮窗、保持屏幕常亮的场景。省电的关键策略是不需要屏幕显示的时候降低屏幕亮度。尽量缩短悬浮窗显示时间用完即关。在sleep()时长上能长则长不要为了快而频繁轮询。device.setBrightnessMode(0); // 关闭自动亮度 device.setBrightness(10); // 亮度调到最低如果脚本需要整夜跑记得关闭各种消息通知的弹窗干扰不然一个弹窗插进来坐标全部偏移整个脚本直接白跑。8.5 多分辨率兼容的终极思路我最后再说一个通用经验。写坐标脚本时不要只用一台手机测试。有条件的话准备一台低分辨率手机和一台高分辨率手机交叉验证。所有坐标优先用比例方式计算必要时配合setScreenMetrics()。这样你的脚本才能称得上实用而不是只在某个特定机型上可用。说到底坐标操作是Autojs所有自动化的基石。它不难但细节非常多。把这篇文章里的内容消化透再回去看那些花里胡哨的脚本案例你会觉得一切都顺理成章了。这些经验都是我一台台机器、一个个脚本跑出来的希望能帮你省下那些我当年白白浪费的时间。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

SpringBoot+Vue旅行指南系统毕业设计实战 2026/9/19 6:14:22

SpringBoot+Vue旅行指南系统毕业设计实战

1. 项目概述作为一名有10年Java开发经验的程序员,我想分享一个非常适合作为毕业设计的项目——基于SpringBoot的旅行指南攻略游记系统。这个项目不仅涵盖了现代Web开发的完整技术栈,还包含了丰富的业务场景,能够全面锻炼学生的开发能力。这个…

阅读更多 →
构建“以客户为中心”的“华为+伙伴”协同体系,让AI惠及千行百业 2026/9/19 6:14:22

构建“以客户为中心”的“华为+伙伴”协同体系,让AI惠及千行百业

9月18日,在华为全联接大会2026期间,华为公司高级副总裁、企业销售总裁陈雷发表了“携手伙伴,让AI惠及千行百业”的主题演讲,分享了华为关于智能化从标杆走向千行百业的最新思考与实践,并发布“SCALE”伙伴支持体系&…

阅读更多 →
硬盘满了?Czkawka 免费磁盘清理工具箱教程:5 分钟快速清理重复文件与垃圾 2026/9/19 6:14:22

硬盘满了?Czkawka 免费磁盘清理工具箱教程:5 分钟快速清理重复文件与垃圾

硬盘满了?Czkawka 免费磁盘清理工具箱教程:5 分钟快速清理重复文件与垃圾 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 硬…

阅读更多 →
Aptos Move 验证单态化(Monomorphization)正确性证明:从可执行变换到端到端可靠性 2026/9/19 6:14:22

Aptos Move 验证单态化(Monomorphization)正确性证明:从可执行变换到端到端可靠性

Aptos Move 验证单态化(Monomorphization)正确性证明:从可执行变换到端到端可靠性 【免费下载链接】aptos-core Aptos is a layer 1 blockchain built to support the widespread use of blockchain through better technology and user expe…

阅读更多 →
Two Sum II – Input Array Is Sorted (167): Hash Map vs. Two Pointers on a Sorted Array 2026/9/19 6:14:22

Two Sum II – Input Array Is Sorted (167): Hash Map vs. Two Pointers on a Sorted Array

Two Sum II – Input Array Is Sorted (167): Hash Map vs. Two Pointers on a Sorted Array 【免费下载链接】leetcode LeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解,记录自己的leetcode解题之路。) 项目地址: https://gitcode.c…

阅读更多 →
3 步装好 LibreHardwareMonitor:免费硬件监控工具的完整指南 2026/9/19 6:11:21

3 步装好 LibreHardwareMonitor:免费硬件监控工具的完整指南

3 步装好 LibreHardwareMonitor:免费硬件监控工具的完整指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. 项目地…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞