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;
}