场景动画

1. 简介

场景动画体系主要包含开关机动画和切换动画两大核心模块,覆盖设备开机、关机、低电压充电等系统级场景, 以及应用 / 页面切换的交互级场景,支持自定义替换、灵活配置,适配不同分辨率与应用需求。

2. 开关机动画

Solution支持通过资源替换或接口配置两种方式自定义开关机动画,涵盖开机、关机、低电压、充电等多场景动画,适配不同分辨率与应用需求。

2.1. 自定义开关机动画

2.1.1 资源路径规范

开关机动画资源需按分辨率分类存放,默认路径为:resource/images/power_on/[目标分辨率目录]/

例如 410x494 分辨率的开机动画需放入 power_on/410x494/ 目录下。

2.1.2 支持资源类型

开关机动画资源可以支持如下几种类型:

  1. 单独一张图片,如png或jpg

  2. png的序列帧,遵循序列帧规则

  3. gif

2.1.3 接口说明

2.1.3.1 启动动画接口(app_pm_anim_open)
  • app_pm_anim_open 接口用于启动播放开关机、低电压充电、低电提示等 PM 动画。

  • 调用该接口后会创建高优先级动画线程,默认每 30 ms 刷新一次动画。调用方必须在 lv_tasklv_timer 任务中调用,并在后续调用 app_pm_anim_close 等待动画播放结束,避免界面刷新函数重入。

  • play_time 为动画总播放时长,单位 ms:

    • play_time 到达设置时长时,动画会立即退出;

    • 当动画在 play_time 到达前已播放完成,会从头循环播放,直到达到 play_time

    • play_time 设置为 0 时,动画只播放一次,播放完成后停止。

/**
 *  This function use to playing the pm animation. such as power on, power off, charging, low_voltage charged.
 *  Note:
 *  When calling this function, it must be in the task of lv_task (or lv_timer) and must be blocked by pm_anim_close,
 *  as this function starts a high priority thread and plays animations every 30ms (adjustable).
 *  The function that plays animations directly calls the refresh function.
 *  If not blocked, the refresh function will experience reentry, leading to unpredictable consequences.
 *  @param  anim_type pm_anim_type_t.
 *  @param  play_time The playing time of the animation.
 *                    After the animation starts playing, the play_time is used as the timeout standard.
 *                    If the duration set by play_time is reached during the animation playback, the playback will exit immediately.
 *                    If the animation finishes playing within the play_time duration,
 *                    it will restart from the beginning and loop in this way until the play_time duration is reached and then exit.
 *                    If play_time is set to 0, the animation will only play once and stop directly after the playback is completed.
 *  @retval rt_err_t RT_EOK or RT_ERROR.
 */
int app_pm_anim_open(pm_anim_type_t anim_type, uint32_t play_time)
  • 动画类型枚举定义(定义位置:solution/framework/service/srv_app/pm/app_pm.h

typedef enum
{
    POWER_ON_ANIM,              /**< power on animation when power on                                           */
    POWER_OFF_ANIM,             /**< power off animation when power off                                         */
    LOW_VOLT_CHARGING_ANIM,     /**< charging animation icon of low voltage                                     */
    LOW_VOLT_NOTIFY_ANIM,       /**< notification(event) animation icon when low voltage satified               */
    PM_ANIM_TYPE_NUM,           /**< Place it at the end of anim_type to indicate the number of animation types.*/
} pm_anim_type_t;
2.1.3.2 结束动画接口(app_pm_anim_close)

app_pm_anim_close 接口用于阻塞当前 lv_tasklv_timer 任务,等待动画播放结束并释放动画资源。open_lcd 仅用于开机低电提示动画场景,只有在充电后电量满足开机条件时才设置为 true

/**
 *  Block the current lv_task (or lv_timer) task and wait for the animation to finish playing.
 *  @param  open_lcd It is only for playing the animation of the low battery reminder during boot.
 *                   It will be set to true only when the charged battery level meets the boot scenario conditions.
 */
int app_pm_anim_close(bool open_lcd)

2.1.4 资源与代码关联

默认动画资源通过anim_default_img数组与pm_anim_type_t枚举关联,数组元素顺序需与枚举值顺序严格一致。

static const anim_img_t anim_default_img[PM_ANIM_TYPE_NUM] =
{
#ifdef PM_ANIM_ENABLE
    {(lv_img_dsc_t *) APP_GET_GIF(gif_power_on),        0, 30},
    {(lv_img_dsc_t *) APP_GET_GIF(gif_power_off),       0, 30},
    {(lv_img_dsc_t *) APP_GET_GIF(gif_charging),        0, 30},
    {(lv_img_dsc_t *) APP_GET_GIF(gif_charge_flash),    0, 30}
#else
    0
#endif
};

2.2. 动画替换方法

支持两种替换方式:直接替换资源文件(简单场景)、通过接口配置资源(灵活场景)。

2.2.1 直接替换资源文件

  • 准备目标 资源,保持文件名与原资源一致(如替换开机动画需命名为gif_power_on.gif);

  • 将资源放入对应分辨率的power_on目录下,覆盖原文件即可;

  • 重新编译工程,动画会自动加载新资源。

2.2.2 接口配置资源替换

通过app_pm_anim_set_resource接口自定义动画资源(支持 JPG 等静态资源循环播放),需在gui_thread_entry运行前初始化。

2.2.2.1 步骤 1:定义动画资源结构
// 示例:将开机动画替换为welcome.jpg,播放300ms
static anim_img_t pm_anim_fn[] =
{
    {APP_GET_JPG(welcome), 300, 0, 1},  // 资源句柄、单帧时长、循环次数、外部资源
};
2.2.2.1 步骤 2:初始化资源配置

根据应用类型选择初始化方式,确保在 GUI 线程启动前执行:

2.2.2.1.1 场景 1:动态应用(外置应用)

使用DLMODULE_INIT_DEF初始化:

static void xxx_init(void)
{
    // 设置动画资源
    app_pm_anim_set_resource((anim_img_t *)pm_anim_fn, sizeof(pm_anim_fn) / sizeof(anim_img_t));
    epbub_decoder_img_init();  // 图像解码器初始化
    LOG_I("%s", __func__);
}

/* 必须在gui_thread_entry运行前初始化 */
#ifdef BSP_USING_PC_SIMULATOR
    INIT_PRE_APP_EXPORT(xxx_init);
#else
    DLMODULE_INIT_DEF(xxx_init);
#endif
2.2.2.1.2 场景 2:内置应用 / 系统模块

使用INIT_PRE_APP_EXPORT初始化:

static void reader_init(void)
{
    app_pm_anim_set_resource((anim_img_t *)pm_anim_fn, sizeof(pm_anim_fn) / sizeof(anim_img_t));
    epbub_decoder_img_init();
    LOG_I("%s", __func__);
}

/* 必须在gui_thread_entry运行前初始化 */
INIT_PRE_APP_EXPORT(reader_init);

2.3. 动画播放完成如何跳转默认应用

开机动画播放结束后,系统会调用app_get_poweron_app函数获取默认应用,根据开机类型(恢复出厂开机 / 正常重启)的不同,跳转逻辑存在差异,可按需修改目标应用。

2.3.1 恢复出厂设置重开机

流程:开机动画 → 开机向导应用 → 跳转默认应用; 说明:首次开机或恢复出厂设置重开机触发,需完成开机向导(如语言设置、网络配置)后才进入目标应用。

2.3.2 正常重启开机

  • 首先根据app_get_reg_power_on_app获取开机跳转默认应用;

  • 如果不存在,则试图获取"Main"应用

2.3.3 修改默认跳转应用

  1. 修改函数void app_get_poweron_app(void)的开机逻辑

  2. 通过app_set_reg_power_on_app设置新的跳转默认应用。参考如何调整开机后默认启动的应用

3. 充电动画

  • 充电动画是指设备在充电状态下开机时,系统会实时检测当前电池电压,若电压值低于预设阈值,将自动启动充电动画页面并循环播放;该机制会阻止开机程序继续运行,有效规避因低电量强制开机所引发的各类系统运行异常

  • 充电动画的操作接口及资源配置规则与开关机动画完全一致,相关配置说明详情参考:开关机动画

  • 功能实现核心接口如下:

/**
 * @brief  启动低电压充电动画播放
 * @param  LOW_VOLT_CHARGING_ANIM  充电动画类型枚举值
 * @param  2000                    动画播放时长,单位:毫秒(ms)
 * @note   充电动画播放2秒后,设备将自动进入休眠状态,直至电量充至开机阈值
 */
app_pm_anim_open(LOW_VOLT_CHARGING_ANIM, 2000);

4. 低电警示动画

  • 低电警示动画是指设备在无充电状态下开机时,系统会实时检测当前电池电压,若电压值低于预设阈值,将自动启动低电警示动画页面并播放;该机制会阻止开机程序继续运行,有效规避因低电量强制开机所引发的各类系统运行异常

  • 低电警示动画的操作接口及资源配置规则与开关机动画完全一致,相关配置说明详情参考:开关机动画

  • 功能实现核心接口如下:

/**
 * @brief  启动低电压警示动画播放
 * @param  LOW_VOLT_NOTIFY_ANIM  低电警示动画类型枚举值
 * @param  5000                  动画播放时长,单位:毫秒(ms)
 * @note   低电警示动画播放5秒后,系统将检测当前充电状态,未充电则自动执行关机保护;已充电则切换至充电动画流程
 */
app_pm_anim_open(LOW_VOLT_NOTIFY_ANIM, 5000);

5. 界面切换动画

5.1 支持的动画类型

  1. 系统内置多种页面切换动画类型,可按需选择配置,枚举定义如下(定义位置:sdk/middleware/lvgl/lvsf/lvsf_switchanim.h):

enum
{
    LV_SWITCHANIM_NONE = 0,             //无动画
    LV_SWITCHANIM_PUSH,                 //右滑动画
    LV_SWITCHANIM_ZOOM,                 //缩放动画
    LV_SWITCHANIM_MASK,                 //mask动画
    LV_SWITCHANIM_SPLIT,                //分块动画
    LV_SWITCHANIM_TURN_AXIS,            //转轴动画
    LV_SWITCHANIM_TURN_3D,              //3D翻转动画
    LV_SWITCHANIM_TURN_HALF,            //翻页动画
    LV_SWITCHANIM_TURN_SWITCH,          //切换动画
    LV_SWITCHANIM_TURN_BOOK,            //翻书动画
    LV_SWITCHANIM_SHUTTLE,              //穿梭动画
    LV_SWITCHANIM_SHUTTER,              //百叶窗动画
    LV_SWITCHANIM_DEFAULT = 0xff
};

//上述为系统内置的标准切换动画,包含:右滑动画、缩放动画、渐隐动画、分块动画、转轴动画、3D 翻转动画、翻页动画等。

右滑退出

fishy

缩放动画

fishy

渐隐动画

fishy

转轴动画

fishy

3D翻转动画

fishy

翻页动画画

fishy
  1. 应用在使用上述内置动画作为页面切换动画时,调用以下接口进行配置即可:

/**
 * @brief  设置页面进入时的切换动画类型
 * @param  major      动画主ID,对应动画大类枚举值
 * @param  minor      动画次ID,二级分类(例:3D翻转区分水平/垂直方向)
 * @param  minor_aux  动画匹配副ID,优先级高的动画会覆盖优先级低的动画配置,保证进出动画匹配
 */
void gui_app_set_enter_anim_type(uint16_t major, uint16_t minor, int16_t minor_aux);

/**
 * @brief  设置页面退出时的切换动画类型
 * @param  major      动画主ID,对应动画大类枚举值
 * @param  minor      动画次ID,二级分类
 * @param  minor_aux  动画匹配副ID,参数规则与进入动画一致
 */
void gui_app_set_exit_anim_type(uint16_t major, uint16_t minor, int16_t minor_aux);

5.2 添加自定义动画

系统提供 ‘BUILTIN_ANIMATION’ 注册接口,用于添加自定义切换动画,核心功能为注册自定义动画类型及对应的动画进度回调函数,实现自定义的切换动效,以默认动画为例说明完整添加流程:

/**
 * @brief  自定义动画进度回调函数
 * @param  baseanim   进出场动画数据句柄,包含动画相关配置参数
 * @param  anim_obj   动画载体对象(页面截图对象)
 * @param  progress   动画进度值,用于控制动画执行过程
 * @note   根据进度值处理图片的坐标、透明度、形变等操作,实现自定义动画效果
 */
void lv_baseanim_progress_default(lv_baseanim_t *baseanim, lv_obj_t *anim_obj, int32_t progress)
{
    if (LV_BASEANIM_EXIT_TYPE == lv_baseanim_get_type(baseanim))
    {
        lv_coord_t pos = ((LV_HOR_RES_MAX * progress) >> 10);
        lv_coord_t opa = LV_OPA_COVER - ((progress * LV_OPA_COVER) >> 10);
        lv_obj_align_to(anim_obj, NULL, LV_ALIGN_CENTER, pos, 0);
        lv_obj_set_style_img_opa(anim_obj, opa, 0);
    }
}
/**
 * @brief  注册自定义动画到系统动画框架
 * @param  pushanim            自定义动画名称
 * @param  LV_SWITCHANIM_PUSH  自定义动画对应的主ID枚举值
 * @param  lv_baseanim_progress_default  绑定的动画进度回调函数
 * @note   所有动画的主ID序列号不可重复,配置时通过序列号匹配对应动画类型
 */
BUILTIN_ANIMATION(pushanim, LV_SWITCHANIM_PUSH, lv_baseanim_progress_default);

5.3 配置页面进出动画

页面的进出场动画配置,统一在页面初始化函数 ‘on_start()’ 中完成,可配置动画类型及动画优先级,未配置时使用系统默认动画及默认优先级(默认优先级为最低)

/**
 * @brief  页面初始化函数
 * @note   页面进出场动画、优先级配置,均在此函数中完成
 */
void on_start()
{
    // 配置页面进入/退出的动画类型为3D水平翻转
    gui_app_set_enter_anim_type(LV_SWITCHANIM_TURN_3D, LV_TURN3D_HOR, LV_TURN3D_HOR);
    gui_app_set_exit_anim_type(LV_SWITCHANIM_TURN_3D, LV_TURN3D_HOR, LV_TURN3D_HOR);
    // 配置动画优先级为低优先级
    gui_app_set_anim_prior(LV_SWITCHANIM_PRIOR_LOW, LV_SWITCHANIM_PRIOR_LOW);
    // 其他页面初始化逻辑...
}

5.4 临时关闭页面进出动画

当应用页面切换的动画效果(如 3D 翻页、滑动等)已开启时,默认会在页面跳转时展示动效。但部分场景下(例如连续启动两个页面,需跳过中间页面的过渡动画),可通过指定方式临时关闭动画,不影响全局动画配置。

  1. 操作方法

  • 在调用页面创建接口(如 ‘gui_app_create_page’ 或 'gui_app_create_page_for_app)'后,立即调用以下函数,即可取消当前页面切换的动画过程:

void gui_app_exec_now(void);
  1. 实现原理

  • 页面创建接口默认采用异步方式实现,通过 ‘send_msg_to_gui_app_task’ 发送消息触发页面创建,因此会自然触发预设的切换动画;

  • ‘gui_app_exec_now’ 函数会强制同步执行页面创建流程,并在内部调用’app_schedule_enable_trans_anim(false)’ 临时关闭动画开关,从而跳过中间过渡效果

  1. 适用场景

  • 多级页面连续跳转时,避免中间页面的过渡动画,提升操作流畅度;

  • 需要快速响应的交互场景,保留正常场景下的动画体验,按需关闭多余动效。

  1. 注意事项

  • 该方法仅对当前单次页面切换的动画效果生效,不会全局关闭动画配置;

  • 正常场景下的页面切换,仍然会展示预设的动画效果。

6. 平铺卡片切换动画

6.1. 配置平铺卡片切换动画

平铺卡片的动画配置分为两大核心内容:平铺滑动模式配置、平铺切换动画配置,两项配置相互独立,可按需组合使用。

6.1.1 平铺滑动模式

平铺滑动模式,用于配置卡片滑动至左右两端后的交互逻辑,系统共提供 4 种标准模式,每种模式对应不同的业务场景:

  • 循环模式:卡片列表首尾相连,滑动至两端后可无缝循环切换至另一侧应用;

  • 回弹模式:滑动到两端后触发弹性回弹效果,停留在当前边界,不会切换到下一个应用;

  • 侧边栏模式:滑动至两端后,可触发打开侧边栏配置页面的交互逻辑;

  • 菜单模式:滑动至两端后,自动跳转至系统主菜单页面。

6.1.2 平铺切换动画

平铺切换动画,用于配置平铺卡片之间的切换动效,系统内置多种标准动画类型,枚举定义如下(定义位置:solution/framework/gui_fwk/tlv_fwk/tlv_fwk.h):

/**
 * @brief  平铺卡片切换动画类型枚举 [文件:app.md]
 */
enum
{
    TLV_ANIM_TRANS_NONE = 0,            // 无切换动画
    TLV_ANIM_TRANS_ZOOM,                // 缩放切换动画
    TLV_ANIM_TRANS_FADE,                // 渐隐切换动画
    TLV_ANIM_TRANS_TURN_3D_HOR,         // 水平3D翻转动画
    TLV_ANIM_TRANS_TURN_Y,              // Y轴压缩动画
    TLV_ANIM_TRANS_DRAG,                // 拖拽滑动动画
    TLV_ANIM_TRANS_RING                 // 六扇门切换动画
};

缩放动画

fishy

渐隐动画

fishy

Y轴压缩

fishy

3D翻转

fishy

六扇门

fishy

6.2. 配置MASK效果

系统的页面进出动画框架中已集成 MASK 蒙版效果架构,无需开发额外逻辑,只需完成基础配置及资源添加,即可实现带 MASK 蒙版的切换动画效果,配置步骤如下:

  1. 在工程配置项中,使能配置项 ‘Enbel app trans animation mask function’,开启 MASK 蒙版功能;

  2. 在资源目录的mask文件夹中,放入对应的 MASK 蒙版图片,注意:蒙版图片的分辨率必须与动画缓存区分辨率保持一致

  3. 在系统初始化阶段,按工程中的 MASK 配置示例完成蒙版资源绑定。当前源码未提供app_trans_anim_mask_set_src接口,避免直接按该名称调用;请以对应工程的 MASK 配置示例或最新头文件声明为准。

  4. 配置完成后,切换应用及页面时,即可展示带 MASK 蒙版效果的切换动画。