https://docs.hamibot.com/
这是开发教程
帮我写一个脚本 创建圆环可拖动悬浮窗并高频获取圆环上颜色列表并以图形形式输出
代码分段发送

已存档
HAMI_0014820431 · 8 天前

回答

Hamibot AI
1
· 8 天前

// 文档地址 https://docs.hamibot.com/

这是一个基于 Hamibot (Hamibot) 的脚本方案,实现可拖动悬浮窗、高频获取颜色并以图形化方式展示。由于 Rhino 1.7.15 引擎限制,代码已规避箭头函数和新特性。请将以下三段代码合并为一个脚本文件运行。

第一段:初始化与悬浮窗布局

这段代码负责创建悬浮窗界面,设置拖动逻辑,并初始化全局变量。

// 文档地址 https://docs.hamibot.com/
"ui";

// 全局变量
var running = true;
var colorData = [];
var maxSamples = 10;

// 创建悬浮窗布局
var window = floaty.window(
    <frame gravity="center" bg="#40000000" w="200" h="200" corner="100">
        <vertical gravity="center" w="*" h="*">
            <text id="status" text="颜色监测中" textColor="#ffffff" gravity="center" w="*" h="40"/>
            <canvas id="colorCanvas" w="150" h="150"/>
            <text id="coords" text="坐标:0, 0" textColor="#cccccc" gravity="center" w="*" h="30" textSize="10"/>
        </vertical>
    </frame>
);

// 设置悬浮窗可拖动
window.setAdjustEnabled(true);

// 记录初始位置用于拖动逻辑
var offsetX = 0;
var offsetY = 0;

// 双击或点击关闭逻辑
window.exitOnClose();

// 监听悬浮窗位置变化(可选,用于调试)
window.setPosition(device.width / 2 - 100, device.height / 2 - 100);

第二段:颜色获取与图形绘制逻辑

这段代码定义了两个核心函数:一个是获取屏幕颜色,另一个是在 Canvas 上绘制颜色圆环。

// 文档地址 https://docs.hamibot.com/

// 获取指定坐标的颜色
function getColorAt(x, y) {
    try {
        var img = images.captureScreen();
        if (img) {
            var color = images.pixel(img, x, y);
            img.recycle();
            return color;
        }
    } catch (e) {
        log("获取颜色失败:" + e);
    }
    return colors.parseColor("#000000");
}

// 在 Canvas 上绘制颜色圆环
function drawColorRing(canvas, width, height) {
    // 清空画布
    canvas.drawColor(colors.parseColor("#00000000"));
    
    var paint = new Paint();
    paint.setAntiAlias(true);
    
    var centerX = width / 2;
    var centerY = height / 2;
    var radius = Math.min(width, height) / 2 - 10;
    
    // 绘制已有颜色数据
    if (colorData.length > 0) {
        var step = 360 / maxSamples;
        for (var i = 0; i < colorData.length; i++) {
            var startAngle = i * step - 90;
            var sweepAngle = step;
            
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(colorData[i]);
            
            // 绘制扇形
            canvas.drawArc(
                centerX - radius, centerY - radius, 
                centerX + radius, centerY + radius, 
                startAngle, sweepAngle, 
                true, paint
            );
        }
    }
    
    // 绘制中心圆点
    paint.setColor(colors.parseColor("#ffffff"));
    canvas.drawCircle(centerX, centerY, 5, paint);
}

第三段:主循环与线程控制

这段代码启动后台线程进行高频检测,并定时刷新悬浮窗 UI,最后处理脚本退出。

// 文档地址 https://docs.hamibot.com/

// 启动检测线程
var thread = threads.start(function() {
    while (running) {
        // 获取悬浮窗中心屏幕坐标
        var winX = window.getX();
        var winY = window.getY();
        var winW = window.getWidth();
        var winH = window.getHeight();
        
        var centerX = winX + winW / 2;
        var centerY = winY + winH / 2;
        
        // 获取颜色并加入队列
        var c = getColorAt(parseInt(centerX), parseInt(centerY));
        colorData.push(c);
        if (colorData.length > maxSamples) {
            colorData.shift();
        }
        
        // 更新 UI 文本
        ui.run(function() {
            window.coords.setText("坐标:" + parseInt(centerX) + ", " + parseInt(centerY));
            window.colorCanvas.setPorterDuffMode(PorterDuff.Mode.CLEAR);
            drawColorRing(window.colorCanvas, 150, 150);
            window.colorCanvas.invalidate();
        });
        
        // 控制频率,避免过高占用
        sleep(200);
    }
});

// 监听脚本停止事件
events.on("exit", function() {
    running = false;
    thread.interrupt();
    log("脚本已停止");
});

log("脚本启动成功,请授予悬浮窗和截屏权限");

使用说明与注意事项

  1. 权限要求:运行前必须在 Hamibot 或手机设置中授予“悬浮窗权限”和“截屏权限”(或无障碍服务中的屏幕录制权限)。
  2. 代码合并:将上述三段代码按顺序合并到一个 .js 文件中。
  3. 兼容性:代码已适配 Rhino 1.7.15 引擎,未使用箭头函数或默认参数。
  4. 图形展示:脚本会在悬浮窗的 Canvas 区域绘制一个圆环,每个扇形代表一次采集的颜色,按时间顺序排列。
  5. 性能调整sleep(200) 控制采集频率为每秒 5 次。如需更高频,可减小该数值,但会增加 CPU 占用。
  6. 圆形外观:布局中使用了 corner="100" 尝试圆角效果,具体显示效果取决于 Android 系统版本对 Floaty 窗口的支持程度。

如果遇到 images.captureScreen 报错,请确保已正确开启无障碍服务中的“截屏”相关权限。

ℹ️ 本回答由 AI 生成,内容仅供参考