17. 进度条部件

一、进度条部件

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

进度条的组成部分

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

lv_obj_t * lv_bar_create(lv_obj_t * parent);                                        // 创建进度条部件

void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim);        // 设置进度条部件的当前值
int32_t lv_bar_get_value(const lv_obj_t * obj);                                     // 获取进度条部件的当前值

void lv_bar_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim);  // 设置进度条部件的起始值
int32_t lv_bar_get_start_value(const lv_obj_t * obj);                               // 获取进度条部件的起始值

void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max);                    //设置进度条部件的范围

int32_t lv_bar_get_min_value(const lv_obj_t * obj);                                 // 获取进度条部件的最小值
int32_t lv_bar_get_max_value(const lv_obj_t * obj);                                 // 获取进度条部件的最大值

void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode);                           // 设置进度条部件的模式
lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj);                                      // 获取进度条部件的模式

  用户可以通过 lv_bar_create() 函数 创建进度条部件

/**
 * @brief 创建进度条部件
 * 
 * @param parent 指向父部件的指针
 * @return lv_obj_t* 指向进度条部件的指针
 */
lv_obj_t * lv_bar_create(lv_obj_t * parent);

  在创建完进度条部件后,我们可以通过 lv_obj_set_size() 函数 设置部件的尺寸,来决定进度条是水平进度条还是垂直进度条。当进度条的 宽度大于高度 时,进度条为 水平进度条,当进度条的 高度大于宽度 时,进度条为 垂直进度条

/**
 * @brief 设置部件的尺寸
 * 
 * @param obj 指向部件的指针
 * @param w 要设置的宽度值
 * @param h 要设置的高度值
 */
void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h);

  我们可以通过 lv_bar_set_start_value() 函数 设置新的起始值

/**
 * @brief 设置进度条部件新的起始值
 * 
 * @param obj 指向进度条部件的指针
 * @param value 起始值
 * @param anim LV_ANIM_ON: 开启动画; LV_ANIM_OFF: 不开启动画
 */
void lv_bar_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim);

  我们还可以通过 lv_bar_set_range() 函数 设置进度条范围

/**
 * @brief 设置进度条部件范围
 * 
 * @param obj 指向进度条部件的指针
 * @param min 最小值
 * @param max 最大值
 */
void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max);

  我们还可以通过 lv_bar_set_mode() 函数 设置进度条模式

/**
 * @brief 设置进度条部件的模式
 * 
 * @param obj 指向进度条部件的指针
 * @param mode 进度条模式
 */
void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode);

  当我们使用 lv_bar_set_mode() 函数 设置进度条模式 时,有以下几种可选值:

enum _lv_bar_mode_t 
{
    LV_BAR_MODE_NORMAL,             // 默认模式
    LV_BAR_MODE_SYMMETRICAL,        // 从零值绘制到当前值,当前值可以小于0
    LV_BAR_MODE_RANGE               // 允许设置起始值,但起始值必须小于当前值
};

当进度条的 宽度大于高度 时,进度条为 水平进度条,当进度条的 高度大于宽度 时,进度条为 垂直进度条

动画事件指的是旧值刷新到新值的绘制时间,并不是现实中当前值变化所需的时间,并且动画时间设置必须放在当前值设置之前,否则看不到动画效果。

二、实验例程

#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"

int main(void)
{
    HAL_Init();
    System_Clock_Init(8, 336, 2, 7);
    Delay_Init(168);

    SPI_Simulate_Init();
    // SRAM_Init();
    TIM_Base_Init(&g_tim6_handle, TIM6, 83, 999);
    __HAL_TIM_CLEAR_IT(&g_tim6_handle, TIM_IT_UPDATE);                          // 清除更新中断标志位
    HAL_TIM_Base_Start_IT(&g_tim6_handle);                                      // 使能更新中断,并启动计数器

    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();

    // 测试代码
    lv_obj_t *progressBar = lv_bar_create(lv_scr_act());                        // 创建进度条部件

    lv_obj_set_align(progressBar, LV_ALIGN_CENTER);                             // 设置进度条部件居中对齐
  
    // 当进度条的宽度大于高度时,进度条为水平进度条,当进度条的高度大于宽度时,进度条为垂直进度条
    lv_obj_set_size(progressBar, 30, 370);                                      // 设置进度条部件的尺寸

    lv_bar_set_range(progressBar, -100, 100);                                   // 设置进度条部件的范围

    // 动画时间设置必须放在当前值设置之前
    lv_obj_set_style_anim_time(progressBar, 500, LV_STATE_DEFAULT);             // 设置进度条部件的动画时间
    lv_bar_set_value(progressBar, 30, LV_ANIM_ON);                              // 设置进度条部件的当前值

    lv_bar_set_mode(progressBar, LV_BAR_MODE_SYMMETRICAL);                      // 设置进度条部件的模式从0值开始到当前值

    while (1)
    {
        lv_timer_handler();
        Delay_ms(5);
    }
  
    return 0;
}
posted @ 2024-06-25 22:12  星光映梦  阅读(26)  评论(0编辑  收藏  举报