本篇文章目录导航

♠♠ LVGL控件-滑轮、滑动条、圆弧
♣♣♣♣ 一、LVGL 滑轮部件
♦♦♦♦♦♦♦♦ 1.1 滑轮部件组成部分
♦♦♦♦♦♦♦♦ 1.2 滑轮部件基本API
♦♦♦♦♦♦♦♦ 1.3 实验小演示
♣♣♣♣ 二、LVGL 滑动条部件
♦♦♦♦♦♦♦♦ 2.1 滑动条部件组成部分
♦♦♦♦♦♦♦♦ 2.2 滑动条部件基本API
♦♦♦♦♦♦♦♦ 2.3 实验小演示(亮度调节器)
♦♦♦♦♦♦♦♦ 2.4 实验小演示
♣♣♣♣ 三、LVGL 圆弧部件
♦♦♦♦♦♦♦♦ 3.1 圆弧部件组成部分
♦♦♦♦♦♦♦♦ 3.2 圆弧部件基本API
♦♦♦♦♦♦♦♦ 3.3 实验小演示(调节器)
♦♦♦♦♦♦♦♦ 3.4 实验小演示(动态加载)

LVGL控件-滑轮、滑动条、圆弧

一、LVGL 滑轮部件

滚轮部件常用于多选一的场景,它以滚轮的形式来展现多个选项。类似于下拉列表。

效果图:

1.1 滑轮部件组成部分

主体LV_PART_MAIN
选项框LV_PART_SELECTED

1.2 滑轮部件基本API

创建滚轮部件:

lv_obj_t *roller = lv_roller_create(parent);

设置选项间隔:

lv_obj_set_style_text_line_space(roller, 30, LV_STATE_DEFAULT);

设置选项内容、滚动模式:

enum{
    LV_ROLLER_MODE_NORMAL,    /* 正常模式 */
    LV_ROLLER_MODE_INFINITE,  /* 无限循环模式,对内存占用较大 */
};

lv_roller_set_options(roller, "a\nb\nc\d", LV_ROLLER_MODE_NORMAL);

设置当前所选项:

lv_roller_set_selected(roller, 3, LV_ANIM_ON);

设置可见行数:

lv_roller_set_visible_row_count(roller, 2);

获取选项内容:

lv_roller_get_selected(roller);                          /* 获取索引 */

char buf[10];
lv_roller_get_selected_str(roller, buf, sizeof(buf));    /* 获取选项文本 */

1.3 实验小演示

设计两个滑轮,一个正常模式,一个无限循环模式。

lv_obj_t *roller1, *roller2;

static void 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_VALUE_CHANGED)
    {
        char buf[10];
        lv_roller_get_selected_str(obj, buf, sizeof(buf));    /* 获取选项文本 */
        if(obj == roller1)
        {
            printf("The Left Roller:%d %s\n", lv_roller_get_selected(obj), buf);
        }else
        {
            printf("The Right Roller:%d %s\n", lv_roller_get_selected(obj), buf);
        }
    }
}

void my_gui(void)
{
    /**********************第一个滑轮*************************/
    roller1 = lv_roller_create(lv_scr_act());                               /* 创建滑轮部件 */
    lv_obj_align(roller1, LV_ALIGN_CENTER, -150, 0);

    lv_obj_set_style_text_line_space(roller1, 30, LV_STATE_DEFAULT);        /* 设置选项间隔 */
    lv_roller_set_options(roller1, "a\nb\nc\nd", LV_ROLLER_MODE_NORMAL);    /* 设置正常模式 */
    lv_roller_set_selected(roller1, 0, LV_ANIM_ON);                         /* 设置当前所选项 */
    lv_roller_set_visible_row_count(roller1, 2);                            /* 设置当前可见行数 */

    lv_obj_add_event_cb(roller1, event_cb, LV_EVENT_VALUE_CHANGED, NULL);   /* 添加改变事件 */

    /**********************第二个滑轮*************************/
    roller2 = lv_roller_create(lv_scr_act());                               /* 创建滑轮部件 */
    lv_obj_align(roller2, LV_ALIGN_CENTER, 150, 0);

    lv_obj_set_style_text_line_space(roller2, 30, LV_STATE_DEFAULT);        /* 设置选项间隔 */
    lv_roller_set_options(roller2, "A\nB\nC\nD", LV_ROLLER_MODE_INFINITE);  /* 设置循环模式 */
    lv_roller_set_selected(roller2, 2, LV_ANIM_ON);                         /* 设置当前所选项 */
    lv_roller_set_visible_row_count(roller2, 3);                            /* 设置当前可见行数 */

    lv_obj_add_event_cb(roller2, event_cb, LV_EVENT_VALUE_CHANGED, NULL);   /* 添加改变事件 */
}

演示图片:
演示视频:LVGL滑轮部件

二、LVGL 滑动条部件

滑块部件常用于调节某个参数的值,它以直线滑动的形式来修改数值。

效果图:

2.1 滑动条部件组成部分

主体(LV_PART_MAIN)
指示器(LV_PART_INDICATOR)
旋钮(LV_PART_KNOB)

2.2 滑动条部件基本API

创建滑块部件:

lv_obj_t *slider = lv_slider_create(parent);

设置大小、当前值、范围值:

lv_obj_set_size(slider, 20, 200);                /* 高度>宽度时,滑块为纵向 */
lv_slider_set_value(slider, 50, LV_ANIM_OFF);    /* 设置当前值 */
lv_slider_set_range(slider, -100, 100);          /* 设置范围值 */

获取当前值:

lv_slider_get_value(slider);

模式设置:

lv_slider_set_mode(slider, LV_SLIDER_MODE_...);


设置、获取左值:

lv_slider_set_left_value(slider, 20, LV_ANIM_OFF);    /* 设置左值 */
lv_slider_get_left_value(slider);                     /* 获取左值 */

2.3 实验小演示(亮度调节器)

设计一个亮度调节器。

lv_obj_t *label;
lv_obj_t *slider;

static void event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);    /* 获取触发事件类型 */

    if(code == LV_EVENT_VALUE_CHANGED)
    {
        uint8_t value = lv_slider_get_value(slider) * (255 - 55) * 0.01 + 55;
        lv_label_set_text_fmt(label, "%d%%", lv_slider_get_value(slider));

        /* 设置滑动条背景透明度 */
        lv_obj_set_style_bg_opa(slider, value, LV_PART_INDICATOR);
    }
}

void my_gui(void)
{
    /****************************标签*****************************/
    label = lv_label_create(lv_scr_act());          /* 创建标签 */
    lv_obj_align(label, LV_ALIGN_CENTER, 0, -150);  /* 调整标签位置 */
    lv_label_set_text(label, "0%");                 /* 设置标签文本 */

    /****************************滑动条*****************************/
    slider = lv_slider_create(lv_scr_act());        /* 创建滑动条 */
    lv_obj_center(slider);                          /* 调整滑动条位置 */

    lv_obj_set_size(slider, 20, 200);               /* 高度>宽度时,滑块为纵向 */
    lv_slider_set_value(slider, 0, LV_ANIM_OFF);    /* 设置当前值 */
    lv_slider_set_range(slider, 0, 100);            /* 设置范围值 */

    /* 修改滑动条背景颜色,绿色 */
    lv_obj_set_style_bg_color(slider, lv_color_hex(0x00ff00), LV_PART_INDICATOR);
    /* 设置滑动条背景透明度 */
    lv_obj_set_style_bg_opa(slider, 55, LV_PART_INDICATOR);
    /* 添加改变事件 */
    lv_obj_add_event_cb(slider, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

演示图片:
演示视频:LVGL滑动条:亮度调节器

2.4 实验小演示

设计一个左右可调的调节器。

lv_obj_t *label;
lv_obj_t *slider;

static void event_cb(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);    /* 获取触发事件类型 */

    if(code == LV_EVENT_VALUE_CHANGED)
    {
        lv_label_set_text_fmt(label, "%d - %d", lv_slider_get_left_value(slider), lv_slider_get_value(slider));
    }
}

void my_gui(void)
{
    /****************************标签*****************************/
    label = lv_label_create(lv_scr_act());              /* 创建标签 */
    lv_obj_align(label, LV_ALIGN_CENTER, 0, -30);       /* 调整标签位置 */
    lv_label_set_text(label, "20 - 50");                /* 设置标签文本 */

    /****************************滑动条*****************************/
    slider = lv_slider_create(lv_scr_act());            /* 创建滑动条 */
    lv_obj_center(slider);                              /* 调整滑动条位置 */

    lv_obj_set_size(slider, 400, 20);                   /* 高度<宽度时,滑块为横向 */
    lv_slider_set_value(slider, 50, LV_ANIM_OFF);       /* 设置当前值 */
    lv_slider_set_range(slider, 0, 100);                /* 设置范围值 */

    lv_slider_set_mode(slider, LV_SLIDER_MODE_RANGE);   /* 设置模式:范围 */
    lv_slider_set_left_value(slider, 20, LV_ANIM_OFF);  /* 设置左值 */

    /* 添加改变事件 */
    lv_obj_add_event_cb(slider, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

演示图片:
演示视频:LVGL滑动条:左右可调的调节器

三、LVGL 圆弧部件

圆弧部件以弧形滑动的形式来调节、显示某个参数的值。
角度和方向:零度位于对象的右侧(3 点钟方向),度数按顺时针方向递增。角度应在[0;360] 范围内。

效果图:

3.1 圆弧部件组成部分

背景弧LV_PART_MAIN
前景弧LV_PART_INDICATOR
旋钮LV_PART_KNOB

3.2 圆弧部件基本API

创建圆弧部件:

lv_obj_t *arc = lv_arc_create(parent);

设置范围值、当前值:

lv_arc_set_range(arc, 0, 200);    /* 设置范围值 */
lv_arc_set_value(arc, 80);        /* 设置当前值(需要在范围值之内) */

设置圆弧角度(不建议使用):

lv_arc_set_angles(arc, 135, 270);    /* 设置前景狐角度 */
lv_arc_set_bg_angles(arc, 135, 45);  /* 设置背景狐角度 */

设置旋转角度(顺时针旋转):

lv_arc_set_rotation(arc, 180);

获取当前值:

lv_arc_get_value(arc);
static void event_cb(lv_event_t *e)
{
    lv_obj_t *target = lv_event_get_target(e);
    printf("%d \n", lv_arc_get_value(target));
}

lv_obj_add_event_cb(arc,event_cb, LV_EVENT_VALUE_CHANGED, NULL);

设置模式、圆弧绘制速率:

lv_arc_set_mode(arc, LV_PART_MODE_REVERSE);    /* 设置模式 */
lv_arc_set_change_rate(arc, 90);               /* 绘制速率:90°/s */

3.3 实验小演示(调节器)

设计一个标签、滑动条和圆弧,三个部件进行同步。

lv_obj_t *label, *arc, *slider;

static void 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(obj == arc)
    {
        /* 滑动条设置当前值 */
        lv_slider_set_value(slider, lv_arc_get_value(arc), LV_ANIM_OFF);
        /* 同步标签文本 */
        lv_label_set_text_fmt(label, "%d%%", lv_arc_get_value(arc));
    }else{
        /* 设置当前值(需要在范围值之内) */
        lv_arc_set_value(arc, lv_slider_get_value(slider));
        /* 同步标签文本 */
        lv_label_set_text_fmt(label, "%d%%", lv_slider_get_value(slider));
    }
}

void my_gui(void)
{
    /****************************标签*****************************/
    label = lv_label_create(lv_scr_act());              /* 创建标签 */
    lv_obj_align(label, LV_ALIGN_CENTER, 0, -120);      /* 调整标签位置 */
    lv_label_set_text(label, "50%");                    /* 设置标签文本 */

    /****************************圆弧*******************************/
    arc = lv_arc_create(lv_scr_act());                  /* 创建圆弧部件 */
    lv_obj_center(arc);

    lv_arc_set_range(arc, 0, 100);                      /* 设置范围值 */
    lv_arc_set_value(arc, 50);                          /* 设置当前值(需要在范围值之内) */

    /* 添加改变事件 */
    lv_obj_add_event_cb(arc, event_cb, LV_EVENT_VALUE_CHANGED, NULL);

    /****************************滑动条*****************************/
    slider = lv_slider_create(lv_scr_act());            /* 创建滑动条 */
    lv_obj_align(slider, LV_ALIGN_CENTER, 0, -100);     /* 调整滑动条位置 */

    lv_obj_set_size(slider, 400, 10);                   /* 高度<宽度时,滑块为横向 */
    lv_slider_set_value(slider, 50, LV_ANIM_OFF);       /* 设置当前值 */
    lv_slider_set_range(slider, 0, 100);                /* 设置范围值 */

    /* 添加改变事件 */
    lv_obj_add_event_cb(slider, event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

演示图片:
演示视频:LVGL圆弧:同步标签、滑动条的调节器

3.4 实验小演示(动态加载)

设计一个正在加载中的页面。

lv_obj_t *arc;
uint8_t bar_value = 0;

static void timer_cb(lv_timer_t *timer)
{
    if(bar_value < 100)
    {
        bar_value++;                                /* 数值自增 */
        lv_arc_set_value(arc, bar_value);           /* 设置当前值(需要在范围值之内) */
    }
}


void my_gui(void)
{
    /****************************圆弧*******************************/
    arc = lv_arc_create(lv_scr_act());              /* 创建圆弧部件 */
    lv_obj_center(arc);

    lv_arc_set_rotation(arc, 270);                  /* 设置旋转角度(顺时针旋转) */
    lv_arc_set_bg_angles(arc, 0, 360);              /* 设置背景狐角度 */

    lv_obj_remove_style(arc, NULL, LV_PART_KNOB);   /* 移除旋钮 */
    lv_obj_remove_flag(arc, LV_OBJ_FLAG_CLICKABLE); /* 使对象不可点击 */

    lv_arc_set_range(arc, 0, 100);                  /* 设置范围值 */
    lv_arc_set_value(arc, bar_value);               /* 设置当前值(需要在范围值之内) */

    /***************************定时器***************************/
    lv_timer_create(timer_cb, 100, NULL);           /* 初始化定时器 */
}

图片分析代码:
演示视频:LVGL圆弧:动态加载(正在加载中)

总结

在本篇中,主要对滑动的部件进行了一个归纳,分别对滑轮、滑动条、圆弧设计了几个市面上通用的模型小实验,方便用户开发时进行复制粘贴。