hamibot的图色检索怎么做?有例子吗?例如固定某个区域进行图色检索点击。全屏图色检索点击。
如何判断页面的元素是否需要向上滚屏才能看到?代码怎么写?
配置模式中的text输入框,输入数字的话,如何将文本转为数值?
回答
文档地址 https://docs.hamibot.com/
Hamibot 的图色检索主要通过 images.findColor、images.findMultiColors 和 captureScreen() 等函数实现,结合 click() 可以完成点击操作。以下是具体的使用方法和示例。
1. 固定区域图色检索并点击
在指定区域内查找某个颜色,找到后点击其坐标。
// 启用无障碍服务
auto.waitFor();
// 请求截图权限
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
// 截取当前屏幕
var img = captureScreen();
// 定义目标颜色(例如红色 #ff0000)
var targetColor = '#ff0000';
// 指定查找区域:[x, y, width, height],例如在 (500, 800) 范围内宽 200 高 300 的区域
var region = [500, 800, 200, 300];
// 执行区域找色
var point = images.findColor(img, targetColor, {
region: region,
threshold: 4 // 颜色相似度阈值,越小越严格
});
if (point) {
toastLog('找到颜色,坐标:' + point.x + ', ' + point.y);
click(point.x, point.y);
} else {
toastLog('在指定区域未找到该颜色');
}
2. 全屏图色检索并点击
在整个屏幕上查找某一颜色,并点击。
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
var img = captureScreen();
var targetColor = '#0000ff'; // 查找蓝色
// 全屏找色(不指定 region 即为全屏)
var point = images.findColor(img, targetColor, {
threshold: 4
});
if (point) {
toastLog('全屏找到颜色,坐标:' + point.x + ', ' + point.y);
click(point.x, point.y);
} else {
toastLog('全屏未找到该颜色');
}
3. 多点找色(更精确识别)
当单点颜色容易误判时,可以使用多点找色,确保目标位置周围的颜色也匹配。
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
var img = captureScreen();
// 第一个点颜色
var mainColor = '#f64d30';
// 相对于第一个点的其他颜色点 [偏移x, 偏移y, 颜色]
var extraColors = [
[5, 5, '#ffffff'],
[10, 10, '#000000']
];
var point = images.findMultiColors(img, mainColor, extraColors, {
region: [0, 0, 1080, 1920] // 可选:限制搜索区域
});
if (point) {
toastLog('多点找色成功,坐标:' + point.x + ', ' + point.y);
click(point.x, point.y);
} else {
toastLog('未找到匹配的多点颜色');
}
注意事项:
- 必须调用
requestScreenCapture()并获得授权才能截图。 threshold默认为 4,数值越大容错越高,但可能误识别。- 推荐使用
findMultiColors提高识别准确率,避免因界面微小变化导致失败。
你可以根据实际场景调整颜色值、区域和阈值。
补充回答 1
文档地址 https://docs.hamibot.com/
要判断一个页面元素是否需要向上滚屏才能看到,可以通过检查该控件在当前屏幕中的可见性(visibleToUser())以及其位置信息来间接判断。如果控件存在但不可见,通常说明它在屏幕之外,可能需要滚动才能出现。
你可以结合 visibleToUser() 和布局边界信息来判断是否需要向上滑动。
以下是一个判断某个元素是否可见,并在不可见时向上滑动的示例代码:
// 示例:判断一个文本为"目标内容"的控件是否可见,若不可见则尝试向上滑动
var targetText = "目标内容";
var target = text(targetText).findOne(2000); // 查找控件,最多等待2秒
if (!target) {
log("未找到目标控件");
} else if (target.visibleToUser()) {
log("目标控件已在屏幕上可见");
} else {
log("目标控件存在但不可见,可能需要滑动");
// 尝试找到可滑动的父容器,例如 AbsListView 或 RecyclerView
var scrollView = target.parent();
while (scrollView && !scrollView.scrollable()) {
scrollView = scrollView.parent();
}
if (scrollView && scrollView.scrollable()) {
log("找到可滑动容器,执行向上滑动(scrollBackward)");
scrollView.scrollBackward(); // 向上/向左滑动
} else {
log("未找到可滑动的容器");
}
}
说明:
visibleToUser():判断控件是否在屏幕可视范围内。scrollBackward():用于向上或向左滑动列表。parent():向上查找父控件,直到找到具备scrollable属性的容器。- 实际使用中建议加上延时或循环检测,确保滚动后能重新定位目标。
你也可以通过控件的 bounds() 方法获取其坐标,再与屏幕高度对比,进一步判断它是位于屏幕上方还是下方。例如:
var bounds = target.bounds();
var screenHeight = device.height;
if (bounds.bottom < 0) {
log("控件在屏幕上方,需要向下滚动");
} else if (bounds.top > screenHeight) {
log("控件在屏幕下方,需要向上滚动");
}
结合这些方法,可以准确判断并处理需要滚屏的情况。
补充回答 2
在 Hamibot 的配置模式中,text 输入框获取到的内容是字符串类型。如果你需要将其转换为数值,可以使用 JavaScript 的 parseInt() 或 parseFloat() 函数,具体取决于你需要的是整数还是小数。
- 使用
parseInt(str)将字符串转为整数。 - 使用
parseFloat(str)将字符串转为浮点数(支持小数)。
例如,在脚本中你可以这样处理:
// 文档地址 https://docs.hamibot.com/
ui.layout(
<vertical>
<input id="numInput" text="123" />
<button id="btn">转换为数字</button>
</vertical>
);
ui.btn.click(() => {
let str = ui.numInput.text();
let num = parseInt(str); // 转换为整数
// 或者使用:let num = parseFloat(str); // 转换为浮点数
if (isNaN(num)) {
toast("输入的内容不是有效数字");
} else {
toast("转换后的数字是: " + num);
console.log("数值类型:", typeof num); // 输出 number
}
});
此方法兼容 Rhino 1.7.15 环境,不使用箭头函数或现代语法,默认参数等特性。你只需确保输入的字符串内容合法即可完成转换。