找回密码
 立即注册
首页 业界区 科技 LVGL-仪表盘

LVGL-仪表盘

幽淆 2025-6-30 21:51:46
lv_meter_create

用于创建仪表盘(Meter)控件的函数
  1. lv_obj_t* lv_meter_create(lv_obj_t* parent);
  2. //parent:父对象指针
  3. //ret:返回创建的仪表盘对象指针(lv_obj_t* 类型),若创建失败则返回 NULL
复制代码
lv_meter_add_scale

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

用于设置仪表盘(lv_meter)刻度线的函数
  1. 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);
  2. //meter:指向仪表盘对象的指针
  3. //scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
  4. //cnt:小刻度线的数量
  5. //width:小刻度线的宽度
  6. //len:小刻度线的长度
  7. //color:小刻度线的颜色
复制代码
lv_meter_set_scale_major_ticks

用于设置仪表盘(lv_meter)主刻度线的函数
  1. 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);
  2. //meter:指向仪表盘对象的指针
  3. //scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
  4. //nth:每隔多少个小刻度绘制一个主刻度
  5. //width:主刻度线的宽度
  6. //len:主刻度线的长度
  7. //color:主刻度线的颜色
  8. //label_gap:主刻度线与标签之间的距离
复制代码
lv_meter_set_scale_range

用于设置仪表盘(lv_meter)刻度范围和角度的函数
  1. 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);
  2. //meter:指向仪表盘对象的指针
  3. //scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
  4. //min:刻度表的最小值
  5. //max:刻度表的最大值
  6. //angle_range:刻度表的角度范围(以度为单位)
  7. //rotation:刻度表的旋转角度(以度为单位),从 3 点钟方向顺时针旋转
复制代码
lv_meter_add_needle_line

用于向仪表盘(lv_meter)添加指针线的函数
  1. 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);
  2. //meter:指向仪表盘对象的指针
  3. //scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
  4. //width:指针线的宽度
  5. //color:指针线的颜色
  6. //r_mod:指针线长度的调整值。正值会使指针线更长,负值会使指针线更短
  7. //ret:返回一个 lv_meter_indicator_t 类型的指针,表示新添加的指针线
复制代码
lv_meter_add_needle_img

用于向仪表盘(lv_meter)添加指针图片的函数
  1. 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);
  2. //meter:指向仪表盘对象的指针
  3. //scale:指向刻度表对象的指针,该刻度表是通过 lv_meter_add_scale 添加到仪表盘中的
  4. //img_src:指针图片的资源,可以是图片的路径或图片描述符
  5. //pivot_x:图片旋转中心点的 x 坐标,相对于图片左上角的偏移量
  6. //pivot_y:图片旋转中心点的 y 坐标,相对于图片左上角的偏移量
  7. //ret:返回一个 lv_meter_indicator_t 类型的指针,表示新添加的指针图
复制代码
lv_meter_add_arc

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

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

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

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

用于设置仪表盘(Meter)指示器结束值的核心函数
  1. void lv_meter_set_indicator_end_value(
  2.     lv_obj_t* obj,                   // 仪表盘对象指针
  3.     lv_meter_indicator_t* indic,     // 指示器指针(由添加函数返回)
  4.     int32_t value                    // 结束值(需在刻度盘范围内)
  5. );
复制代码
  1. // 定义一个全局变量,用于存储仪表盘对象
  2. static lv_obj_t * meter;
  3. // 定义一个回调函数,用于设置指针的值
  4. static void set_value(void * indic, int32_t v)
  5. {
  6.     // 调用 LVGL 的函数,设置指针的结束值
  7.     lv_meter_set_indicator_end_value(meter, indic, v);
  8. }
  9. /**
  10. * 创建一个类似时钟的仪表盘示例
  11. */
  12. void lv_example_meter_3(void)
  13. {
  14.     // 创建一个仪表盘对象,并将其添加到当前屏幕
  15.     meter = lv_meter_create(lv_scr_act());
  16.     lv_obj_set_size(meter, 220, 220); // 设置仪表盘的大小
  17.     lv_obj_center(meter); // 将仪表盘居中
  18.     // 创建一个刻度表,用于表示分钟
  19.     lv_meter_scale_t * scale_min = lv_meter_add_scale(meter);
  20.     // 设置分钟刻度表的小刻度:61 个小刻度,覆盖 360 度
  21.     lv_meter_set_scale_ticks(meter, scale_min, 61, 1, 10, lv_palette_main(LV_PALETTE_GREY));
  22.     // 设置分钟刻度表的值范围和角度范围:0 到 60,覆盖 360 度,起始角度为 270 度
  23.     lv_meter_set_scale_range(meter, scale_min, 0, 60, 360, 270);
  24.     // 创建另一个刻度表,用于表示小时
  25.     lv_meter_scale_t * scale_hour = lv_meter_add_scale(meter);
  26.     // 设置小时刻度表的小刻度:12 个小刻度,不显示小刻度线
  27.     lv_meter_set_scale_ticks(meter, scale_hour, 12, 0, 0, lv_palette_main(LV_PALETTE_GREY));
  28.     // 设置小时刻度表的主刻度:每个刻度都是主刻度,长度为 20 像素,颜色为黑色,标签距离为 10 像素
  29.     lv_meter_set_scale_major_ticks(meter, scale_hour, 1, 2, 20, lv_color_black(), 10);
  30.     // 设置小时刻度表的值范围和角度范围:1 到 12,覆盖 330 度,起始角度为 300 度
  31.     lv_meter_set_scale_range(meter, scale_hour, 1, 12, 330, 300);
  32.     // 声明一个图片资源(假设 img_hand 是一个指向右侧的指针图片)
  33.     LV_IMG_DECLARE(img_hand);
  34.     // 添加分钟指针,使用图片作为指针
  35.     lv_meter_indicator_t * indic_min = lv_meter_add_needle_img(meter, scale_min, &img_hand, 5, 5);
  36.     // 添加小时指针,使用图片作为指针(注意:这里应该使用 scale_hour,但示例代码中错误地使用了 scale_min)
  37.     lv_meter_indicator_t * indic_hour = lv_meter_add_needle_img(meter, scale_min, &img_hand, 5, 5);
  38.     // 创建一个动画对象,用于动态更新分钟指针的位置
  39.     lv_anim_t a;
  40.     lv_anim_init(&a); // 初始化动画对象
  41.     lv_anim_set_exec_cb(&a, set_value); // 设置动画的执行回调函数
  42.     lv_anim_set_values(&a, 0, 60); // 设置动画的起始值和结束值
  43.     lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); // 设置动画无限重复
  44.     lv_anim_set_time(&a, 2000); // 设置动画时长为 2 秒(模拟 1 小时)
  45.     lv_anim_set_var(&a, indic_min); // 设置动画作用的对象为分钟指针
  46.     lv_anim_start(&a); // 启动动画
  47.     // 创建另一个动画对象,用于动态更新小时指针的位置
  48.     lv_anim_set_var(&a, indic_hour); // 设置动画作用的对象为小时指针
  49.     lv_anim_set_time(&a, 24000); // 设置动画时长为 24 秒(模拟 12 小时)
  50.     lv_anim_set_values(&a, 0, 60); // 设置动画的起始值和结束值
  51.     lv_anim_start(&a); // 启动动画
  52. }
复制代码
  1. // 定义一个全局变量,用于存储仪表盘对象
  2. static lv_obj_t * meter;
  3. // 定义一个回调函数,用于设置指示器的值
  4. static void set_value(void * indic, int32_t v)
  5. {
  6.     // 调用 LVGL 的函数,设置指示器的结束值
  7.     lv_meter_set_indicator_end_value(meter, indic, v);
  8. }
  9. /**
  10. * 创建一个带有多个弧形指示器的仪表盘
  11. */
  12. void lv_example_meter_2(void)
  13. {
  14.     // 创建一个仪表盘对象,并将其添加到当前屏幕
  15.     meter = lv_meter_create(lv_scr_act());
  16.     lv_obj_center(meter); // 将仪表盘居中
  17.     lv_obj_set_size(meter, 200, 200); // 设置仪表盘的大小
  18.     // 移除仪表盘中间的圆形指示器(默认样式中有一个圆形指示器)
  19.     lv_obj_remove_style(meter, NULL, LV_PART_INDICATOR);
  20.     // 添加一个刻度表
  21.     lv_meter_scale_t * scale = lv_meter_add_scale(meter);
  22.     // 设置刻度表的小刻度:11 个小刻度,宽度为 2 像素,长度为 10 像素,颜色为灰色
  23.     lv_meter_set_scale_ticks(meter, scale, 11, 2, 10, lv_palette_main(LV_PALETTE_GREY));
  24.     // 设置刻度表的主刻度:每隔 1 个小刻度有一个主刻度,宽度为 2 像素,长度为 30 像素,颜色为浅灰色,标签距离为 15 像素
  25.     lv_meter_set_scale_major_ticks(meter, scale, 1, 2, 30, lv_color_hex3(0xeee), 15);
  26.     // 设置刻度表的值范围和角度范围:0 到 100,覆盖 270 度,起始角度为 90 度
  27.     lv_meter_set_scale_range(meter, scale, 0, 100, 270, 90);
  28.     // 添加三个弧形指示器
  29.     // 第一个弧形指示器:宽度为 10 像素,颜色为红色,偏移量为 0
  30.     lv_meter_indicator_t * indic1 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_RED), 0);
  31.     // 第二个弧形指示器:宽度为 10 像素,颜色为绿色,偏移量为 -10
  32.     lv_meter_indicator_t * indic2 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_GREEN), -10);
  33.     // 第三个弧形指示器:宽度为 10 像素,颜色为蓝色,偏移量为 -20
  34.     lv_meter_indicator_t * indic3 = lv_meter_add_arc(meter, scale, 10, lv_palette_main(LV_PALETTE_BLUE), -20);
  35.     // 创建一个动画对象,用于动态更新指示器的值
  36.     lv_anim_t a;
  37.     lv_anim_init(&a); // 初始化动画对象
  38.     lv_anim_set_exec_cb(&a, set_value); // 设置动画的执行回调函数
  39.     lv_anim_set_values(&a, 0, 100); // 设置动画的起始值和结束值
  40.     lv_anim_set_repeat_delay(&a, 100); // 设置动画重复之间的延迟时间
  41.     lv_anim_set_playback_delay(&a, 100); // 设置动画回放之间的延迟时间
  42.     lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); // 设置动画无限重复
  43.     // 为第一个指示器设置动画
  44.     lv_anim_set_time(&a, 2000); // 设置动画时长为 2000 毫秒
  45.     lv_anim_set_playback_time(&a, 500); // 设置动画回放时长为 500 毫秒
  46.     lv_anim_set_var(&a, indic1); // 设置动画作用的对象为第一个指示器
  47.     lv_anim_start(&a); // 启动动画
  48.     // 为第二个指示器设置动画
  49.     lv_anim_set_time(&a, 1000); // 设置动画时长为 1000 毫秒
  50.     lv_anim_set_playback_time(&a, 1000); // 设置动画回放时长为 1000 毫秒
  51.     lv_anim_set_var(&a, indic2); // 设置动画作用的对象为第二个指示器
  52.     lv_anim_start(&a); // 启动动画
  53.     // 为第三个指示器设置动画
  54.     lv_anim_set_time(&a, 1000); // 设置动画时长为 1000 毫秒
  55.     lv_anim_set_playback_time(&a, 2000); // 设置动画回放时长为 2000 毫秒
  56.     lv_anim_set_var(&a, indic3); // 设置动画作用的对象为第三个指示器
  57.     lv_anim_start(&a); // 启动动画
  58. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册