ESP32 LVGL8.1 ——anim 动画 (anim 16)

提示:本博客作为学习笔记,有错误的地方希望指正

一、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);                                 //开始动画
}

请添加图片描述

  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在LVGL中使用anim动画实现canvas里面文本闪烁的效果,需要使用一个LVGL的对象来绘制文本,并使用LVGL的anim动画来改变文本的透明度。以下是实现文本闪烁效果的代码示例: ```c // Create label object lv_obj_t * label = lv_label_create(lv_scr_act(), NULL); lv_label_set_text(label, "Hello World!"); lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0); // Create anim object lv_anim_t anim; lv_anim_init(&anim); lv_anim_set_time(&anim, 1000); lv_anim_set_delay(&anim, 0); lv_anim_set_values(&anim, LV_OPA_COVER, LV_OPA_TRANSP); lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t)lv_obj_set_style_opa); lv_anim_set_var(&anim, label); // Start anim object lv_anim_start(&anim); ``` 在上面的代码中,我们使用 `lv_label_create()` 函数创建一个label对象,并使用 `lv_label_set_text()` 函数设置label的文本内容。然后使用 `lv_anim_t` 结构体创建一个anim对象。`lv_anim_set_time()` 函数设置动画的持续时间,`lv_anim_set_delay()` 函数设置动画的延迟时间,`lv_anim_set_values()` 函数设置动画的起始值和结束值,`lv_anim_set_exec_cb()` 函数设置动画的更新回调函数,`lv_anim_set_var()` 函数设置动画的目标对象。最后,使用 `lv_anim_start()` 函数启动动画。 在更新回调函数中,我们可以使用 `lv_obj_set_style_opa()` 函数改变label对象的透明度,从而实现文本闪烁效果。 我们可以根据需要调整文本的位置、颜色、字体等属性,来实现不同的文本闪烁效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值