幽淆 发表于 2025-6-30 21:51:46

LVGL-仪表盘

lv_meter_create

用于创建仪表盘(Meter)控件的函数
lv_obj_t* lv_meter_create(lv_obj_t* parent);
//parent:父对象指针
//ret:返回创建的仪表盘对象指针(lv_obj_t* 类型),若创建失败则返回 NULLlv_meter_add_scale

用于向仪表盘(Meter)添加刻度盘的函数
lv_meter_scale_t* lv_meter_add_scale(lv_obj_t* meter);
//meter:仪表盘对象指针
//ret:返回新刻度盘的指针(lv_meter_scale_t* 类型),用于后续配置lv_meter_set_scale_ticks

用于设置仪表盘(lv_meter)刻度线的函数
void lv_meter_set_scale_ticks(lv_obj_t * meter, lv_meter_scale_t * scale, uint16_t cnt, uint16_t width, uint16_t len, lv_color_t color);
//meter:指向仪表盘对象的指针
//scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
//cnt:小刻度线的数量
//width:小刻度线的宽度
//len:小刻度线的长度
//color:小刻度线的颜色lv_meter_set_scale_major_ticks

用于设置仪表盘(lv_meter)主刻度线的函数
void lv_meter_set_scale_major_ticks(lv_obj_t * meter, lv_meter_scale_t * scale, uint16_t nth, uint16_t width, uint16_t len, lv_color_t color, int16_t label_gap);
//meter:指向仪表盘对象的指针
//scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
//nth:每隔多少个小刻度绘制一个主刻度
//width:主刻度线的宽度
//len:主刻度线的长度
//color:主刻度线的颜色
//label_gap:主刻度线与标签之间的距离lv_meter_set_scale_range

用于设置仪表盘(lv_meter)刻度范围和角度的函数
void lv_meter_set_scale_range(lv_obj_t * meter, lv_meter_scale_t * scale, int32_t min, int32_t max, uint32_t angle_range, uint32_t rotation);
//meter:指向仪表盘对象的指针
//scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
//min:刻度表的最小值
//max:刻度表的最大值
//angle_range:刻度表的角度范围(以度为单位)
//rotation:刻度表的旋转角度(以度为单位),从 3 点钟方向顺时针旋转lv_meter_add_needle_line

用于向仪表盘(lv_meter)添加指针线的函数
lv_meter_indicator_t * lv_meter_add_needle_line(lv_obj_t * meter, lv_meter_scale_t * scale, uint16_t width, lv_color_t color, int16_t r_mod);
//meter:指向仪表盘对象的指针
//scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
//width:指针线的宽度
//color:指针线的颜色
//r_mod:指针线长度的调整值。正值会使指针线更长,负值会使指针线更短
//ret:返回一个 lv_meter_indicator_t 类型的指针,表示新添加的指针线lv_meter_add_needle_img

用于向仪表盘(lv_meter)添加指针图片的函数
lv_meter_indicator_t * lv_meter_add_needle_img(lv_obj_t * meter, lv_meter_scale_t * scale, const void * img_src, uint16_t pivot_x, uint16_t pivot_y);
//meter:指向仪表盘对象的指针
//scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
//img_src:指针图片的资源,可以是图片的路径或图片描述符
//pivot_x:图片旋转中心点的 x 坐标,相对于图片左上角的偏移量
//pivot_y:图片旋转中心点的 y 坐标,相对于图片左上角的偏移量
//ret:返回一个 lv_meter_indicator_t 类型的指针,表示新添加的指针图lv_meter_add_arc

用于向仪表盘(Meter)添加弧形指示器的函数
lv_meter_indicator_t* lv_meter_add_arc(
    lv_obj_t* meter,               // 仪表盘对象
    lv_meter_scale_t* scale,       // 绑定的刻度盘
    uint16_t width,                // 弧线宽度(像素)
    lv_color_t color,            // 弧线颜色
    int16_t r_mod                  // 半径调整值(正数外扩,负数内缩)
);
//ret:返回弧形指示器的指针(lv_meter_indicator_t*),用于后续动态更新数值lv_meter_add_scale_lines

用于向仪表盘(Meter)的刻度盘添加颜色渐变刻度线的函数
lv_meter_indicator_t* lv_meter_add_scale_lines(
    lv_obj_t* meter,               // 仪表盘对象
    lv_meter_scale_t* scale,       // 绑定的刻度盘
    lv_color_t color_start,      // 起始颜色
    lv_color_t color_end,          // 结束颜色
    bool local,                  // 颜色渐变范围是否基于指示器自身
    int16_t width_mod            // 刻度线宽度调整值(像素)
);
//ret:返回刻度线指示器的指针(lv_meter_indicator_t*),用于后续动态调整数值范围 lv_meter_set_indicator_value

用于设置仪表盘(lv_meter)指针(指示器)值的函数。通过这个函数,可以动态地调整指针在仪表盘上的位置,以反映不同的数据值
void lv_meter_set_indicator_value(lv_obj_t * meter, lv_meter_indicator_t * indic, int32_t value);
//meter:指向仪表盘对象的指针
//indic:指向要设置值的指针(指示器)的指针,该指针是通过 lv_meter_add_needle_line、lv_meter_add_needle_img 或其他相关函数创建的。
//value:要设置的值,该值必须在仪表盘刻度范围(通过 lv_meter_set_scale_range 设置)内lv_meter_set_indicator_start_value

用于设置仪表盘(Meter)指示器起始值的核心函数
void lv_meter_set_indicator_start_value(
    lv_obj_t* obj,                   // 仪表盘对象指针
    lv_meter_indicator_t* indic,   // 指示器指针(由添加函数返回)
    int32_t value                  // 起始值(需在刻度盘范围内)
);lv_meter_set_indicator_end_value

用于设置仪表盘(Meter)指示器结束值的核心函数
void lv_meter_set_indicator_end_value(
    lv_obj_t* obj,                   // 仪表盘对象指针
    lv_meter_indicator_t* indic,   // 指示器指针(由添加函数返回)
    int32_t value                  // 结束值(需在刻度盘范围内)
);// 定义一个全局变量,用于存储仪表盘对象
static lv_obj_t * meter;

// 定义一个回调函数,用于设置指针的值
static void set_value(void * indic, int32_t v)
{
    // 调用 LVGL 的函数,设置指针的结束值
    lv_meter_set_indicator_end_value(meter, indic, v);
}

/**
* 创建一个类似时钟的仪表盘示例
*/
void lv_example_meter_3(void)
{
    // 创建一个仪表盘对象,并将其添加到当前屏幕
    meter = lv_meter_create(lv_scr_act());
    lv_obj_set_size(meter, 220, 220); // 设置仪表盘的大小
    lv_obj_center(meter); // 将仪表盘居中

    // 创建一个刻度表,用于表示分钟
    lv_meter_scale_t * scale_min = lv_meter_add_scale(meter);
    // 设置分钟刻度表的小刻度:61 个小刻度,覆盖 360 度
    lv_meter_set_scale_ticks(meter, scale_min, 61, 1, 10, lv_palette_main(LV_PALETTE_GREY));
    // 设置分钟刻度表的值范围和角度范围:0 到 60,覆盖 360 度,起始角度为 270 度
    lv_meter_set_scale_range(meter, scale_min, 0, 60, 360, 270);

    // 创建另一个刻度表,用于表示小时
    lv_meter_scale_t * scale_hour = lv_meter_add_scale(meter);
    // 设置小时刻度表的小刻度:12 个小刻度,不显示小刻度线
    lv_meter_set_scale_ticks(meter, scale_hour, 12, 0, 0, lv_palette_main(LV_PALETTE_GREY));
    // 设置小时刻度表的主刻度:每个刻度都是主刻度,长度为 20 像素,颜色为黑色,标签距离为 10 像素
    lv_meter_set_scale_major_ticks(meter, scale_hour, 1, 2, 20, lv_color_black(), 10);
    // 设置小时刻度表的值范围和角度范围:1 到 12,覆盖 330 度,起始角度为 300 度
    lv_meter_set_scale_range(meter, scale_hour, 1, 12, 330, 300);

    // 声明一个图片资源(假设 img_hand 是一个指向右侧的指针图片)
    LV_IMG_DECLARE(img_hand);

    // 添加分钟指针,使用图片作为指针
    lv_meter_indicator_t * indic_min = lv_meter_add_needle_img(meter, scale_min, &img_hand, 5, 5);
    // 添加小时指针,使用图片作为指针(注意:这里应该使用 scale_hour,但示例代码中错误地使用了 scale_min)
    lv_meter_indicator_t * indic_hour = lv_meter_add_needle_img(meter, scale_min, &img_hand, 5, 5);

    // 创建一个动画对象,用于动态更新分钟指针的位置
    lv_anim_t a;
    lv_anim_init(&a); // 初始化动画对象
    lv_anim_set_exec_cb(&a, set_value); // 设置动画的执行回调函数
    lv_anim_set_values(&a, 0, 60); // 设置动画的起始值和结束值
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); // 设置动画无限重复
    lv_anim_set_time(&a, 2000); // 设置动画时长为 2 秒(模拟 1 小时)
    lv_anim_set_var(&a, indic_min); // 设置动画作用的对象为分钟指针
    lv_anim_start(&a); // 启动动画

    // 创建另一个动画对象,用于动态更新小时指针的位置
    lv_anim_set_var(&a, indic_hour); // 设置动画作用的对象为小时指针
    lv_anim_set_time(&a, 24000); // 设置动画时长为 24 秒(模拟 12 小时)
    lv_anim_set_values(&a, 0, 60); // 设置动画的起始值和结束值
    lv_anim_start(&a); // 启动动画
}// 定义一个全局变量,用于存储仪表盘对象
static lv_obj_t * meter;

// 定义一个回调函数,用于设置指示器的值
static void set_value(void * indic, int32_t v)
{
    // 调用 LVGL 的函数,设置指示器的结束值
    lv_meter_set_indicator_end_value(meter, indic, v);
}

/**
* 创建一个带有多个弧形指示器的仪表盘
*/
void lv_example_meter_2(void)
{
    // 创建一个仪表盘对象,并将其添加到当前屏幕
    meter = lv_meter_create(lv_scr_act());
    lv_obj_center(meter); // 将仪表盘居中
    lv_obj_set_size(meter, 200, 200); // 设置仪表盘的大小

    // 移除仪表盘中间的圆形指示器(默认样式中有一个圆形指示器)
    lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR);

    // 添加一个刻度表
    lv_meter_scale_t * scale = lv_meter_add_scale(meter);
    // 设置刻度表的小刻度:11 个小刻度,宽度为 2 像素,长度为 10 像素,颜色为灰色
    lv_meter_set_scale_ticks(meter, scale, 11, 2, 10, lv_palette_main(LV_PALETTE_GREY));
    // 设置刻度表的主刻度:每隔 1 个小刻度有一个主刻度,宽度为 2 像素,长度为 30 像素,颜色为浅灰色,标签距离为 15 像素
    lv_meter_set_scale_major_ticks(meter, scale, 1, 2, 30, lv_color_hex3(0xeee), 15);
    // 设置刻度表的值范围和角度范围:0 到 100,覆盖 270 度,起始角度为 90 度
    lv_meter_set_scale_range(meter, scale, 0, 100, 270, 90);

    // 添加三个弧形指示器
    // 第一个弧形指示器:宽度为 10 像素,颜色为红色,偏移量为 0
    lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_RED), 0);
    // 第二个弧形指示器:宽度为 10 像素,颜色为绿色,偏移量为 -10
    lv_meter_indicator_t * indic2 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_GREEN), -10);
    // 第三个弧形指示器:宽度为 10 像素,颜色为蓝色,偏移量为 -20
    lv_meter_indicator_t * indic3 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_BLUE), -20);

    // 创建一个动画对象,用于动态更新指示器的值
    lv_anim_t a;
    lv_anim_init(&a); // 初始化动画对象
    lv_anim_set_exec_cb(&a, set_value); // 设置动画的执行回调函数
    lv_anim_set_values(&a, 0, 100); // 设置动画的起始值和结束值
    lv_anim_set_repeat_delay(&a, 100); // 设置动画重复之间的延迟时间
    lv_anim_set_playback_delay(&a, 100); // 设置动画回放之间的延迟时间
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); // 设置动画无限重复

    // 为第一个指示器设置动画
    lv_anim_set_time(&a, 2000); // 设置动画时长为 2000 毫秒
    lv_anim_set_playback_time(&a, 500); // 设置动画回放时长为 500 毫秒
    lv_anim_set_var(&a, indic1); // 设置动画作用的对象为第一个指示器
    lv_anim_start(&a); // 启动动画

    // 为第二个指示器设置动画
    lv_anim_set_time(&a, 1000); // 设置动画时长为 1000 毫秒
    lv_anim_set_playback_time(&a, 1000); // 设置动画回放时长为 1000 毫秒
    lv_anim_set_var(&a, indic2); // 设置动画作用的对象为第二个指示器
    lv_anim_start(&a); // 启动动画

    // 为第三个指示器设置动画
    lv_anim_set_time(&a, 1000); // 设置动画时长为 1000 毫秒
    lv_anim_set_playback_time(&a, 2000); // 设置动画回放时长为 2000 毫秒
    lv_anim_set_var(&a, indic3); // 设置动画作用的对象为第三个指示器
    lv_anim_start(&a); // 启动动画
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: LVGL-仪表盘