可以使用Animation可以在起始值和结束值之间自动改变一个变量的值。Animation通过周期性用相应值调用“animator”函数来实现。
“animator”函数的原型如下:
void func(void * var, lv_anim_var_t value);
这个原型和大部分LVGL的set函数一致,如lv_obj_set_x(obj, value)和lv_obj_set_width(obj, value)。
Create an animation
要创建动画,需要初始化一个lv_anim_t类型的变量,并且用lv_anim_set_…()函数进行配置。
/* INITIALIZE AN ANIMATION
*-----------------------*/
lv_anim_t a;
lv_anim_init(&a);
/* MANDATORY SETTINGS
*------------------*/
/*Set the "animator" function*/
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) lv_obj_set_x);
/*Set the variable to animate*/
lv_anim_set_var(&a, obj);
/*Length of the animation [ms]*/
lv_anim_set_time(&a, duration);
/*Set start and end values. E.g. 0, 150*/
lv_anim_set_values(&a, start, end);
/* OPTIONAL SETTINGS
*------------------*/
/*Time to wait before starting the animation [ms]*/
lv_anim_set_delay(&a, delay);
/*Set path (curve). Default is linear*/
lv_anim_set_path(&a, &path);
/*Set a callback to call when animation is ready.*/
lv_anim_set_ready_cb(&a, ready_cb);
/*Set a callback to call when animation is started (after delay).*/
lv_anim_set_start_cb(&a, start_cb);
/*Play the animation backward too with this duration. Default is 0 (disabled) [ms]*/
lv_anim_set_playback_time(&a, wait_time);
/*Delay before playback. Default is 0 (disabled) [ms]*/
lv_anim_set_playback_delay(&a, wait_time);
/*Number of repetitions. Default is 1. LV_ANIM_REPEAT_INFINIT for infinite repetition*/
lv_anim_set_repeat_count(&a, wait_time);
/*Delay before repeat. Default is 0 (disabled) [ms]*/
lv_anim_set_repeat_delay(&a, wait_time);
/*true (default): apply the start vale immediately, false: apply start vale after delay when then anim. really starts. */
lv_anim_set_early_apply(&a, true/false);
/* START THE ANIMATION
*------------------*/
lv_anim_start(&a); /*Start the animation*/
可以同时给一个变量应用多个不同的动画。例如用Lv_obj_set_x和lv_obj_set_y来改变x和y坐标。但是对于一对变量和函数来说,只能有一个动画存在。因此,lv_anim_start()会删除已经存在的变量函数对。
Animation path
Path Of Animation是可以设置的。最简单的例子就是线性变化,代表在起始值和结束值之间是线性变化的。Path主要就是一个根据动画的当前状态计算下一个要设置的值函数。当前有下列内置的Path函数:
- 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 在结束值会回弹一点(效果类似于撞墙)
path可以用如下的代码初始化:
lv_anim_path_t path;
lv_anim_path_init(&path);
lv_anim_path_set_cb(&path, lv_anim_path_overshoot);
lv_anim_path_set_user_data(&path, &foo); /*Optional for custom functions*/
/*Set the path in an animation*/
lv_anim_set_path(&a, &path);
Speed vs time
默认情况下,需要设置的是动画的时间,但是在某些场景下,用动画速度会更实用。
函数lv_anim_speed_to_time(speed, start, end)计算了从开始值以给定速度变化到结束值所需时间,单位毫秒。速度的单位是unit/s。例如,lv_anim_speed_to_time(20, 1, 100)的计算结果是5000毫秒。又如,如果函数是lv_obj_set_x,单位是像素,所以20的意思是20px/s。
Delete animations
可以用变量及其“animator”函数来调用lv_anim_del(var, func)以删除动画。