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;
}
posted @ 2024-08-29 22:00  星光樱梦  阅读(2)  评论(0编辑  收藏  举报