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

本文章由威三学社出品

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

相关推荐
AC赳赳老秦6 小时前
DeepSeek 辅助科研项目申报:可行性报告与经费预算框架的智能化撰写指南
数据库·人工智能·科技·mongodb·ui·rabbitmq·deepseek
Dontla10 小时前
Axure RP(Rapid Prototyper)原型图设计工具介绍
ui·axure·photoshop
晚霞的不甘10 小时前
Flutter for OpenHarmony从基础到专业:深度解析新版番茄钟的倒计时优化
android·flutter·ui·正则表达式·前端框架·鸿蒙
XPii12 小时前
Photoshop应用——将图片变为油画效果
ui·photoshop
灵感菇_13 小时前
Android 列表控件全面解析:ListView 与 RecyclerView
android·ui
晚霞的不甘13 小时前
Flutter for OpenHarmony 实现动态天气与空气质量仪表盘:从 UI 到动画的完整解析
前端·flutter·ui·前端框架·交互
雨季66614 小时前
Flutter 三端应用实战:OpenHarmony “极简文本字符计数器”——量化表达的尺度
开发语言·flutter·ui·交互·dart
晚霞的不甘14 小时前
Flutter for OpenHarmony 实现 iOS 风格科学计算器:从 UI 到表达式求值的完整解析
前端·flutter·ui·ios·前端框架·交互
雨季66614 小时前
Flutter 三端应用实战:OpenHarmony “呼吸灯”——在焦虑时代守护每一次呼吸的数字禅修
开发语言·前端·flutter·ui·交互
雨季6661 天前
Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
javascript·flutter·ui·交互·dart