文章目录
- 一、`lv_bar` 是什么?
- 二、基本使用
- 创建一个进度条
- 设置进度值
- 三、条形方向与填充方向
- 四、范围模式(Range)
- 五、事件处理(可选)
- 六、自定义样式(可选)
- 七、综合示例
- 八、配合 `lv_timer` 或外部数据更新进度
lv_bar
是 LVGL 中的进度条控件,常用于显示任务的完成度、电量、音量、进度等连续值的变化。它的功能和我们常见的“进度条”非常类似,支持设置最小值、最大值、当前值,还可以自定义样式和动画。
一、lv_bar
是什么?
- 是
lv_obj
的子类。 - 用于表示一个数值范围内的当前进度。
- 可横向、纵向显示,也支持动画、样式自定义。
二、基本使用
创建一个进度条
lv_obj_t *bar = lv_bar_create(lv_scr_act()); // 在当前屏幕创建进度条
lv_obj_set_size(bar, 200, 20); // 设置尺寸
lv_obj_center(bar); // 居中显示
设置进度值
lv_bar_set_range(bar, 0, 100); // 设置范围,默认是 0 ~ 100
lv_bar_set_value(bar, 75, LV_ANIM_ON); // 设置当前值为 75,并开启动画
LV_ANIM_ON
表示过渡效果,LV_ANIM_OFF
表示立即生效。
三、条形方向与填充方向
虽然 LVGL 默认是从左到右填充,但我们也可以设置从下往上、右到左等方向:
lv_bar_set_mode(bar, LV_BAR_MODE_NORMAL); // 默认左→右
lv_bar_set_mode(bar, LV_BAR_MODE_SYMMETRICAL); // 两端对称(适合正负数显示)
lv_bar_set_mode(bar, LV_BAR_MODE_RANGE); // 设置范围段(如下节所述)
四、范围模式(Range)
你可以给 lv_bar
设置一个范围区段,比如表示电量阈值、安全值范围等:
lv_bar_set_start_value(bar, 30, LV_ANIM_OFF); // 设置起始值(仅在 RANGE 模式下生效)
lv_bar_set_value(bar, 70, LV_ANIM_OFF); // 设置结束值
lv_bar_set_mode(bar, LV_BAR_MODE_RANGE); // 启用范围显示模式
效果类似于表示「从 30% 到 70%」之间为某个特殊区段。
五、事件处理(可选)
通常不需要处理 lv_bar
的事件,但你可以监听它的值变化等:
void bar_event_cb(lv_event_t *e) {if (lv_event_get_code(e) == LV_EVENT_VALUE_CHANGED) {int val = lv_bar_get_value(lv_event_get_target(e));printf("新进度值: %d\n", val);}
}lv_obj_add_event_cb(bar, bar_event_cb, LV_EVENT_ALL, NULL);
六、自定义样式(可选)
lv_bar
有两个部分:背景(背景槽) 和 指示器(填充部分),可以分别设置样式:
static lv_style_t style_bg, style_indic;
lv_style_init(&style_bg);
lv_style_set_bg_color(&style_bg, lv_color_hex(0xcccccc));lv_style_init(&style_indic);
lv_style_set_bg_color(&style_indic, lv_color_hex(0x00ff00));lv_obj_add_style(bar, &style_bg, LV_PART_MAIN); // 设置背景部分
lv_obj_add_style(bar, &style_indic, LV_PART_INDICATOR); // 设置填充部分
七、综合示例
void create_my_bar(void)
{lv_obj_t *bar = lv_bar_create(lv_scr_act());lv_obj_set_size(bar, 200, 20);lv_obj_center(bar);lv_bar_set_range(bar, 0, 100);lv_bar_set_value(bar, 50, LV_ANIM_ON); // 当前进度为50%
}
八、配合 lv_timer
或外部数据更新进度
可用于实时进度更新,如加载条、电池电量:
static lv_obj_t *bar;void update_bar_cb(lv_timer_t *timer)
{static int val = 0;val = (val + 1) % 101;lv_bar_set_value(bar, val, LV_ANIM_ON);
}void create_dynamic_bar(void)
{bar = lv_bar_create(lv_scr_act());lv_obj_set_size(bar, 200, 20);lv_obj_center(bar);lv_bar_set_range(bar, 0, 100);lv_bar_set_value(bar, 0, LV_ANIM_OFF);lv_timer_create(update_bar_cb, 100, NULL); // 每100ms更新一次
}