将此代码里插入控制器可以开始暂停即可
// 文档地址:https://docs.hamibot.com/
// var handlers = {
running: false,
start: function () {
if (this.running) return;
this.running = true;
toast("任务开始");
// 主循环(简化版)
while (true) {
try {
// 1. 检查最高优先级按钮
let found = false;
let buttons = ["就是这家", "确认无误"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔥 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 2. 检查高优先级按钮
buttons = ["确认信息并支付"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔺 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 3. 检查中优先级按钮
buttons = ["确定"];
for (let btn of buttons) {
let element = text(btn).findOne(20);
if (element) {
console.log("🟡 点击: " + btn);
element.click();
found = true;
sleep(100);
break;
}
}
if (found) continue;
// 4. 检查低优先级按钮
buttons = ["立即购买"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔵 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 5. 检查配送模式
let deliveryButtons = ["送到家", "到店取"];
for (let btn of deliveryButtons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔄 配送点击: " + btn);
element.click();
sleep(150); // 切换速度
break;
}
}
// 没有找到任何按钮
sleep(50);
} catch (e) {
console.log("⚠️ 小错误: " + e);
sleep(1000);
}
}
// 确保永不退出
setInterval(() => {}, 1000);
// 在这里添加你的任务代码
},
stop: function () {
if (!this.running) return;
this.running = false;
toast("任务暂停");
// 主循环(简化版)
while (true) {
try {
// 1. 检查最高优先级按钮
let found = false;
let buttons = ["就是这家", "确认无误"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔥 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 2. 检查高优先级按钮
buttons = ["确认信息并支付"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔺 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 3. 检查中优先级按钮
buttons = ["确定"];
for (let btn of buttons) {
let element = text(btn).findOne(20);
if (element) {
console.log("🟡 点击: " + btn);
element.click();
found = true;
sleep(100);
break;
}
}
if (found) continue;
// 4. 检查低优先级按钮
buttons = ["立即购买"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔵 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 5. 检查配送模式
let deliveryButtons = ["送到家", "到店取"];
for (let btn of deliveryButtons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔄 配送点击: " + btn);
element.click();
sleep(150); // 切换速度
break;
}
}
// 没有找到任何按钮
sleep(50);
} catch (e) {
console.log("⚠️ 小错误: " + e);
sleep(1000);
}
}
// 确保永不退出
setInterval(() => {}, 1000);
// 在这里添加你的任务代码
// 在这里添加停止任务的代码
}
};
// 创建悬浮窗
var floatyWin = floaty.window(
<vertical padding="16">
<button id="startBtn" text="开始" bg="#4CAF50"/>
<button id="pauseBtn" text="暂停" bg="#F44336"/>
</vertical>
);
// 开始按钮点击事件
floatyWin.startBtn.click(function () {
handlers.start();
});
// 暂停按钮点击事件
floatyWin.pauseBtn.click(function () {
handlers.stop();
});
// 保持悬浮窗不被关闭
setInterval(function () {}, 1000);
在此基础上完善并添加可以自主调整速率的控制按钮以及源码 调整范围在0-500
添加购买数量 可更改数量1还是2个的选项或1盒
更改控制台颜色 为灰色和黑色
让控制台可以随意更改位置 并且可以隐藏或显示
回答
要实现任务的开始与暂停控制,需要对代码进行以下优化:
核心修改说明
- 状态机控制:通过
handlers.running
变量控制循环状态 - 循环条件重构:将死循环改为带状态检测的可控循环
- 逻辑分离:start 方法仅启动任务,stop 方法仅控制状态
修改后的完整代码
// 文档地址:https://docs.hamibot.com/
var handlers = {
running: false,
start: function () {
if (this.running) return;
this.running = true;
toast("任务开始");
// 独立任务线程
threads.start(function() {
while (handlers.running) {
try {
// 1. 检查最高优先级按钮
let found = false;
let buttons = ["就是这家", "确认无误"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔥 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 2. 检查高优先级按钮
buttons = ["确认信息并支付"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔺 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 3. 检查中优先级按钮
buttons = ["确定"];
for (let btn of buttons) {
let element = text(btn).findOne(20);
if (element) {
console.log("🟡 点击: " + btn);
element.click();
found = true;
sleep(100);
break;
}
}
if (found) continue;
// 4. 检查低优先级按钮
buttons = ["立即购买"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔵 点击: " + btn);
element.click();
found = true;
sleep(500);
break;
}
}
if (found) continue;
// 5. 检查配送模式
let deliveryButtons = ["送到家", "到店取"];
for (let btn of deliveryButtons) {
let element = text(btn).findOne(50);
if (element) {
console.log("🔄 配送点击: " + btn);
element.click();
sleep(150); // 切换速度
break;
}
}
// 没有找到任何按钮
sleep(50);
} catch (e) {
console.log("⚠️ 小错误: " + e);
sleep(1000);
}
}
toast("任务已暂停");
});
},
stop: function () {
this.running = false;
toast("任务暂停");
}
};
// 创建悬浮窗
var floatyWin = floaty.window(
<vertical padding="16">
<button id="startBtn" text="开始" bg="#4CAF50"/>
<button id="pauseBtn" text="暂停" bg="#F44336"/>
</vertical>
);
// 开始按钮点击事件
floatyWin.startBtn.click(function () {
handlers.start();
});
// 暂停按钮点击事件
floatyWin.pauseBtn.click(function () {
handlers.stop();
});
// 保持悬浮窗不被关闭
setInterval(function () {}, 1000);
改进说明
- 线程隔离:将主循环放入独立线程,避免阻塞UI
- 精准控制:循环条件改为
while(handlers.running)
,确保状态变化立即生效 - 清晰反馈:添加开始/暂停时的提示toast
- 异常保护:保留原有错误处理机制
- 结构优化:移除重复代码,提升可维护性
使用方式
- 点击"开始"按钮启动任务
- 点击"暂停"按钮随时停止任务
- 再次点击"开始"可恢复任务执行
该方案实现了精准的任务控制,保证了代码的可读性和可维护性,同时保持了原有功能的完整性。
补充回答 1
以下是集成所有需求的完整解决方案:
// 文档地址:https://docs.hamibot.com/
var config = {
rate: 200, // 初始速率
quantity: 1, // 默认购买数量
running: false
};
// 创建主悬浮窗
var floatyWin = floaty.window(
<vertical padding="10" bg="#333333" gravity="center">
<horizontal gravity="center">
<button id="startBtn" text="开始" bg="#4CAF50" w="80" h="40"/>
<button id="pauseBtn" text="暂停" bg="#F44336" w="80" h="40"/>
</horizontal>
<text text="速率调节 (0-500ms)" textColor="#FFFFFF" textSize="14sp"/>
<seekbar id="rateBar" progress="20" max="50" w="200"/>
<text id="rateText" text="当前速率: 200ms" textColor="#FFFFFF" textSize="12sp"/>
<text text="购买数量" textColor="#FFFFFF" textSize="14sp"/>
<radiogroup id="quantityGroup">
<horizontal>
<radio id="radio1" text="1个" textColor="#FFFFFF"/>
<radio id="radio2" text="2个" textColor="#FFFFFF"/>
<radio id="radio3" text="1盒" textColor="#FFFFFF"/>
</horizontal>
</radiogroup>
<button id="posBtn" text="移动控制台" bg="#2196F3" w="120" h="30"/>
<button id="hideBtn" text="隐藏控制台" bg="#9E9E9E" w="120" h="30"/>
</vertical>
);
// 初始化配置
config.quantity = 1;
floatyWin.radio1.checked = true;
// 自定义控制台悬浮窗
var consoleWin = floaty.rawWindow(
<vertical w="250" h="300" bg="#1a1a1a">
<text id="consoleTitle" text="调试控制台" textColor="#CCCCCC" textSize="16sp" padding="8"/>
<com.stardust.autojs.core.console.ConsoleView id="consoleView" bg="#000000"/>
</vertical>
);
// 设置控制台可移动
floatyWin.setPosition(100, 100);
floatyWin.setOnTouchListener(function(view, event) {
if(event.action == android.view.MotionEvent.ACTION_MOVE) {
floatyWin.setPosition(event.rawX, event.rawY);
}
return true;
});
// 速率调节事件
floatyWin.rateBar.on("progressChanged", function(progress, fromUser) {
if(fromUser) {
config.rate = progress * 10;
floatyWin.rateText.setText("当前速率: " + config.rate + "ms");
}
});
// 数量选择事件
floatyWin.quantityGroup.on("check", function(id) {
switch(id) {
case floatyWin.radio1.id:
config.quantity = 1;
break;
case floatyWin.radio2.id:
config.quantity = 2;
break;
case floatyWin.radio3.id:
config.quantity = "1盒";
break;
}
});
// 控制台移动按钮
floatyWin.posBtn.click(function() {
var randomX = Math.floor(Math.random() * (device.width - 200));
var randomY = Math.floor(Math.random() * (device.height - 300));
consoleWin.setPosition(randomX, randomY);
});
// 控制台显示/隐藏切换
floatyWin.hideBtn.click(function() {
if(consoleWin.isShowing()) {
consoleWin.hide();
floatyWin.hideBtn.setText("显示控制台");
} else {
consoleWin.show();
floatyWin.hideBtn.setText("隐藏控制台");
}
});
// 任务控制处理器
var handlers = {
start: function () {
if (config.running) return;
config.running = true;
toast("任务开始");
threads.start(function() {
while (config.running) {
try {
// 1. 检查最高优先级按钮
let found = false;
let buttons = ["就是这家", "确认无误"];
for (let btn of buttons) {
let element = text(btn).findOne(50);
if (element) {
log("🔥 点击: " + btn + " (数量: " + config.quantity + ")");
element.click();
found = true;