var btn text("确定").findOne().bounds() 如何知道此组件的左上,左下,右上,右下的坐标 ;如何通过这个bounds()利用UI 画一个矩形

已存档
兔如花
9
· 2 个月前
第 1 条补充
·
2 个月前

var btn text("确定").findOne().bounds() 如何知道此组件的左上,左下,右上,右下的坐标 ;如何通过这个bounds()利用UI 画一个矩形,并在此区域写一个文字

第 2 条补充
·
2 个月前

canvas 在界面画多个矩形

回答

Hamibot AI
1
· 2 个月前

通过 bounds() 方法获取控件的范围后,会返回一个 Rect 对象,它包含了控件的四个坐标值:lefttoprightbottom。这些值可以用来计算控件的左上、左下、右上和右下角的坐标。

获取控件的四个角落坐标

// 文档地址 https://docs.hamibot.com/
var btn = text("确定").findOne();
var rect = btn.bounds();

// 左上角坐标
var topLeftX = rect.left;
var topLeftY = rect.top;

// 左下角坐标
var bottomLeftX = rect.left;
var bottomLeftY = rect.bottom;

// 右上角坐标
var topRightX = rect.right;
var topRightY = rect.top;

// 右下角坐标
var bottomRightX = rect.right;
var bottomRightY = rect.bottom;

log("左上角: (" + topLeftX + ", " + topLeftY + ")");
log("左下角: (" + bottomLeftX + ", " + bottomLeftY + ")");
log("右上角: (" + topRightX + ", " + topRightY + ")");
log("右下角: (" + bottomRightX + ", " + bottomRightY + ")");

利用 UI 绘制矩形

要利用 UI 画出这个控件的边界矩形,可以通过 floaty 创建浮窗,并使用 canvas 进行绘制:

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

var btn = text("确定").findOne();
var bounds = btn.bounds();

// 获取状态栏高度并调整浮窗位置
var statusBarHeight = context.getResources().getDimensionPixelSize(
    context.getResources().getIdentifier('status_bar_height', 'dimen', 'android')
);

// 创建全屏浮窗
var window = floaty.rawWindow(<canvas id="canvas"/>);
window.setSize(-1, -1);
window.setPosition(0, -statusBarHeight);
window.setTouchable(false);

setInterval(() => {}, 1000); // 避免脚本退出

// 创建画笔
var paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setColor(colors.parseColor("#FF0000")); // 红色描边

// 在 canvas 上绘制矩形
window.canvas.on("draw", function(canvas) {
    canvas.drawRect(
        bounds.left,
        bounds.top,
        bounds.right,
        bounds.bottom,
        paint
    );
});

上述代码会在屏幕上绘制一个红色矩形框,覆盖在指定控件(如“确定”按钮)的周围。该方法常用于调试目的,比如可视化某个控件的位置或边界是否正确。


补充回答 1

你可以通过 bounds() 获取控件的矩形范围,然后从中提取左上、左下、右上、右下四个角的坐标。接着使用 canvas 在该区域内绘制矩形并在其中写入文字。

获取控件的四个角落坐标

// 文档地址 https://docs.hamibot.com/
var btn = text("确定").findOne();
var rect = btn.bounds();

// 左上角
var topLeftX = rect.left;
var topLeftY = rect.top;

// 左下角
var bottomLeftX = rect.left;
var bottomLeftY = rect.bottom;

// 右上角
var topRightX = rect.right;
var topRightY = rect.top;

// 右下角
var bottomRightX = rect.right;
var bottomRightY = rect.bottom;

log("左上角: (" + topLeftX + ", " + topLeftY + ")");
log("左下角: (" + bottomLeftX + ", " + bottomLeftY + ")");
log("右上角: (" + topRightX + ", " + topRightY + ")");
log("右下角: (" + bottomRightX + ", " + bottomRightY + ")");

利用 UI 绘制矩形并添加文字

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

var btn = text("确定").findOne();
var bounds = btn.bounds();

// 获取状态栏高度
var statusBarHeight = context.getResources().getDimensionPixelSize(
    context.getResources().getIdentifier('status_bar_height', 'dimen', 'android')
);

// 创建浮窗并设置全屏大小
var window = floaty.rawWindow(<canvas id="canvas"/>);
window.setSize(-1, -1);
window.setPosition(0, -statusBarHeight);
window.setTouchable(false);

setInterval(() => {}, 1000); // 防止脚本退出

// 创建画笔用于绘制矩形
var paintRect = new Paint();
paintRect.setStyle(Paint.Style.STROKE); // 描边模式
paintRect.setStrokeWidth(6);
paintRect.setColor(colors.parseColor("#00ff00")); // 绿色描边

// 创建画笔用于绘制文字
var paintText = new Paint();
paintText.setTextSize(36); // 设置字体大小
paintText.setColor(colors.parseColor("#ff0000")); // 红色文字
paintText.setAntiAlias(true); // 抗锯齿

window.canvas.on("draw", function(canvas) {
    // 绘制矩形框
    canvas.drawRect(
        bounds.left,
        bounds.top,
        bounds.right,
        bounds.bottom,
        paintRect
    );

    // 在矩形中央写入文字
    var text = "提示";
    var textWidth = paintText.measureText(text); // 文字宽度
    var textHeight = paintText.descent() - paintText.ascent(); // 文字高度

    // 计算文字居中位置
    var centerX = bounds.centerX();
    var centerY = bounds.centerY();

    canvas.drawText(text, centerX - textWidth / 2, centerY + textHeight / 2, paintText);
});

功能说明:

  • bounds() 返回控件所在的矩形区域。
  • 使用 canvas.drawRect() 绘制绿色矩形框在控件周围。
  • 使用 canvas.drawText() 在矩形中心绘制红色文字“提示”。
  • 浮窗覆盖整个屏幕,并自动适配状态栏偏移。

这段代码适用于调试界面元素,例如在自动化脚本开发时高亮某个按钮或文本框。


补充回答 2

你可以在 canvas 上绘制多个矩形,只需在 draw 事件中多次调用 canvas.drawRect() 方法,并传入不同的矩形边界和画笔即可。

示例:绘制多个矩形

// 文档地址 https://docs.hamibot.com/
auto.waitFor();

// 创建全屏浮窗
var window = floaty.rawWindow(<canvas id="canvas"/>);
window.setSize(-1, -1);
window.setTouchable(false);

setInterval(() => {}, 1000); // 防止脚本退出

// 创建画笔
var paint1 = new Paint();
paint1.setStyle(Paint.Style.STROKE);
paint1.setStrokeWidth(5);
paint1.setColor(colors.parseColor("#FF0000")); // 红色边框

var paint2 = new Paint();
paint2.setStyle(Paint.Style.FILL);
paint2.setColor(colors.parseColor("#88FF0000")); // 半透明红色填充

var paint3 = new Paint();
paint3.setStyle(Paint.Style.STROKE);
paint3.setStrokeWidth(8);
paint3.setColor(colors.parseColor("#00FF00")); // 绿色边框

// 在 canvas 上绘制多个矩形
window.canvas.on("draw", function(canvas) {
    // 矩形1:红色边框
    canvas.drawRect(100, 100, 300, 300, paint1);

    // 矩形2:半透明红色填充
    canvas.drawRect(400, 100, 600, 300, paint2);

    // 矩形3:绿色边框
    canvas.drawRect(700, 100, 900, 300, paint3);
});

效果说明:

  • 绘制了三个不同样式的矩形:
    • 第一个:红色描边矩形(空心)
    • 第二个:半透明红色填充矩形(实心)
    • 第三个:绿色粗线描边矩形

你可以根据需要修改矩形的坐标、大小、颜色和样式。该方法适用于高亮多个控件区域、调试布局或制作简单的 UI 指示器。

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