static void button_event_cb(lv_event_t* e) {
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t* obj = lv_event_get_target(e);
if (code == LV_EVENT_DRAW_PART_END) {
lv_obj_draw_part_dsc_t* dsc = lv_event_get_param(e);
if (dsc->part == LV_PART_KNOB) {
char buf[16];
lv_snprintf(buf, sizeof(buf), "%d", (int)lv_slider_get_value(obj));
lv_point_t label_size;
lv_txt_get_size(&label_size, buf, LV_FONT_DEFAULT, 0, 0, LV_COORD_MAX, 0);
lv_area_t label_area;
label_area.x1 = dsc->draw_area->x1 + (dsc->draw_area->x2 - dsc->draw_area->x1) / 2 - 5;
label_area.x2 = dsc->draw_area->x2;
label_area.y2 = dsc->draw_area->y2;
label_area.y1 = dsc->draw_area->y1 + (dsc->draw_area->y2 - dsc->draw_area->y1) / 2 - 5;
lv_draw_label_dsc_t label_draw_dsc;
lv_draw_label_dsc_init(&label_draw_dsc);
lv_draw_label(dsc->draw_ctx, &label_draw_dsc, &label_area, buf, NULL);
}
}
}
lv_obj_t* bar = lv_slider_create(lv_scr_act());
lv_obj_set_size(bar, 200, 20);
lv_bar_set_value(bar, 15, LV_ANIM_OFF);
lv_bar_set_range(bar, 0, 100);
lv_obj_add_event_cb(bar, button_event_cb, LV_EVENT_ALL, NULL);
lv_obj_center(bar);
lv_obj_add_flag(bar, LV_OBJ_FLAG_ADV_HITTEST);
主要知识:
-
LV_EVENT_VALUE_CHANGED
滑动条的值被改变时发送事件。 拖动滑动条时会持续发送事件,最后释放时也会发送一次。 使用lv_slider_is_dragged
来确定滑动条是处于被拖动状态还是被释放状态。 -
LV_EVENT_DRAW_PART_BEGIN
和LV_EVENT_DRAW_PART_END
被发送用于以下部分。-
LV_SLIDER_DRAW_PART_KNOB
滑动条的主(右)旋钮-
部分
:LV_PART_KNOB
-
draw_area
:指示器的区域 -
rect_dsc
-
id
:0
-
-
LV_SLIDER_DRAW_PART_KNOB
滑块的左侧旋钮-
部分
:LV_PART_KNOB
-
draw_area
:指标的区域 -
rect_dsc
-
id
:1
-
-
enum lv_slider_draw_part_type_t
type
field in lv_obj_draw_part_dsc_t
if class_p = lv_slider_class
Used in LV_EVENT_DRAW_PART_BEGIN
and LV_EVENT_DRAW_PART_END
Values:
enumerator LV_SLIDER_DRAW_PART_KNOB 滑块的右侧旋钮
enumerator LV_SLIDER_DRAW_PART_KNOB_LEFT 滑块的左侧旋钮