使用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() 会删除该对已有的任何动画。

本文章由威三学社出品

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

相关推荐
Aevget2 小时前
界面组件Kendo UI for React 2025 Q3亮点 - AI功能全面提升
人工智能·react.js·ui·界面控件·kendo ui·ui开发
测试界茜茜8 小时前
独立搭建UI自动化测试框架分享
自动化测试·软件测试·功能测试·程序人生·ui·职场和发展
Android技术之家12 小时前
安卓对外发布工程源码:如何实现仅暴露 UI 层
android·ui
sunly_13 小时前
Flutter:实现多图上传选择的UI
flutter·ui
Howie Zphile14 小时前
NEXTJS/REACT有哪些主流的UI可选
前端·react.js·ui
Wise玩转AI1 天前
Day 27|智能体的 UI 与用户交互层
人工智能·python·ui·ai·chatgpt·ai智能体
yi碗汤园1 天前
C#实现对UI元素的拖拽
开发语言·ui·unity·c#