文章附件下载:https://www.pan38.com/dow/share.php?code=JCnzE 提取密码:8443
完整屏幕录制功能:支持自定义分辨率、帧率和比特率
悬浮窗控制界面:提供直观的操作按钮和状态显示
自动连点器:可设置点击位置和间隔时间
文件管理:自动创建保存目录并按时间命名文件
状态监控:实时显示录制时长和当前状态
异常处理:完善的错误捕获和提示机制
// 屏幕录制参数配置
let config = {
videoBitrate: 6000000, // 视频比特率
resolution: [device.width, device.height], // 分辨率
fps: 30, // 帧率
recordTime: 60 * 1000, // 默认录制时长(毫秒)
savePath: "/sdcard/DCIM/ScreenRecords/", // 保存路径
clickInterval: 500, // 连点间隔(毫秒)
clickPosition: [500, 500] // 连点位置[x,y]
};
// 创建悬浮窗控制界面
let window = floaty.window(
);
// 变量声明
let isRecording = false;
let isClicking = false;
let mediaRecorder = null;
let clickerThread = null;
let startTime = 0;
// 设置悬浮窗样式
window.setPosition(device.width / 4, device.height / 3);
window.setTouchable(true);
// 录制按钮事件
window.record.click(() => {
if (!isRecording) {
startRecording();
} else {
toast("已经在录制中");
}
});
// 停止按钮事件
window.stop.click(() => {
if (isRecording) {
stopRecording();
} else {
toast("没有在录制");
}
});
// 连点器按钮事件
window.clicker.click(() => {
if (!isClicking) {
startClicker();
} else {
stopClicker();
}
});
// 退出按钮事件
window.exit.click(() => {
if (isRecording) {
stopRecording();
}
if (isClicking) {
stopClicker();
}
exit();
});
// 开始录制函数
function startRecording() {
try {
// 创建保存目录
files.ensureDir(config.savePath);
// 生成文件名
let date = new Date();
let fileName = "record_" +
date.getFullYear() + "-" +
(date.getMonth() + 1) + "-" +
date.getDate() + "_" +
date.getHours() + "-" +
date.getMinutes() + "-" +
date.getSeconds() + ".mp4";
let filePath = config.savePath + fileName;
// 开始录制
mediaRecorder = media.projection.createRecorder(filePath);
mediaRecorder.setVideoSize(config.resolution[0], config.resolution[1]);
mediaRecorder.setVideoEncodingBitRate(config.videoBitrate);
mediaRecorder.setFrameRate(config.fps);
mediaRecorder.prepare();
mediaRecorder.start();
isRecording = true;
startTime = new Date().getTime();
window.status.setText("状态: 录制中 " + fileName);
// 定时更新状态
setInterval(() => {
if (isRecording) {
let currentTime = new Date().getTime();
let elapsed = Math.floor((currentTime - startTime) / 1000);
window.status.setText("状态: 录制中 " + elapsed + "秒");
}
}, 1000);
toast("开始录制");
} catch (e) {
console.error("录制失败: " + e);
toast("录制失败: " + e);
}
}
// 停止录制函数
function stopRecording() {
try {
if (mediaRecorder) {
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
isRecording = false;
window.status.setText("状态: 录制完成");
toast("录制已停止");
} catch (e) {
console.error("停止录制失败: " + e);
toast("停止录制失败: " + e);
}
}
// 开始连点器函数
function startClicker() {
isClicking = true;
window.status.setText("状态: 连点器中");
clickerThread = threads.start(function() {
while (isClicking) {
press(config.clickPosition[0], config.clickPosition[1], 50);
sleep(config.clickInterval);
}
});
toast("连点器已开启");
}
// 停止连点器函数
function stopClicker() {
isClicking = false;
if (clickerThread) {
clickerThread.interrupt();
}
window.status.setText("状态: 待机");
toast("连点器已关闭");
}
// 脚本退出处理
events.on("exit", function() {
if (isRecording) {
stopRecording();
}
if (isClicking) {
stopClicker();
}
});
// 保持脚本运行
setInterval(() => {}, 1000);