提示:本博客作为学习笔记,有错误的地方希望指正
文章目录
一、anim 简介
1.1概述 Overview
你可以使用动画在开始值和结束值之间自动改变变量的值。动画将通过定期调用带有相应值参数的“animator”函数来发生。
1.2创建动画 Create an animation
要创建动画,必须用lv_anim_set_…()函数初始化并配置lv_anim_t变量。你可以同时在同一个变量上应用多个不同的动画。例如,使用lv_obj_set_x和lv_obj_set_y动画x和y坐标。然而,一个给定的变量和函数对只能有一个动画。因此lv_anim_start()将删除已经存在的变量函数动画。
1.3动画路径 Animation 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 //从最终值反弹一点(就像撞到一堵墙)
1.4速度与时间 Speed vs time
默认情况下,可以设置动画时间。但是,在某些情况下,动画速度更实用。lv_anim_speed_to_time(速度,开始,结束)函数以毫秒为单位计算从给定速度的开始值到结束值所需的时间。速度是以单位/秒为单位解释的。例如,lv_anim_speed_to_time(20,0,100)将给出5000毫秒。例如,lv_obj_set_x的单位是像素,所以20意味着20像素/秒的速度。
1.5删除动画 Delete animations
你可以通过lv_anim_del(var, func)提供动画变量和它的animator函数来删除动画。
二、anim API
void _lv_anim_core_init(void); //初始化。动画模块
void lv_anim_init(lv_anim_t * a); //初始化一个动画变量
static inline void lv_anim_set_var(lv_anim_t * a, void * var) //设置一个变量为animate
static inline void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb) //设置一个函数来动画' var '
static inline void lv_anim_set_time(lv_anim_t * a, uint32_t duration) //设置动画的持续时间
static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) //在开始动画前设置一个延迟
static inline void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) //设置动画的开始和结束值
static inline void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) //*类似于' lv_anim_set_exec_cb '但' lv_anim_custom_exec_cb_t '接收' lv_anim_t * '作为它的第一个参数而不是' void * '。当LVGL被绑定到其他语言时,这个函数可能会被使用使用' lv_anim_t * '作为第一个参数更一致。
static inline void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) //设置动画的路径(曲线)
static inline void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb) //设置一个函数调用时,动画真正开始(考虑' delay ')
static inline void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb) //设置一个函数使用变量的当前值并设置起始值和结束值相对于返回的当前值。
static inline void lv_anim_set_ready_cb(lv_anim_t * a, lv_anim_ready_cb_t ready_cb) //当动画准备好时,设置一个函数调用
static inline void lv_anim_set_playback_time(lv_anim_t * a, uint32_t time) //回放时间,使动画回放时,正方向准备好了
static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay) //开始动画时候回放延时,使动画回放时,正向方向准备好了
static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint16_t cnt) //让动画重复本身。
static inline void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) //在重复动画之前设置一个延迟。
static inline void lv_anim_set_early_apply(lv_anim_t * a, bool en) //设置是否动画应该立即应用或仅当延迟过期。
static inline void lv_anim_set_user_data(lv_anim_t * a, void * user_data) //设置动画的自定义用户数据字段。
lv_anim_t * lv_anim_start(const lv_anim_t * a); //创建一个动画
static inline uint32_t lv_anim_get_delay(lv_anim_t * a) //在开始动画之前获得一个延迟
bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb); //用给定的animator函数删除一个变量的动画
void lv_anim_del_all(void); //删除所有动画动画
lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb); //获取一个变量及其exec_cb的动画。
static inline bool lv_anim_custom_del(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) //*通过从' a '中获取动画变量来删除一个动画。只有带有exec_cb的动画才会被删除。
//这个函数存在是因为它是逻辑上所有的动物。函数接收一个' lv_anim_t '作为他们的
//第一个参数。这在C语言中是不实用的,但有可能API更顺位,更容易生成绑定。
static inline lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) //设置动画的自定义用户数据字段获取一个变量及其exec_cb的动画。这个函数存在是因
//为它是逻辑上所有的动物。函数接收一个' lv_anim_t '作为他们的第一个参数。这在
//C语言中是不实用的,但有可能API更顺位,更容易生成绑定。
uint16_t lv_anim_count_running(void); //获取当前运行动画的数量
uint32_t lv_anim_speed_to_time(uint32_t speed, int32_t start, int32_t end); //计算动画的时间与给定的速度和开始和结束值
void lv_anim_refr_now(void); //手动刷新动画状态。
三、示例
3.1按键按下Label联动显示动画
/*************************************************
* 函数名称 : sw_event_cb
* 参 数 : 无
* 函数功能 : 按键回调联动显示动画
*************************************************/
static void sw_event_cb(lv_event_t * e)
{
lv_obj_t * sw = lv_event_get_target(e); //获取事件最初瞄准的对象。即使事件是冒泡的,也是一样的。
lv_obj_t * label = lv_event_get_user_data(e); //获取在对象上注册事件时传递的user_data
if(lv_obj_has_state(sw,LV_STATE_CHECKED)){
lv_anim_t a;
lv_anim_init(&a); //初始化动画对象
lv_anim_set_var(&a, label); //为对象设置一个动画
lv_anim_set_values(&a, lv_obj_get_x(label), 100); //设置一个动画的开始和结束值
lv_anim_set_time(&a, 500); //设置一个动画时间
lv_anim_set_exec_cb(&a, anim_x_cb); //设置一个动画回调
lv_anim_set_path_cb(&a, lv_anim_path_overshoot); //设置一个动画的路径
lv_anim_start(&a); //开始动画
}
else{
lv_anim_t a;
lv_anim_init(&a); //初始化动画对象
lv_anim_set_var(&a, label); //为对象设置一个动画
lv_anim_set_values(&a, lv_obj_get_x(label), -lv_obj_get_width(label));//设置一个动画的开始和结束值
lv_anim_set_time(&a, 500); //设置一个动画时间
lv_anim_set_exec_cb(&a, anim_x_cb); //设置一个动画回调
lv_anim_set_path_cb(&a, lv_anim_path_ease_in); //设置一个动画的路径
lv_anim_start(&a); //开始动画
}
}
/*************************************************
* 函数名称 : anim_show_1
* 参 数 : 无
* 函数功能 : 按键联动,实现Label动画显示
*************************************************/
void anim_show_1()
{
lv_obj_t * label = lv_label_create(lv_scr_act()); //创建一个Label
lv_label_set_text(label,"Hello animations!"); //为label设置显示内容
lv_obj_set_pos(label,100,10); //设置对象位置
lv_obj_t * sw = lv_switch_create(lv_scr_act()); //创建一个开关对象
lv_obj_center(sw); //居中显示
lv_obj_add_state(sw,LV_STATE_CHECKED); //添加状态
lv_obj_add_event_cb(sw,sw_event_cb,LV_EVENT_VALUE_CHANGED,label); //添加回调函数
}
3.2动画变换 在X轴由小变大
/*************************************************
* 函数名称 : anim_x_cb
* 参 数 : 无
* 函数功能 : 动画x轴位置显示回调
*************************************************/
static void anim_x_cb(void *var,int32_t v)
{
lv_obj_set_x(var,v);
}
/*************************************************
* 函数名称 : anim_size_cb
* 参 数 : 无
* 函数功能 : 动画尺寸显示回调函数
*************************************************/
static void anim_size_cb(void *var,int32_t v)
{
lv_obj_set_size(var,v,v);
}
/*************************************************
* 函数名称 : anim_show_2
* 参 数 : 无
* 函数功能 : 按键联动,实现Label动画显示
*************************************************/
void anim_show_2()
{
lv_obj_t * obj = lv_obj_create(lv_scr_act()); //创建一个对象
lv_obj_set_style_bg_color(obj,lv_palette_main(LV_PALETTE_RED),0); //设置背景颜色
lv_obj_set_style_radius(obj,LV_RADIUS_CIRCLE,0); //设置样式圆角
lv_obj_align(obj,LV_ALIGN_LEFT_MID,10,0); //居中样式
lv_anim_t a; //创建动画样式
lv_anim_init(&a); //初始化动画
lv_anim_set_var(&a,obj); //给动画设置一个变量
lv_anim_set_values(&a,10,50); //设置一个动画值
lv_anim_set_time(&a,1000); //设置动画时间
lv_anim_set_playback_delay(&a,100); //回放延时 使动画回放时,正向方向准备好了
lv_anim_set_playback_time(&a,300); //回放时间
lv_anim_set_repeat_delay(&a,500); //重复延时
lv_anim_set_repeat_count(&a,LV_ANIM_REPEAT_INFINITE); //重复计数次数
lv_anim_set_path_cb(&a,lv_anim_path_ease_in_out); //设置动画播放路径
lv_anim_set_exec_cb(&a,anim_size_cb); //给动画设置一个功能 回调函数为尺寸
lv_anim_start(&a); //开始动画
lv_anim_set_exec_cb(&a,anim_x_cb); //给动画设置一个功能 回调函数为x轴值
lv_anim_set_values(&a,10,240); //给动画设置一个值
lv_anim_start(&a); //开始动画
}