文章目录
- 一、`lv_slider` 是什么?
- 二、创建一个滑块
- 设置滑块的范围和初始值
- 三、响应滑块事件
- 四、设置样式
- 示例:更改滑块颜色和滑块按钮样式
- 五、纵向滑块(垂直方向)
- 六、双滑块模式(范围选择)
- 七、获取滑块的值
- 八、综合示例
- 九、与标签联动显示数值(进阶示例)
- 十、总结
lv_slider
是 LVGL 中的滑块控件,功能类似于你在音量调节、电量调节、亮度调节、滚动条等常见 UI 中见到的滑动条。它是 lv_bar
的子类,因此具有所有 lv_bar
的特性,并额外提供了可拖动的指针(滑块)。
一、lv_slider
是什么?
- 是
lv_bar
的子类,拥有进度条的全部功能。 - 支持用户通过触控/鼠标拖动滑块改变数值。
- 支持单向进度、**区间进度(双滑块)**模式。
- 可横向或纵向使用。
二、创建一个滑块
lv_obj_t *slider = lv_slider_create(lv_scr_act()); // 在当前屏幕创建滑块
lv_obj_set_width(slider, 200); // 设置宽度
lv_obj_center(slider); // 居中显示
设置滑块的范围和初始值
lv_slider_set_range(slider, 0, 100); // 设置范围
lv_slider_set_value(slider, 40, LV_ANIM_OFF); // 设置初始值(无动画)
三、响应滑块事件
用户拖动滑块时,你通常会监听 LV_EVENT_VALUE_CHANGED
事件获取当前值。
void slider_event_cb(lv_event_t *e)
{if(lv_event_get_code(e) == LV_EVENT_VALUE_CHANGED) {lv_obj_t *slider = lv_event_get_target(e);int val = lv_slider_get_value(slider);printf("滑块值: %d\n", val);}
}lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
四、设置样式
lv_slider
有三个主要部分可以设置样式:
部位 | 对应区域 |
---|---|
LV_PART_MAIN | 背景槽(未填充的部分) |
LV_PART_INDICATOR | 已填充区域(进度) |
LV_PART_KNOB | 滑块按钮(可拖动的圆点) |
示例:更改滑块颜色和滑块按钮样式
static lv_style_t style_knob;
lv_style_init(&style_knob);
lv_style_set_bg_color(&style_knob, lv_color_hex(0xff0000));
lv_style_set_radius(&style_knob, LV_RADIUS_CIRCLE);
lv_style_set_pad_all(&style_knob, 6); // 设置 knob 尺寸lv_obj_add_style(slider, &style_knob, LV_PART_KNOB);
五、纵向滑块(垂直方向)
默认是横向滑动。你可以通过设置尺寸为“瘦高”来做纵向滑动条:
lv_obj_set_size(slider, 20, 150); // 瘦长样式
六、双滑块模式(范围选择)
LVGL 支持范围滑块(类似 A 点到 B 点的选区),需要启用 LV_USE_SLIDER && LV_SLIDER_RANGE
:
lv_slider_set_mode(slider, LV_SLIDER_MODE_RANGE); // 启用范围模式
lv_slider_set_value(slider, 40, LV_ANIM_OFF); // 设置右侧滑块值
lv_slider_set_left_value(slider, 20, LV_ANIM_OFF); // 设置左侧滑块值
范围滑块适合做“区间选择”,比如设置温度上下限。
七、获取滑块的值
int val = lv_slider_get_value(slider); // 当前滑块值
int left = lv_slider_get_left_value(slider); // 左侧滑块值(仅范围模式下)
八、综合示例
void create_slider(void)
{lv_obj_t *slider = lv_slider_create(lv_scr_act());lv_obj_set_width(slider, 200);lv_obj_center(slider);lv_slider_set_range(slider, 0, 100);lv_slider_set_value(slider, 50, LV_ANIM_OFF);lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}
九、与标签联动显示数值(进阶示例)
static lv_obj_t *label;void slider_event_cb(lv_event_t *e)
{lv_obj_t *slider = lv_event_get_target(e);int val = lv_slider_get_value(slider);char buf[16];lv_snprintf(buf, sizeof(buf), "%d%%", val);lv_label_set_text(label, buf);
}void create_slider_with_label(void)
{lv_obj_t *slider = lv_slider_create(lv_scr_act());lv_obj_set_width(slider, 200);lv_obj_align(slider, LV_ALIGN_CENTER, 0, -20);lv_slider_set_range(slider, 0, 100);lv_slider_set_value(slider, 30, LV_ANIM_OFF);lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);label = lv_label_create(lv_scr_act());lv_label_set_text(label, "30%");lv_obj_align(label, LV_ALIGN_CENTER, 0, 30);
}
十、总结
功能 | API 示例 |
---|---|
创建滑块 | lv_slider_create() |
设置范围 | lv_slider_set_range(slider, min, max) |
设置值 | lv_slider_set_value(slider, val, anim) |
获取当前值 | lv_slider_get_value(slider) |
启用范围选择模式 | lv_slider_set_mode(slider, LV_SLIDER_MODE_RANGE) |
设置左滑块值 | lv_slider_set_left_value(slider, val, anim) |
设置样式 | lv_obj_add_style(slider, &style, part) |