33. 动画图像部件
一、动画图象部件
动画图像相当于图片部件的一种延伸,它拥有多个图片源,这些图片经过一定顺序的展现后,就会形成动画的效果。动画图像部件只有一个组成部分:主体背景(LV_PART_MAIN
)。
动画图像的实现原理很简单:将多张连贯的照片按顺序展现。在 LVGL 动画图像部件中,使用图像源的数组形式来提供这些连贯图片,从理论上讲,我们只需要按顺序遍历这个图像源数组,就可以使里面的图片以动画的形式播放。
LVGL 官方提供了一些与动画图像部件相关 API。
lv_obj_t * lv_animimg_create(lv_obj_t * parent); // 创建动画图像部件
void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], size_t num); // 设置图像源
void lv_animimg_start(lv_obj_t * obj); // 开启动画图像
void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration); // 设置动画图像的时间
void lv_animimg_set_repeat_count(lv_obj_t * obj, uint32_t count); // 设置动画图像重复次数
我们可以使用 lv_animimg_create()
函数 创建动画图像对象。
/**
* @brief 创建动画图像部件
*
* @param parent 指向父部件的指针
* @return lv_obj_t* 指向动画图像部件的指针
*/
lv_obj_t * lv_animimg_create(lv_obj_t * parent);
创建完动画图像部件之后,我们可以使用 lv_animimg_set_src()
函数 设置动画图像的图像源。
/**
* @brief 设置图像源
*
* @param obj 指向动画图像部件的指针
* @param dsc 图像描述符数组
* @param num 图像源数量
*/
void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], size_t num);
然后,我们可以调用 lv_animimg_start()
函数 开启动画图像。
/**
* @brief 开启动画图像
*
* @param obj 指向动画图像部件的指针
*/
void lv_animimg_start(lv_obj_t * obj);
我们还可以通过 lv_animimg_set_duration()
函数 设置动画图像时间。
/**
* @brief 设置动画图像的时间
*
* @param obj 指向动画图像部件的指针
* @param duration 动画图像时间
*/
void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration);
我们还可以通过 lv_animimg_set_repeat_count()
函数 设置动画图像重复次数。
/**
* @brief 设置动画图像重复次数
*
* @param obj 执行动画图像部件的指针
* @param count 重复的次数
*/
void lv_animimg_set_repeat_count(lv_obj_t * obj, uint32_t count);
二、实验例程
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"
LV_IMAGE_DECLARE(image_01);
LV_IMAGE_DECLARE(image_02);
LV_IMAGE_DECLARE(image_03);
static const lv_image_dsc_t *anim_imgs[] = { &image_01, &image_02, &image_03, };
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 *anime_image = lv_animimg_create(lv_scr_act()); // 创建动画图像部件
lv_obj_center(anime_image); // 动画图像部件居中对齐
lv_animimg_set_src(anime_image, (const void **)anim_imgs, 3); // 设置动画图像部件的源图像
lv_animimg_set_duration(anime_image, 1000); // 设置动画持续时间
lv_animimg_set_repeat_count(anime_image, LV_ANIM_REPEAT_INFINITE); // 设置动画重复次数
lv_animimg_start(anime_image); // 启动动画图像部件
while (1)
{
lv_timer_handler();
Delay_ms(5);
}
return 0;
}