 | |  |  |
苹果脚本矩形类rect小实例
- /*
- 🍎 AIWROK软件苹果iOS开发文档
- 🔨 矩形类 [RectClass] 全新系统化示例
- // 🍎交流QQ群:711841924(群)
- // 🍎交流QQ群:528816639 (苹果内测群)
- 🎯 适用:AIWROK 苹果iOS 自动化脚本
- */
- printl("=== 🍎 RectClass矩形类全新系统化示例启动 ===");
- sleep.millisecond(1000);
- // ============================================
- // 📚 第一部分:RectClass 基础概念与获取方式
- // ============================================
- printl("\n📖 第一部分:RectClass 基础概念");
- sleep.millisecond(800);
- // 🔹 场景 1: 从 OCR 检测结果获取 Rect
- printl("\n【场景 1】通过 OCR 识别获取文本区域矩形");
- sleep.millisecond(800);
- var demoRect = null;
- var hasDemoRect = false;
- try {
- // 执行全屏 OCR 识别(使用百分比坐标 0-1)
- var ocrResult = screen.ocr(0, 0, 1, 1);
- printl("✓ OCR 识别完成");
-
- // 获取所有检测到的目标
- var detects = ocrResult.getAllDetect();
- printl("✓ 检测到 " + detects.length + " 个目标");
-
- if (detects.length > 0) {
- // 从第一个检测目标获取矩形对象
- var rectFromOCR = detects[0].getRect();
- printl("✓ 成功获取矩形对象:" + rectFromOCR.toString());
- sleep.millisecond(500);
-
- // 🔥 可视化演示:点击矩形中心点,让红色框显示出来
- printl("\n🔥 可视化演示:点击目标区域,屏幕会显示红色框");
- sleep.millisecond(800);
- printl(" 矩形位置:" + rectFromOCR.toString());
- sleep.millisecond(500);
-
- // 获取中心点坐标
- var cx = rectFromOCR.getCenterX();
- var cy = rectFromOCR.getCenterY();
- printl(" 中心点坐标:(" + cx.toFixed(4) + ", " + cy.toFixed(4) + ")");
- sleep.millisecond(500);
- printl(" 🎯 准备点击目标...");
- sleep.millisecond(500);
-
- // 使用 Detect 对象的点击方法(会自动显示红色框)
- detects[0].click();
- printl(" ✓ 已点击目标,应该看到红色矩形框了!");
- sleep.millisecond(1500); // 等待红色框显示
-
- // 保存为后续示例使用
- demoRect = rectFromOCR;
- hasDemoRect = true;
- } else {
- printl("⚠️ 未检测到目标,将使用模拟数据演示");
- hasDemoRect = false;
- }
- } catch (e) {
- printl("⚠️ OCR 识别失败:" + e.message);
- hasDemoRect = false;
- }
- sleep.millisecond(800);
- // 检查 demoRect 是否可用
- if (!hasDemoRect || !demoRect) {
- printl("\n❌ 由于无法获取 Rect 对象,后续演示无法进行");
- printl("💡 提示:请确保屏幕上有可识别的文本内容");
- printl("\n=== 🍎 RectClass矩形类系统化示例提前结束 ===");
- } else {
- // 🔹 场景 2: 说明手动创建 Rect 对象(仅理论演示)
- printl("\n【场景 2】关于创建矩形对象的说明");
- sleep.millisecond(800);
- // ============================================
- // 📊 第二部分:矩形边界信息获取方法
- // ============================================
- printl("\n📊 第二部分:矩形边界信息获取");
- sleep.millisecond(800);
- // 📌 方法 1: getLeft() - 获取左边界
- printl("\n【方法 1】getLeft() - 获取左边界 X 坐标");
- sleep.millisecond(500);
- var left = demoRect.getLeft();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 功能说明:返回矩形左边界的 X 坐标值");
- printl(" └─ 示例结果:左边界 = " + left);
- sleep.millisecond(300);
- // 📌 方法 2: getRight() - 获取右边界
- printl("\n【方法 2】getRight() - 获取右边界 X 坐标");
- sleep.millisecond(500);
- var right = demoRect.getRight();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 功能说明:返回矩形右边界的 X 坐标值");
- printl(" └─ 示例结果:右边界 = " + right);
- sleep.millisecond(300);
- // 📌 方法 3: getTop() - 获取上边界
- printl("\n【方法 3】getTop() - 获取上边界 Y 坐标");
- sleep.millisecond(500);
- var top = demoRect.getTop();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 功能说明:返回矩形上边界的 Y 坐标值");
- printl(" └─ 示例结果:上边界 = " + top);
- sleep.millisecond(300);
- // 📌 方法 4: getBottom() - 获取下边界
- printl("\n【方法 4】getBottom() - 获取下边界 Y 坐标");
- sleep.millisecond(500);
- var bottom = demoRect.getBottom();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 功能说明:返回矩形下边界的 Y 坐标值");
- printl(" └─ 示例结果:下边界 = " + bottom);
- sleep.millisecond(300);
- // ============================================
- // 📐 第三部分:矩形尺寸与中心点计算
- // ============================================
- printl("\n📐 第三部分:矩形尺寸与中心点");
- sleep.millisecond(800);
- // 📌 方法 5: getWidth() - 获取宽度
- printl("\n【方法 5】getWidth() - 获取矩形宽度");
- sleep.millisecond(500);
- var width = demoRect.getWidth();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 计算公式:width = right - left");
- printl(" └─ 示例结果:宽度 = " + width);
- sleep.millisecond(300);
- // 📌 方法 6: getHeight() - 获取高度
- printl("\n【方法 6】getHeight() - 获取矩形高度");
- sleep.millisecond(500);
- var height = demoRect.getHeight();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 计算公式:height = bottom - top");
- printl(" └─ 示例结果:高度 = " + height);
- sleep.millisecond(300);
- // 📌 方法 7: getCenterX() - 获取中心 X 坐标
- printl("\n【方法 7】getCenterX() - 获取水平中心点");
- sleep.millisecond(500);
- var centerX = demoRect.getCenterX();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 计算公式:centerX = (left + right) / 2");
- printl(" └─ 示例结果:中心 X = " + centerX);
- sleep.millisecond(300);
- // 📌 方法 8: getCenterY() - 获取中心 Y 坐标
- printl("\n【方法 9】getCenterY() - 获取垂直中心点");
- sleep.millisecond(500);
- var centerY = demoRect.getCenterY();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 计算公式:centerY = (top + bottom) / 2");
- printl(" └─ 示例结果:中心 Y = " + centerY);
- sleep.millisecond(300);
- // 💡 实用技巧:获取矩形中心点坐标(常用于点击操作)
- printl("\n💡 实用技巧:点击矩形中心位置");
- sleep.millisecond(500);
- printl(" // 获取中心点坐标");
- printl(" var cx = rect.getCenterX();");
- printl(" var cy = rect.getCenterY();");
- printl(" // 执行点击(需要结合点击类)");
- printl(" // click.click(cx, cy);");
- printl(" 当前矩形中心点:(" + centerX + ", " + centerY + ")");
- // ============================================
- // 🎯 第四部分:矩形内随机点生成与交互
- // ============================================
- printl("\n🎯 第四部分:矩形内随机点生成");
- sleep.millisecond(800);
- // 📌 方法 12: getRandX() - 生成随机 X 坐标
- printl("\n【方法 12】getRandX() - 生成矩形内随机 X 坐标");
- sleep.millisecond(500);
- var randomX = demoRect.getRandX();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 取值范围:[left, right] 之间的随机值");
- printl(" └─ 示例结果:随机 X = " + randomX);
- sleep.millisecond(300);
- // 📌 方法 13: getRandY() - 生成随机 Y 坐标
- printl("\n【方法 13】getRandY() - 生成矩形内随机 Y 坐标");
- sleep.millisecond(500);
- var randomY = demoRect.getRandY();
- printl(" ├─ 返回值类型:Double");
- printl(" ├─ 取值范围:[top, bottom] 之间的随机值");
- printl(" └─ 示例结果:随机 Y = " + randomY);
- sleep.millisecond(300);
- // 💡 实用场景:模拟自然随机点击(避免机械化操作)
- printl("\n💡 实用场景:在矩形区域内随机点击");
- sleep.millisecond(500);
- printl(" // 生成多次随机点击坐标,模拟真实用户行为");
- for (var i = 1; i <= 3; i++) {
- var rx = demoRect.getRandX();
- var ry = demoRect.getRandY();
- printl(" 第 " + i + " 次随机点击坐标:(" + rx.toFixed(2) + ", " + ry.toFixed(2) + ")");
- }
- // ============================================
- // ✅ 第五部分:点位检测与边界设置
- // ============================================
- printl("\n✅ 第五部分:点位检测与边界设置");
- sleep.millisecond(800);
- // 📌 方法 9: inRect() - 判断点是否在矩形内
- printl("\n【方法 9】inRect(x, y) - 判断坐标点是否在矩形内部");
- sleep.millisecond(500);
- printl(" ├─ 参数类型:Double x, Double y");
- printl(" ├─ 返回值类型:Boolean");
- printl(" ├─ 功能说明:检查给定点是否在矩形内部(包含边界)");
- printl(" └─ 注意事项:部分版本可能不支持此方法,可手动实现");
- // 💡 手动实现点位检测(兼容性更好的方式)
- printl("\n💡 兼容方案:手动实现点位检测逻辑");
- function isPointInRect(rect, x, y) {
- var left = rect.getLeft();
- var right = rect.getRight();
- var top = rect.getTop();
- var bottom = rect.getBottom();
-
- // 判断条件:left <= x <= right 且 top <= y <= bottom
- return (x >= left && x <= right && y >= top && y <= bottom);
- }
- var testPoint1 = {x: centerX, y: centerY}; // 中心点(应该在内部)
- var testPoint2 = {x: left - 50, y: top - 50}; // 左上角外部点(应该在外部)
- var isInside1 = isPointInRect(demoRect, testPoint1.x, testPoint1.y);
- var isInside2 = isPointInRect(demoRect, testPoint2.x, testPoint2.y);
- printl(" ├─ 测试点 1 (中心点): (" + testPoint1.x.toFixed(4) + ", " + testPoint1.y.toFixed(4) + ")");
- printl(" │ └─ 检测结果:" + (isInside1 ? "✓ 在矩形内" : "✗ 不在矩形内"));
- printl(" ├─ 测试点 2 (外部点): (" + testPoint2.x.toFixed(4) + ", " + testPoint2.y.toFixed(4) + ")");
- printl(" │ └─ 检测结果:" + (isInside2 ? "✓ 在矩形内" : "✗ 不在矩形内"));
- // 如果系统支持 inRect 方法,也可以使用(尝试调用)
- try {
- if (typeof demoRect.inRect === 'function') {
- var nativeResult = demoRect.inRect(centerX, centerY);
- printl(" ✓ 系统原生 inRect 方法可用,结果:" + nativeResult);
- } else {
- printl(" ⚠️ 系统原生 inRect 方法不可用,请使用上面的兼容方案");
- }
- } catch (e) {
- printl(" ⚠️ 调用 inRect 方法失败:" + e.message);
- }
- // 📌 方法 10: set() - 设置矩形边界
- printl("\n【方法 10】set(left, top, right, bottom) - 设置矩形边界");
- printl(" ├─ 参数类型:Single left, Single top, Single right, Single bottom");
- printl(" ├─ 返回值类型:Void(无返回值)");
- printl(" └─ 功能说明:重新定义矩形的四个边界值");
- printl(" ⚠️ 注意:此方法需要可编辑的 Rect 对象,OCR 获取的 Rect 通常为只读");
- // ============================================
- // 🔄 第六部分:坐标系统转换(百分比↔真实坐标)
- // ============================================
- printl("\n🔄 第六部分:百分比与真实坐标转换");
- sleep.millisecond(800);
- // 📌 方法 14: percentToReal() - 百分比转真实坐标
- printl("\n【方法 14】percentToReal() - 百分比区域转换为真实屏幕坐标");
- sleep.millisecond(500);
- printl(" ├─ 返回值类型:RectClass");
- printl(" ├─ 应用场景:将 0-1 范围的百分比坐标转换为实际像素坐标");
- printl(" └─ 示例:");
- // 说明:percentToReal 通常需要在特定上下文中使用
- printl(" 💡 使用场景说明:");
- printl(" 当您通过 OCR 获取到百分比坐标的 Rect 后,");
- printl(" 可以调用 rect.percentToReal() 转换为真实像素坐标");
- printl(" 例如:detect.getRect().percentToReal()");
- try {
- if (hasDemoRect && typeof demoRect.percentToReal === 'function') {
- var realRect = demoRect.percentToReal();
- printl(" ✓ 当前 Rect 转换结果:" + realRect.toString());
- } else {
- printl(" ⚠️ 当前环境暂不演示此方法");
- }
- } catch (e) {
- printl(" ⚠️ 转换失败:" + e.message);
- }
- // 📌 方法 15: toPercent() - 真实坐标转百分比
- printl("\n【方法 15】toPercent() - 真实屏幕坐标转换为百分比");
- sleep.millisecond(500);
- printl(" ├─ 返回值类型:RectClass");
- printl(" ├─ 应用场景:将实际像素坐标转换为 0-1 范围的百分比坐标");
- printl(" └─ 示例:");
- if (hasDemoRect) {
- try {
- if (typeof demoRect.toPercent === 'function') {
- var backToPercent = demoRect.toPercent();
- printl(" 原始矩形:" + demoRect.toString());
- printl(" 转换后百分比矩形:" + backToPercent.toString());
- printl(" ✓ 转换成功");
- } else {
- printl(" ⚠️ 当前 Rect 对象不支持 toPercent 方法");
- }
- } catch (e) {
- printl(" ⚠️ 转换失败:" + e.message);
- }
- } else {
- printl(" ⚠️ 无可用的 Rect 对象进行演示");
- }
- // ============================================
- // 🎨 第七部分:字符串表示与调试
- // ============================================
- printl("\n🎨 第七部分:矩形字符串表示与调试输出");
- sleep.millisecond(800);
- // 📌 方法 11: toString() - 获取矩形字符串表示
- printl("\n【方法 11】toString() - 返回矩形的字符串描述");
- sleep.millisecond(500);
- var rectString = demoRect.toString();
- printl(" ├─ 返回值类型:String");
- printl(" ├─ 格式说明:通常格式为 'Rect(left, top, right, bottom)'");
- printl(" └─ 示例结果:" + rectString);
- // 💡 调试技巧:快速打印矩形信息
- printl("\n💡 调试技巧:使用 printl 快速输出矩形信息");
- sleep.millisecond(500);
- printl(" printl('当前矩形:' + rect.toString());");
- printl(" 输出:" + demoRect.toString());
- // ============================================
- // 🎬 第八部分:综合实战案例
- // ============================================
- printl("\n🎬 第八部分:综合实战案例");
- sleep.millisecond(800);
- // 案例 1: UI 按钮区域检测与点击
- printl("\n【案例 1】UI 按钮区域检测与智能点击");
- sleep.millisecond(500);
- printl(" 场景:检测屏幕上的'提交'按钮并点击");
- printl(" 步骤:");
- printl(" 1. OCR 识别屏幕文本");
- printl(" 2. 查找包含'提交'的 Detect 对象");
- printl(" 3. 获取按钮的 Rect 区域");
- printl(" 4. 在按钮区域内随机点击(模拟真实用户)");
- printl(" 代码框架:");
- printl(" var ocrResult = screen.ocr(0, 0, 1, 1);");
- printl(" var detects = ocrResult.getAllDetect();");
- printl(" for (var i = 0; i < detects.length; i++) {");
- printl(" if (detects[i].text.contains('提交')) {");
- printl(" var btnRect = detects[i].getRect();");
- printl(" var clickX = btnRect.getRandX();");
- printl(" var clickY = btnRect.getRandY();");
- printl(" // click.click(clickX, clickY);");
- printl(" printl('点击提交按钮:' + clickX + ', ' + clickY);");
- printl(" break;");
- printl(" }");
- printl(" }");
- // 案例 2: 滑动操作区域规划
- printl("\n【案例 2】滑动操作区域规划");
- sleep.millisecond(500);
- printl(" 场景:在指定矩形区域内执行滑动手势");
- printl(" 步骤:");
- printl(" 1. 通过 OCR 获取起始区域和结束区域的 Rect");
- printl(" 2. 或者使用百分比坐标定义区域");
- printl(" 3. 在起始区域内取随机点作为起点");
- printl(" 4. 在结束区域内取随机点作为终点");
- printl(" 5. 执行滑动操作");
- printl(" 代码框架(使用百分比坐标转换):");
- printl(" // 方法 1: 通过 OCR 获取区域");
- printl(" var ocrResult = screen.ocr(0.2, 0.4, 0.8, 0.5);");
- printl(" var detects = ocrResult.getAllDetect();");
- printl(" if (detects.length > 0) {");
- printl(" var startArea = detects[0].getRect();");
- printl(" var startX = startArea.getRandX();");
- printl(" var startY = startArea.getRandY();");
- printl(" }");
- printl(" ");
- printl(" // 方法 2: 手动定义百分比区域并转换");
- printl(" // 注意:需要系统支持 Rect 创建或转换");
- printl(" printl('实际使用时建议通过 OCR 获取具体区域');");
- // 案例 3: 屏幕分区管理
- printl("\n【案例 3】屏幕分区管理");
- sleep.millisecond(500);
- printl(" 场景:将屏幕划分为多个功能区域分别处理");
- printl(" 说明:由于当前环境不支持 new RectClass(),建议使用以下方案:");
- printl(" ");
- printl(" 方案 1: 使用百分比坐标直接定义区域");
- printl(" var topArea = {left: 0, top: 0, right: 1, bottom: 0.33};");
- printl(" var middleArea = {left: 0, top: 0.33, right: 1, bottom: 0.67};");
- printl(" var bottomArea = {left: 0, top: 0.67, right: 1, bottom: 1};");
- printl(" ");
- printl(" 方案 2: 通过 OCR 分区域识别获取 Rect");
- printl(" var topOCR = screen.ocr(0, 0, 1, 0.33);");
- printl(" var topDetects = topOCR.getAllDetect();");
- printl(" if (topDetects.length > 0) {");
- printl(" var topRect = topDetects[0].getRect();");
- printl(" // 使用 topRect 进行操作");
- printl(" }");
- printl(" ");
- printl(" 💡 提示:在实际项目中,推荐使用百分比坐标进行区域划分,");
- printl(" 然后在每个区域内进行 OCR 识别获取具体的 Rect 对象。");
- // ============================================
- // ⚠️ 第九部分:注意事项与最佳实践
- // ============================================
- printl("\n⚠️ 第九部分:注意事项与最佳实践");
- sleep.millisecond(800);
- printl("\n【注意事项】");
- sleep.millisecond(500);
- printl(" 1. 坐标系统:");
- printl(" • 百分比坐标:0-1 范围,跨设备兼容性好");
- printl(" • 真实坐标:像素值,精确控制");
- printl(" • 使用 percentToReal() 和 toPercent() 灵活转换");
- printl(" ");
- printl(" 2. Rect 对象来源:");
- printl(" • 主要通过 Detect.getRect() 获取(OCR 识别结果)");
- printl(" • 也可手动 new RectClass() 创建");
- printl(" • 还可通过 set() 方法修改现有 Rect");
- printl(" ");
- printl(" 3. 随机点使用:");
- printl(" • getRandX() 和 getRandY() 生成的点在 [left, right] 和 [top, bottom] 范围内");
- printl(" • 多次调用会得到不同的随机值");
- printl(" • 适合模拟真实用户行为,避免被检测");
- printl(" ");
- printl(" 4. 边界检测:");
- printl(" • inRect() 方法在某些版本中可能不可用");
- printl(" • 推荐使用手动实现方案(如示例所示)");
- printl(" • 判断逻辑:x >= left && x <= right && y >= top && y <= bottom");
- printl("\n【最佳实践】");
- sleep.millisecond(500);
- printl(" 1. 优先使用百分比坐标,提高脚本兼容性");
- printl(" 2. 点击操作使用随机点,增加真实性");
- printl(" 3. 及时释放不用的 Rect 对象(如果支持 dispose)");
- printl(" 4. 复杂操作前先 toString() 输出调试");
- printl(" 5. 组合使用多个方法,实现智能化操作");
- // ============================================
- // 🏁 示例执行完毕
- // ============================================
- printl("\n=== 🍎 RectClass矩形类系统化示例执行完毕 ===");
- sleep.millisecond(500);
- printl("✓ 已演示 15 个核心方法");
- sleep.millisecond(300);
- printl("✓ 已展示 3 个实战案例");
- sleep.millisecond(300);
- printl("✓ 已说明注意事项与最佳实践");
- sleep.millisecond(500);
- printl("\n💡 提示:在实际脚本中使用时,请根据具体场景选择合适的方法组合!");
- } // end of else block for demoRect check
复制代码
| |  | |  |
|