为什么调用了click(x,y)之后会卡退

已存档
Fortune · 30 天前
第 1 条补充
·
30 天前

.bounds()获取到的定位 调用click去点击发现有偏移

回答

Hamibot AI
1
· 30 天前

脚本调用click(x, y)后卡退可能有以下原因及解决方法:

  1. 权限问题

    • 如果脚本依赖无障碍服务或后台弹窗权限,需确保已正确开启。部分设备需在「设置」-「应用管理」中手动开启权限。
    • 若使用了需要 Root 权限的函数(如 RootAutomator),但设备未 Root,可能导致异常退出。
  2. 坐标适配问题

    • 文档1提到,脚本会根据屏幕分辨率自动缩放坐标。若目标应用对点击位置敏感(如按钮极小或布局复杂),缩放后的坐标可能点击无效,导致脚本陷入死循环或异常退出。
    • 解决方法:通过「开发者选项」开启「显示触摸操作」,观察点击位置是否正确。
  3. 操作阻塞未处理

    • click(x, y) 是同步操作,会阻塞脚本直到点击完成(约150ms)。若点击后立即执行耗时操作(如网络请求),可能因超时或资源冲突导致卡退。
    • 解决方法:在关键操作后添加 sleep(100) 等延时,确保前一步骤完成。
  4. 系统兼容性问题

    • 安卓 7.0 以下设备可能不支持部分触摸模拟功能,直接调用 click() 可能触发系统异常。
    • 解决方法:检查设备系统版本,或尝试用 press(x, y, 100) 替代(模拟短按)。
  5. 脚本逻辑缺陷

    • 若点击后触发了应用的「退出」逻辑(如误点关闭按钮),需检查坐标是否误触非预期控件。
    • 解决方法:使用 console.log() 输出当前坐标,或通过 images.findImage() 验证目标位置。

验证步骤

// 示例:添加日志和延时排查
click(800, 200);
sleep(200); // 等待点击完成
console.log("点击后延时200ms");

若问题仍存在,建议提供具体设备型号和系统版本,以便进一步分析。


补充回答 1

当通过.bounds()获取控件坐标后调用click()出现偏移,可能由以下原因导致,以下是对应的解决方法:


1. 分辨率适配问题

  • 原因:脚本未正确设置屏幕分辨率,导致坐标计算与实际显示不一致。
  • 解决方法
    使用setScreenMetrics(width, height)设置脚本设计时的屏幕分辨率,确保坐标自动缩放。
    // 示例:设置分辨率为1080x1920(根据实际设备修改)
    setScreenMetrics(1080, 1920);
    var bounds = text("按钮").findOne().bounds();
    click(bounds.centerX(), bounds.centerY());
    

2. 状态栏/导航栏占用区域

  • 原因:系统状态栏或导航栏会占用屏幕部分区域,bounds()返回的坐标未扣除这些区域,导致点击位置偏移。
  • 解决方法
    手动计算并扣除状态栏高度(需Root权限或通过API获取):
    // 获取状态栏高度(需Root权限)
    var statusBarHeight = context.getResources().getDimensionPixelSize(
        context.getResources().getIdentifier("status_bar_height", "dimen", "android")
    );
    var bounds = text("按钮").findOne().bounds();
    // 调整坐标,扣除状态栏高度
    click(bounds.centerX(), bounds.centerY() - statusBarHeight);
    

3. 控件自身布局问题

  • 原因:控件的bounds()返回的区域可能与实际可点击区域不完全一致(如按钮边缘有透明区域)。
  • 解决方法
    通过boundsInParent()获取控件在父容器中的相对坐标,再结合父控件位置计算精确点击点。
    var widget = text("按钮").findOne();
    var parent = widget.parent();
    var parentBounds = parent.bounds();
    var relativeBounds = widget.boundsInParent();
    // 计算绝对坐标
    var x = parentBounds.left + relativeBounds.left + relativeBounds.width() / 2;
    var y = parentBounds.top + relativeBounds.top + relativeBounds.height() / 2;
    click(x, y);
    

4. 设备屏幕缩放或DPI差异

  • 原因:不同设备的DPI或屏幕缩放比例不同,导致坐标计算偏差。
  • 解决方法
    在脚本开头添加setScreenMetrics(),确保所有坐标基于统一分辨率计算。
    // 例如:适配1080x1920分辨率
    setScreenMetrics(1080, 1920);
    

5. 验证坐标准确性

  • 步骤
    使用canvas绘制控件边界,确认bounds()是否正确:
    // 创建浮窗并绘制控件边界
    var bounds = text("按钮").findOne().bounds();
    var window = floaty.rawWindow(<canvas id="canvas" />);
    window.setSize(-1, -1);
    var paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(6);
    paint.setColor(0xff00ff00); // 绿色边框
    window.canvas.on("draw", function (canvas) {
        canvas.drawRect(bounds.left, bounds.top, bounds.right, bounds.bottom, paint);
    });
    

注意事项

  • 如果设备未Root,click(x, y)可能因系统权限限制失效,可尝试改用press(x, y, 100)模拟短按。
  • 确保脚本已开启无障碍服务和后台弹窗权限(需在设备设置中手动开启)。

通过以上方法调整后,点击偏移问题通常可得到解决。若仍存在异常,建议提供设备型号和系统版本进一步排查。

ℹ️ 本回答由 AI 生成,内容仅供参考