setScreenMetrics(width, height),这个api,我是用一加ace2pro1240×2772这个分辨率调的,后面微调以后一加131440×3168这个分辨率能用,那为什么iQOO Z10 Turbo+2800×1260这个就不能用了呢?
回答
你遇到的问题是由于 setScreenMetrics(width, height) 虽然能自动缩放坐标,但前提是脚本设计时的宽高比与目标设备的宽高比差异不能过大,否则会导致坐标映射严重失真,从而点击或操作位置错误。
你的原始分辨率:一加 Ace2 Pro 1240×2772,宽高比约为 0.447(1240 / 2772)
目标设备之一:一加 13 1440×3168,宽高比约为 0.454(1440 / 3168)
两者宽高比接近,因此 setScreenMetrics 缩放后仍能正常工作。
而 iQOO Z10 Turbo+ 2800×1260 的宽高比为 2.222(2800 / 1260),这是典型的横屏为主的设计比例,和你原来竖屏高窄屏(~0.45)完全不同。
这意味着:
- 原始脚本认为屏幕是“高大于宽”的竖屏布局;
- iQOO Z10 Turbo+ 实际是“宽大于高”或至少是宽屏取向;
- 当 Hamibot 按照
setScreenMetrics(1240, 2772)对(x, y)进行缩放时,会把原本在竖屏中的坐标强行映射到一个横屏上,导致控件位置错乱,点击偏离预期区域。
此外,某些机型还可能存在以下问题加剧异常:
- 屏幕旋转方向不同(自动旋转开启)
- 导航栏/状态栏高度占比变化大
- UI 布局随屏幕尺寸自适应调整(如平板式布局)
解决方案建议:
-
统一开发基准分辨率
尽量以主流竖屏比例(如 1080×2340、1240×2772)作为设计基准,并避免在极端宽高比设备上运行。 -
使用控件查找代替纯坐标点击
改用基于控件识别的方式(如text("登录").click()或id("submit").findOne().click()),这样不受分辨率和布局影响。示例:
// 推荐方式:通过控件操作 if (text("确定").exists()) { text("确定").click(); } -
结合控件与坐标的混合模式
如果必须用坐标,可先定位控件再点击其中心:var w = text("提交").findOne(2000); if (w) { click(w.bounds().centerX(), w.bounds().centerY()); } -
动态设置 setScreenMetrics 根据实际设备判断
在脚本开始时检测当前设备分辨率,决定是否适配或提醒用户:if (device.width > device.height) { toast("请在竖屏模式下运行此脚本"); exit(); } // 按原始设计分辨率设置 setScreenMetrics(1240, 2772);
总结:setScreenMetrics 只能在相似屏幕比例下有效缩放坐标,在 iQOO Z10 Turbo+ 上失效是因为其宽高比与原始设计差异太大。推荐优先使用控件匹配方式来提升脚本通用性。