自动发帖软件
标题:
苹果脚本矩形类rect小实例
[打印本页]
作者:
发帖软件
时间:
7 小时前
标题:
苹果脚本矩形类rect小实例
苹果脚本矩形类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
复制代码
欢迎光临 自动发帖软件 (http://www.fatiegongju.com/)
Powered by Discuz! X3.2