LVGL 之 Slider 控件介绍

关键字 :LVGLSlider

一、概述

1.1 Slider 简介

滑条控件看起来像是在进度条(Bar)上增加了一个可以调节的旋钮,使用时可以通过拖动旋钮来设置滑条的值。 与滑条(Bar)类似,Slider 可以是垂直的或水平的。


图 1. Slider

 

二、Slider 基础知识

2.1 Slider 样式

  • LV_PART_MAIN  滑动条的背景,使用所有典型的背景样式属性。
  • LV_PART_INDICATOR  显示滑动条当前状态的指示器,指示当前填充值,也使用所有典型的背景样式属性。
  • LV_PART_KNOB  旋钮(可以是圆形或矩形),也使用所有典型的背景属性。默认情况下,旋钮是方形的(带有可选的圆角半径),边长等于滑动条的较小边。可以通过设置 padding 样式调整旋钮的大小,填充值也可以是不对称的。



图 2. Slider 样式

 

2.2 Slider 范围 & 填充值

设置滑动条的初始值可以通过函数 lv_slider_set_value(slider, new_value, LV_ANIM_ON/OFF) 实现,第三个入口参数选择更新设置值时是否开启动画效果,动画时间可由由样式的 anim_time 属性设置。

指定滑动条的范围(最小值、最大值)可以使用通过函数 lv_slider_set_range(slider, min, max) 实现。

 

2.3 Slider 模式

可以使用函数 lv_slider_set_mode(slider, LV_SLIDER_MODE_...) 设置滑条的模式,分别有以下几种:

  • LV_SLIDER_MODE_NORMAL  是设置为普通模式,如前面图 1 所示。
  • LV_SLIDER_MODE_SYMMETRICAL  这个模式下可以指定负的最小范围,但是只能从 0 值到当前值绘制指示器,如图 3 所示。
  • LV_SLIDER_MODE_RANGE  在这个模式下也可以指定负的最小范围,这样滑动条的起始值可以不是 0,可以使用 lv_slider_set_left_value() 设置起始值,使用 lv_slider_set_value() 设置结束值,两侧如果不设置将使用默认值 0,要注意设置的起始值必须小于结束值,如图 4 所示。



图 3. LV_SLIDER_MODE_SYMMETRICAL



图 4. LV_SLIDER_MODE_RANGE

 

三、 Slider 应用

static void slider_test_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);



/*Provide some extra space for the value*/

if (code == LV_EVENT_REFR_EXT_DRAW_SIZE) {

lv_coord_t* size = (lv_coord_t*)lv_event_get_param(e);

*size = LV_MAX(*size, 50);

}

else if (code == LV_EVENT_DRAW_PART_END) {

lv_obj_draw_part_dsc_t* dsc = (lv_obj_draw_part_dsc_t*)lv_event_get_param(e);

if (dsc->part == LV_PART_INDICATOR) {

char buf[16];

lv_snprintf(buf, sizeof(buf), "%d", 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 + lv_area_get_width(dsc->draw_area) / 2 - label_size.x / 2;

label_area.x2 = label_area.x1 + label_size.x;

label_area.y2 = dsc->draw_area->y1 - 10;

label_area.y1 = label_area.y2 - label_size.y;



lv_draw_label_dsc_t label_draw_dsc;

lv_draw_label_dsc_init(&label_draw_dsc);



lv_draw_label(&label_area, dsc->clip_area, &label_draw_dsc, buf, NULL);

}

}

}



/**

* Show the current value when the slider is pressed by extending the drawer

*

*/

void my_slider_test(void)

{

/*Create a slider in the center of the display*/

lv_obj_t* slider;

slider = lv_slider_create(lv_scr_act());

lv_obj_center(slider);



lv_slider_set_mode(slider, LV_SLIDER_MODE_SYMMETRICAL);

lv_slider_set_range(slider, -100, 100);

lv_slider_set_value(slider, -37, LV_ANIM_OFF);



lv_obj_add_event_cb(slider, slider_test_event_cb, LV_EVENT_ALL, NULL);

lv_obj_refresh_ext_draw_size(slider);

}

 

Slider 的简单应用如上,运行效果如下图所示。



图 5. Slider 应用

    

四、参考资料

(1)LVGL 官方文档 :

https://docs.lvgl.io/master/widgets/core/slider.html

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★博文作者未开放评论功能