ITPub博客

首页 > 嵌入式/内核开发 > 嵌入式/内核开发 > 《LVGL开发指南 V1.0(G4电机开发板专用)》第九章 进度条部件(lv_bar)

《LVGL开发指南 V1.0(G4电机开发板专用)》第九章 进度条部件(lv_bar)

原创 嵌入式/内核开发 作者:正点原子 时间:2026-05-25 10:04:41 0 删除 编辑

第九章 进度条部件(lv_bar)


       进度条的功能较为简单,它一般被用作参数指示器或者进度指示器。

       本章节将分为以下几个小节:

       9.1 进度条部件的组成

       9.2 进度条部件的相关知识

       9.3 进度条部件的API函数

       9.4 进度条部件的实验


        9.1 进度条部件的组成

       进度条(lv_bar)部件由两个部分组成:背景和指示器,示意图如下:


图9.1.1 进度条的组成部分


       各组成部分的相关枚举和作用如下所示:

       ① 背景(LV_PART_MAIN):用于显示范围值;

       ② 指示器(LV_PART_INDICATOR):用于显示当前值;

       关于部件样式设置的内容,请大家参考6.4.4章节。


        9.2 进度条部件的相关知识


       9.2.1 进度条的方向

       进度条可以设置为水平或者垂直方向,当它的宽度小于高度时,其为水平方向,反之为垂直方向。


       9.2.2 进度条的当前值和范围值

       进度条当前值指的是当前指示器所指示的值,范围值是指进度条当前值的可变化范围,用户需要设置这两个参数,可以调用以下函数:

lv_bar_set_range(bar, min, max);      /* 设置进度条部件范围 */
lv_bar_set_value(bar, new_value, LV_ANIM_ON/OFF); /* 设置进度条当前值 */

       上述的当前值设置函数的最后一个形参代表是否使用动画,如果使用动画请传入LV_ANIM_ON,否则传入LV_ANIM_OFF。

       注意:在默认情况下,范围值为0~100,进度条都是从该范围的最小值开始绘制的。

       接下来,我们以简单示例来帮助大家理解当前值和范围值,示例代码如下所示:

void lv_mainstart(void)
{
    lv_obj_t* lv_bar1 = lv_bar_create(lv_scr_act());   /* 创建进度条 */
lv_obj_set_style_bg_color(lv_bar1, lv_color_black(),
LV_PART_MAIN|LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(lv_bar1, lv_palette_main(LV_PALETTE_RED),
LV_PART_INDICATOR |LV_STATE_DEFAULT);
    lv_obj_set_size(lv_bar1, 100, 20);                  /* 设置进度条的大小 */
    lv_obj_align(lv_bar1, LV_ALIGN_CENTER, 0, 0);        /* 设置对齐模式 */
    lv_bar_set_range(lv_bar1, 0, 100);
    lv_bar_set_value(lv_bar1, 100, LV_ANIM_OFF);        /* 设置进度条的值 */
 
 
    lv_obj_t* lv_bar2 = lv_bar_create(lv_scr_act());   /* 创建进度条 */
    lv_obj_set_style_bg_color(lv_bar2, lv_color_black(),LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(lv_bar2, lv_palette_main(LV_PALETTE_BLUE),
LV_STATE_DEFAULT);
    lv_obj_set_size(lv_bar2, 20, 100);      /* 设置进度条的大小 */
    /* 设置对齐模式 */
    lv_obj_align_to(lv_bar2, lv_bar1, LV_ALIGN_OUT_BOTTOM_MID, 0, 20);
lv_bar_set_range(lv_bar2, 0, 100); 
/* 填充满的时间 */
    lv_obj_set_style_anim_time(lv_bar2, 5000, LV_STATE_DEFAULT);
    lv_bar_set_value(lv_bar2, 100, LV_ANIM_ON);       /* 设置进度条当前值 */
}

       在上述源码中,我们分别创建了两个进度条,将lv_bar1进度条设置为垂直进度条,不使用动画;lv_bar2进度条则设置为水平进度条且开启动画,动画时间为5秒。在实际运行时,lv_bar2进度条需要5秒才能填充完毕,而lv_bar1进度条则是瞬间填充完毕。示例代码可以在PC模拟器中运行,效果图如下所示:


图9.2.2.1 示例代码效果图


       注意:设置动画时间的函数(lv_obj_set_style_anim_time)必须在lv_bar_set_value函数之前调用,否则不会出现效果。


       9.2.3 进度条模式

       进度条部件具有三种模式,它们对应的枚举如下所示:

       ① LV_BAR_MODE_NORMAL:普通模式(默认);

       ② LV_BAR_MODE_SYMMETRICAL:始终从零开始绘制,范围值可以是负数;

       ③ LV_BAR_MODE_RANGE:允许设置起始值,该起始值必须始终小于结束值。

       接下来,我们结合源码,给大家重点介绍LV_BAR_MODE_SYMMETRICAL模式的使用,示例代码如下所示:

void lv_mainstart(void)
{
    lv_obj_t* bar = lv_bar_create(lv_scr_act());     /* 创建 bar 部件 */
lv_obj_center(bar);
    lv_obj_set_style_bg_color(bar, lv_color_black(), LV_STATE_DEFAULT);
lv_obj_set_style_bg_color(bar, lv_palette_main(LV_PALETTE_BLUE),
LV_STATE_DEFAULT);
    lv_bar_set_mode(bar, LV_BAR_MODE_SYMMETRICAL);    /* 设置模式 */
    lv_bar_set_range(bar, -100, 100);              /* 设置范围值 */
    lv_obj_set_style_anim_time(bar, 5000, LV_STATE_DEFAULT);  /* 设置动画时间 */
    lv_bar_set_value(bar, 100, LV_ANIM_ON);           /* 设置当前值*/
}

       在上述源码中,我们把进度条的范围值设置为-100~100,并使用LV_BAR_MODE_SYMMETRICAL模式,此时,进度条始终从0开始绘制,直至当前值处停止。示例代码可以在PC模拟器中运行,效果图如下所示:


图9.2.3.1 LV_BAR_MODE_SYMMETRICAL模式示例


       在上述的示例源码中,如果我们不设置进度条的模式(默认),效果图如下所示:


图9.2.3.2默认模式


       9.2.4 进度条事件

       LV_BAR_DRAW_PART_INDICATOR:绘制指示器。


        9.3 进度条部件的API函数

       LVGL官方提供了一些与进度条部件相关API,如下表所示:


表9.3.1 进度条相关的API函数


       接下来,我们介绍LVGL进度条部件常用的API函数:

       1.lv_bar_create函数

       创建进度条对象,其函数原型如下所示:

lv_obj_t *lv_bar_create(lv_obj_t *parent);

       该函数的形参,如表9.3.2所示:


表9.3.2 lv_bar_create函数形参描述


       返回值:返回对象控制块。

       2.lv_bar_set_value函数

       在进度条设置新值,其函数原型如下所示:

void lv_bar_set_value(lv_obj_t *obj, int32_t value, lv_anim_enable_t anim);

       该函数的形参,如表9.3.3所示:


表9.3.3 lv_bar_set_value函数形参描述


       返回值:无。

       3.lv_bar_set_start_value函数

       在进度条设置新的起始值,其函数原型如下所示:

void lv_bar_set_start_value(lv_obj_t *obj, int32_t start_value, 
lv_anim_enable_t anim);

       该函数的形参,如表9.3.4所示:


表9.3.4 lv_bar_set_start_value函数形参描述


       返回值:无。

       4.lv_bar_set_range函数

       设置进度条范围值,其函数原型如下所示:

void lv_bar_set_range(lv_obj_t *obj, int32_t min, int32_t max);

       该函数的形参,如表9.3.5所示:


表9.3.5 lv_bar_set_range函数形参描述


       返回值:无。

       5.lv_bar_set_mode函数

       设置进度条模式,其函数原型如下所示:

void lv_bar_set_mode(lv_obj_t *obj, lv_bar_mode_t mode);

       该函数的形参,如表9.3.6所示:


表9.3.6 lv_bar_set_mode函数形参描述


       返回值:无。


        9.4 进度条部件的实验


       9.4.1 硬件设计


       1. 例程功能

       本实验主要测试进度条部件API函数的使用,实验现象:开机后,屏幕上显示一个进度条,当它加载到100%会提示finished。与此同时,LED0闪烁,提示系统正在运行。

       该实验的完整源码,请参考《LVGL例程6 bar(进度条)》例程,路径:A盘→4,程序源码 →3,扩展例程 → 3,LVGL例程。


       9.4.2 软件设计


       9.4.2.1 程序流程图

       本实验的程序流程图,如下图9.4.2.1.1所示:


图9.4.2.1.1 进度条部件实验流程图


       9.4.2.2 程序解析

       关于LVGL的用户代码,我们都是在lv_mainstart.c文件中编写的,本实验的源码如下所示:

/**************************** 第一部分 开始 ****************************/
/**
 * @brief  LVGL演示
 * @param  无
 * @return 无
 */
void lv_mainstart(void)
{
    lv_example_label();           /* 加载提示标签 */
    lv_example_bar();             /* 加载进度条 */
}
/**************************** 第一部分 结束 ****************************/
/**************************** 第二部分 开始 ****************************/
/**
 * @brief  加载提示标签
 * @param  无
 * @return 无
 */
static void lv_example_label(void)
{
    /* 加载标题标签 */
    label_load = lv_label_create(lv_scr_act());
    lv_label_set_text(label_load, "LOADING...");
    lv_obj_set_style_text_font(label_load, &lv_font_montserrat_22, 0);
    lv_obj_align(label_load, LV_ALIGN_CENTER, 0, -scr_act_height() / 10 );
    /* 百分比标签 */
    label_per = lv_label_create(lv_scr_act());
    lv_label_set_text(label_per, "%0");
    lv_obj_set_style_text_font(label_per, &lv_font_montserrat_22, 0);
    lv_obj_align(label_per, LV_ALIGN_CENTER, 0, scr_act_height() / 10 );
}
/**************************** 第二部分 结束 ****************************/
/**************************** 第三部分 开始 ****************************/
/**
 * @brief  定时器回调
 * @param  *timer :该定时器相关的数据
 * @return 无
 */
static void timer_cb(lv_timer_t *timer)
{
    if(val < 100)                                    /* 当前值小于100 */
    {
        val ++;
        lv_bar_set_value(bar, val, LV_ANIM_ON);      /* 设置当前值 */
/* 获取当前值,更新显示 */
        lv_label_set_text_fmt(label_per, "%d %%", lv_bar_get_value(bar));   
    }else               /* 当前值大于等于100 */
    {
        lv_label_set_text(label_per, "finished!");   /* 加载完成 */
    }
}
 
/**
 * @brief  加载进度条
 * @param  无
 * @return 无
 */
static void lv_example_bar(void)
{
    bar = lv_bar_create(lv_scr_act());                     /* 创建进度条 */
    lv_obj_set_align(bar, LV_ALIGN_CENTER);                /* 设置位置 */
    lv_obj_set_size(bar, scr_act_width() * 4 / 5, 15);     /* 设置大小 */
    lv_obj_set_style_anim_time(bar, 100, LV_STATE_DEFAULT);   /* 设置动画时间 */
    lv_timer_create(timer_cb, 100, NULL);                  /* 初始化定时器 */
}
/**************************** 第三部分 结束 ****************************/

       上述源码可分为以下三个部分:

       ① lv_mainstart接口函数。在该函数中,我们调用了标签和进度条示例函数;

       ② 百分比标签实现。我们创建标题标签和百分比标签,然后设置相应的文本内容、位置。

       ③ 进度条动画实现。我们先创建进度条部件和定时器,设置每100ms触发一次定时器回调,然后在定时器回调中修改进度条的当前值,如果当前值大于等于100,则显示“finished!”。


       9.4.3 下载验证

       把工程编译并下载到我们的开发板中,运行效果如图9.4.3.1所示:


图9.4.3.1 进度条实验


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3172027/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-30

  • 博文量
    588
  • 访问量
    764146