下载地址(文章指定相关附件):https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:7858
提供四种点击模式:单点、长按、滑动和随机区域点击
支持自定义点击间隔、点击次数、点击位置等参数
包含坐标录制功能,可直观获取屏幕点击位置
实时状态显示,清晰展示运行进度
线程安全设计,可随时停止运行
支持百分比坐标和绝对坐标两种输入方式
界面布局清晰,操作简单直观
完整的错误处理和参数验证机制
"ui";
ui.layout(
<horizontal gravity="center">
<text text="点击模式:" textSize="16" marginRight="8"/>
<spinner id="mode" entries="单点|长按|滑动|随机区域" marginRight="16"/>
<text text="间隔(ms):" textSize="16" marginRight="8"/>
<input id="interval" inputType="number" text="500" marginRight="16"/>
</horizontal>
<horizontal gravity="center" marginTop="16">
<text text="点击次数:" textSize="16" marginRight="8"/>
<input id="count" inputType="number" text="100" marginRight="16"/>
<text text="点击位置:" textSize="16" marginRight="8"/>
<input id="position" text="50%,50%" hint="格式:x,y 或 x%,y%"/>
</horizontal>
<horizontal gravity="center" marginTop="16">
<text text="长按时长(ms):" textSize="16" marginRight="8"/>
<input id="pressDuration" inputType="number" text="300" marginRight="16"/>
<text text="滑动距离:" textSize="16" marginRight="8"/>
<input id="swipeDistance" inputType="number" text="100" marginRight="16"/>
</horizontal>
<horizontal gravity="center" marginTop="16">
<text text="随机范围:" textSize="16" marginRight="8"/>
<input id="randomRange" inputType="number" text="50" marginRight="16"/>
<text text="点击延迟(ms):" textSize="16" marginRight="8"/>
<input id="delay" inputType="number" text="0"/>
</horizontal>
<button id="start" text="开始执行" textColor="#FFFFFF" bg="#4CAF50" marginTop="24"/>
<button id="stop" text="停止执行" textColor="#FFFFFF" bg="#F44336" marginTop="8"/>
<button id="record" text="录制坐标" textColor="#FFFFFF" bg="#2196F3" marginTop="8"/>
<text id="status" text="状态: 等待开始" textSize="14" textColor="#9E9E9E" marginTop="16"/>
</vertical>
);
let running = false;
let clickThread = null;
// 解析坐标输入
function parsePosition(input) {
if (input.includes("%")) {
let [x, y] = input.split(",");
x = parseInt(x) / 100 device.width;
y = parseInt(y) / 100 device.height;
return [x, y];
} else {
return input.split(",").map(Number);
}
}
// 单点点击
function singleClick(x, y) {
press(x, y, 50);
}
// 长按点击
function longPress(x, y, duration) {
press(x, y, duration);
}
// 滑动操作
function swipeAction(x, y, distance) {
swipe(x, y, x + distance, y + distance, 500);
}
// 随机区域点击
function randomClick(x, y, range) {
const randX = x + (Math.random() range 2 - range);
const randY = y + (Math.random() range 2 - range);
press(randX, randY, 50);
}
// 主点击循环
function clickLoop() {
const mode = ui.mode.getSelectedItem();
const interval = parseInt(ui.interval.text());
const count = parseInt(ui.count.text());
const [x, y] = parsePosition(ui.position.text());
const pressDuration = parseInt(ui.pressDuration.text());
const swipeDistance = parseInt(ui.swipeDistance.text());
const randomRange = parseInt(ui.randomRange.text());
const delay = parseInt(ui.delay.text());
sleep(delay);
for (let i = 0; i < count && running; i++) {
switch (mode) {
case "单点":
singleClick(x, y);
break;
case "长按":
longPress(x, y, pressDuration);
break;
case "滑动":
swipeAction(x, y, swipeDistance);
break;
case "随机区域":
randomClick(x, y, randomRange);
break;
}
ui.status.setText("状态: 运行中 (" + (i + 1) + "/" + count + ")");
if (i < count - 1) sleep(interval);
}
running = false;
ui.status.setText("状态: 已完成");
}
// 开始按钮事件
ui.start.click(() => {
if (running) return;
running = true;
ui.status.setText("状态: 启动中...");
clickThread = threads.start(clickLoop);
});
// 停止按钮事件
ui.stop.click(() => {
running = false;
if (clickThread) clickThread.interrupt();
ui.status.setText("状态: 已停止");
});
// 录制坐标按钮事件
ui.record.click(() => {
toast("请在3秒内点击屏幕录制坐标");
threads.start(function() {
const pos = captureScreen().then(function(img) {
const point = images.findColor(img, "#FF0000", {
region: [0, 0, device.width, device.height],
threshold: 10
});
if (point) {
const xPercent = Math.round(point.x / device.width 100);
const yPercent = Math.round(point.y / device.height 100);
ui.position.setText(xPercent + "%," + yPercent + "%");
toast("坐标已记录: " + xPercent + "%," + yPercent + "%");
} else {
toast("未检测到点击位置");
}
});
});
});
// 初始化状态
ui.status.setText("状态: 准备就绪");