使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第三十九讲)

LVGL(Light and Versatile Graphics Library)提供了强大的动画系统,使得开发者能够轻松地为界面元素添加动态效果。这一期讲解的控件是动画。

1.动画轨迹

 lv_anim_path_linear():线性动画

 lv_anim_path_step():在结束时一步变化

 lv_anim_path_ease_in():开始时慢

 lv_anim_path_ease_out():结束时慢

 lv_anim_path_ease_in_out():开始和结束时都慢

 lv_anim_path_overshoot():超出结束值

 lv_anim_path_bounce():从结束值稍微反弹(像撞到墙一样)

2.速度与时间

默认情况下,你直接设置动画时间。但在某些情况下,设置动画速度更为实际。

lv_anim_speed_to_time(speed, start, end) 函数计算在给定速度下,从起始值到结束值所需的时间(以毫秒为单位)。 速度的单位是 单位/秒。例如,lv_anim_speed_to_time(20, 0, 100) 将返回 5000 毫秒。 例如,在 lv_obj_set_x() 的情况下,单位 是像素,所以 20 意味着 20 像素/秒 的速度。

3.删除动画

如果提供了被动画的变量及其动画器函数,可以使用 lv_anim_delete(var, func) 删除动画。

4.时间轴

时间轴是多个动画的集合,使得创建复杂的复合动画变得更加容易。

首先,创建一个动画元素,但不要调用 lv_anim_start()。

其次,通过调用 lv_anim_timeline_create() 创建一个动画时间轴对象。

第三,通过调用 lv_anim_timeline_add(at, start_time, &a) 将动画元素添加到动画时间轴中。 start_time 是动画在时间轴上的开始时间。注意,start_time 会覆盖 delay 的值。

最后,调用 lv_anim_timeline_start(at) 启动动画时间轴。

它支持整个动画组的正向和反向播放,可以使用 lv_anim_timeline_set_reverse(at, reverse) 来控制。注意,如果你想从时间轴的末尾开始反向播放,需在添加所有动画后并在开始播放之前调用 lv_anim_timeline_set_progress(at, LV_ANIM_TIMELINE_PROGRESS_MAX)。

调用 lv_anim_timeline_stop(at) 停止动画时间轴。

调用 lv_anim_timeline_set_progress(at, progress) 函数来设置与时间轴进度对应的 Widget 状态。

调用 lv_anim_timeline_get_playtime(at) 函数来获取整个动画时间轴的总时长。

调用 lv_anim_timeline_get_reverse(at) 函数来获取是否反向播放动画时间轴。

调用 lv_anim_timeline_delete(at) 函数来删除动画时间轴。 注意:如果你需要在动画过程中删除 Widget,务必在删除 Widget 之前删除动画时间轴。否则,程序可能会崩溃或出现异常行为。

5.代码

/* 初始化动画
-----------------------/

lv_anim_t a;

lv_anim_init(&a);

/* 必要设置
------------------/

/* 设置"动画器"函数 */

lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_obj_set_x);

/* 设置动画的目标 */

lv_anim_set_var(&a, widget);

/* 动画的持续时间 ms */

lv_anim_set_duration(&a, duration);

/* 设置起始值和结束值。例如 0, 150 */

lv_anim_set_values(&a, start, end);

/* 可选设置
------------------/

/* 动画开始前的等待时间 ms */

lv_anim_set_delay(&a, delay);

/* 设置路径(曲线)。默认是线性 */

lv_anim_set_path_cb(&a, lv_anim_path_ease_in);

/* 设置回调函数,指示动画何时完成。 */

lv_anim_set_completed_cb(&a, completed_cb);

/* 设置回调函数,指示动画何时被删除(空闲)。 */

lv_anim_set_deleted_cb(&a, deleted_cb);

/* 设置回调函数,指示动画何时开始(延迟后)。 */

lv_anim_set_start_cb(&a, start_cb);

/* 动画准备好后,以此时长反向播放动画。默认值为 0(禁用)ms */

lv_anim_set_playback_duration(&a, time);

/* 播放前的延迟。默认值为 0(禁用)ms */

lv_anim_set_playback_delay(&a, delay);

/* 重复次数。默认值为 1。LV_ANIM_REPEAT_INFINITE 表示无限重复 */

lv_anim_set_repeat_count(&a, cnt);

/* 重复前的延迟。默认值为 0(禁用)ms */

lv_anim_set_repeat_delay(&a, delay);

/* true(默认):立即应用起始值,false:在延迟后应用起始值,动画真正开始时。 */

lv_anim_set_early_apply(&a, true/false);

/* 启动动画
------------------ /

lv_anim_start(&a); /* 启动动画 */

你可以在同一个变量上同时应用多个不同的动画。例如,使用 lv_obj_set_x() 和 lv_obj_set_y() 来分别动画化 x 和 y 坐标。然而,给定的变量和函数对只能存在一个动画,且 lv_anim_start() 会删除该对已有的任何动画。

本文章由威三学社出品

对课程感兴趣可以私信联系

相关推荐
love530love7 小时前
Photoshop 2026 AI 功能排障复盘:Camera Raw 卡死 / Neural Filters 灰 / 皮肤平滑下载失败 全定位
人工智能·ui·photoshop
农村小镇哥8 小时前
怎么把HTM格式转化成WORD
ui·c#·word
天天进步20151 天前
UI-TARS 源码解析 #22:二次开发实战:用 UI-TARS 做一个简单的 Windows 自动操作 Agent
windows·ui
腾科IT教育2 天前
HarmonyOS开发|ArkTS UI颜色API通用规则
ui·华为·harmonyos·harmonyos开发·鸿蒙应用开发工程师
小小工匠2 天前
把生成模型接进 Agent:Higgsfield MCP 的架构拆解与工程实践
ui·higgsfield mcp·impeccable
czhaii2 天前
word插入表格排版创建或编辑应用技巧
ui·c#·xhtml
淼澄研学3 天前
OpenAI集成Photoshop API:函数调用机制解析与实操指南
ui·photoshop
学习使我健康3 天前
一个基于 **Jetpack Compose + Material 3** 的 Android 入门示例项目,演示 Compose 声明式 UI 的核心用法
ui·kotlin·android jetpack
一夜白头催人泪3 天前
从0到1搭建AI驱动的UI自动化:无代码DOM设计文档
人工智能·ui·自动化
星辰即远方4 天前
计算器仿写总结
学习·ui·ios·cocoa·xcode