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]