| **银杏科技有限公司旗下技术文档发布平台** ||||
|技术支持电话|**0379-69926675-801**|||
|技术支持邮件|Gingko@vip.163.com|||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^
| V1.0 | 2020-12-2 | yang | 初次建立 |
===== 实验十二:lv_slider滑块 =====
==== 一、滑块 ====
滑块对象看起来像一个带有圆形按钮的条形指示器(Bar),也可以用于描述一个事件、容量等的进度状态,或用于显示一些检测的值,如压力,温度,完成任务,速度等。不过相较于Bar,滑块可以主动点击或滑动以设置一个值。
滑块的主要部分被称为** LV_SLIDER_PART_BG** ,它使用典型的背景样式属性。
**LV_SLIDER_PART_INDIC** 是一个虚拟部件,使用了所有典型的背景属性。默认情况下,指标的最大大小与背景的大小相同,但是在其中设置正的填充值** LV_SLIDER_PART_BG** 将使指标变小(负值会使它变大)。
**LV_SLIDER_PART_KNOB** 是一个虚拟部件,使用所有典型的背景属性来描述旋钮。滑块值标签也与旋钮当前位置和尺寸大小对齐。默认情况下,旋钮是正方形(带有半径),其边长等于滑块的较小边。可以使用填充值使旋钮变大,填充值可以是不对称的。
{{ :icore4t:icore4t_rtt_lvgl_12_1.gif?direct |}}
static void slider_event_cb(lv_obj_t * slider, lv_event_t event)/* 滑块回调函数 */
{
if(event == LV_EVENT_VALUE_CHANGED) {
static char buf[16]; /* 获取滑块新值 */
lv_snprintf(buf, sizeof(buf), "%d", lv_slider_get_value(slider));
lv_obj_set_style_local_value_str(slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, buf); /* 更新滑块标签 */
}
}
void lv_gui_run(void)
{
lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */
lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL); /* 创建滑块 */
lv_slider_set_value(slider, 0, LV_ANIM_OFF); /* 设置初始值 */
lv_obj_set_event_cb(slider, slider_event_cb); /* 绑定回调函数 */
lv_slider_set_range(slider, 0, 100); /* 设置值范围 */
lv_obj_set_size(slider, 200, 10); /* 设置滑块尺寸 */
lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置滑块位置 */
}
与条形指示器一样,在对象尺寸的宽小于长时,滑块也可以是垂直的。
{{ :icore4t:icore4t_rtt_lvgl_12_2.gif?direct |}}
lv_obj_set_size(slider, 10, 200); /* 设置滑块尺寸 */
==== 二、值和范围 ====
要设置初始值,请使用**lv_slider_set_value(slider, new_value, LV_ANIM_ON/OFF)**。 用**lv_slider_set_anim_time(slider, anim_time)** 来设置动画时间(以毫秒为单位)。
要指定滑块值的范围(最小值,最大值),可以使用 **lv_slider_set_range(slider, min , max)** 。
==== 三、对称 ====
除了正常类型外,滑块还可以配置为两种其他类型:
* **LV_SLIDER_TYPE_NORMAL** 普通型。
* **LV_SLIDER_TYPE_SYMMETRICAL** 将指标对称地绘制为零(从零开始,从左到右)。
* **LV_SLIDER_TYPE_RANGE** 允许为左(起始)值使用附加旋钮,设置滑块左值使用函数**lv_slider_set/get_left_value()** 。
滑块类型设置可以用 **lv_slider_set_type(slider, LV_SLIDER_TYPE_...)** 函数。
{{ :icore4t:icore4t_rtt_lvgl_12_3.gif?direct |}}
static void slider_event_cb(lv_obj_t * slider, lv_event_t event) /* 滑块回调函数 */
{
if(event == LV_EVENT_VALUE_CHANGED) { /* 检查滑块模式 */
if(lv_slider_get_type(slider) == LV_SLIDER_TYPE_NORMAL) {
static char buf[16]; /* 获取滑块新值 */
lv_snprintf(buf, sizeof(buf), "%d", lv_slider_get_value(slider));
lv_obj_set_style_local_value_str(slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, buf); /* 更新滑块标签 */
} else {
static char buf[32];
lv_snprintf(buf, sizeof(buf), "%d-%d", lv_slider_get_left_value(slider), lv_slider_get_value(slider));
lv_obj_set_style_local_value_str(slider, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, buf);
}
}
}
void lv_gui_run(void){
lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */
lv_obj_t * slider = lv_slider_create(lv_scr_act(), NULL); /* 创建滑块 */
lv_slider_set_value(slider, 30, LV_ANIM_OFF); /* 设置初始值 */
lv_obj_set_event_cb(slider, slider_event_cb); /* 绑定回调函数 */
lv_slider_set_range(slider, 0, 100); /* 设置值范围 */
lv_obj_set_size(slider, 200, 10); /* 设置滑块尺寸 */
lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置滑块位置 */
lv_slider_set_type(slider, LV_SLIDER_TYPE_RANGE); /* 设置双点模式 */
lv_slider_set_left_value(slider, 10, LV_ANIM_OFF); /* 设置左值位置 */
}
==== 四、仅拖拽模式 ====
通常,可以通过**拖动旋钮**或**单击滑块**来调整滑块值。在后一种情况下,旋钮移动到所单击的点,并且滑块值相应地变化。在某些情况下,用户担心误触而改变滑块值,因此希望将滑块设置为**仅在拖动旋钮**时做出反应。这时通过调用 **lv_obj_set_adv_hittest(slider, true)** 来启用此功能。
==== 五、事件 ====
除了通用事件之外,滑块还会发送以下特殊事件:
* **LV_EVENT_VALUE_CHANGED** 滑块被拖动或滑块值改变时发送。拖动滑块(仅在释放滑块时)会连续发送事件。使用 **lv_slider_is_dragged** 以检查滑块是否被拖动或刚刚释放。