【LVGL 学习】样式(style)过渡动画学习

transition:过渡动画

当一个控件的状态发生改变时,可以让样式也发生变化以提醒用户。通过过渡动画(transition)可以让样式的改变更自然。例如,按钮在点击时,以及开关在切换时,都具有一小段的过渡动画。

过渡动画使用 lv_style_transition_dsc_t 结构描述。为了要设置过渡动画,需要提供以下信息:

  • 哪些属性需要过渡
  • 过渡前的延时
  • 过渡持续的时间
  • 过渡动画(以回调函数的形式提供)
void lv_style_transition_dsc_init(
									lv_style_transition_dsc_t * tr, 	//初始化过渡动画描述符的指针
									const lv_style_prop_t props[],		//初始化过渡动画需要的过渡变化形式,数组形式表现,数组最后一位必须为 0
									lv_anim_path_cb_t path_cb, 			//初始化过渡动画动画路径,也就是动画样式
									uint32_t time, 						//过渡前的延时
									uint32_t delay, 					//过渡持续的时间
									void * user_data					//过渡动画用户变量
									)

例如,假设需要实现这样一个过渡效果:点击时背景颜色发生改变并拉长,那么相应的初始化过程为:

static lv_style_transition_dsc_t trans;
static const lv_style_prop_t trans_props[] = {
   LV_STYLE_WIDTH, LV_STYLE_HEIGHT, LV_STYLE_BG_COLOR, 0,};

lv_style_transition_dsc_init(&trans, trans_props, lv_anim_path_ease_in_out, 500, 0, NULL);

这里使用的动画效果函数为 lv_anim_path_ease_in_out(),这是一个内置的过渡效果,与之类似的过渡函数可以参考下表:

在这里插入图片描述
过渡动画是控件样式的一部分,可以将初始化得到的过渡动画描述应用到样式上:

static lv_style_t style_trans;
lv_style_init(&style_trans);
lv_style_set_transition(&style_trans, &trans);

过渡动画只有在两种样式切换时才会发生。例如,如果让以上样式应用在按下状态下:

lv_style_set_bg_color(&style_trans, lv_palette_main(LV_PALETTE_RED));
lv_style_set_width(&style_trans, 150);
lv_style_set_height(&style_trans, 60);
lv_obj_add_style(obj, &style_trans, LV_STATE_PRESSED);

那么只有在从其它状态变为按下时才会发生过渡:

请添加图片描述

注意事项:

  1. static const lv_style_prop_t trans_props[] = {LV_STYLE_WIDTH, LV_STYLE_HEIGHT, LV_STYLE_BG_COLOR, 0,};这个数据中有3个元素(0除外),分别是 LV_STYLE_WIDTH LV_STYLE_HEIGHT LV_STYLE_BG_COLOR ,这三个元素,这三个元素分别要写上对应风格的函数,例如:
    lv_style_set_bg_color(&style_cont_main, lv_palette_main(LV_PALETTE_RED));
    lv_style_set_width(&style_cont_main, 240);
    
### LVGL 表情动画实现 在 LVGL 框架中,创建表情动画可以通过组合使用图形对象和定时器来实现动态效果LVGL 提供了丰富的 API 来处理图像、标签和其他 UI 组件,这使得开发人员能够轻松地为这些组件添加动画。 对于表情动画的具体实现方式,可以考虑以下几个方面: 1. **加载表情图片资源** 使用 `lv_img` 或者 `lv_label` 对象显示静态的表情图标。如果表情是由多个帧组成的序列,则需要预先准备好每一帧的位图文件[^1]。 2. **设置动画属性** 利用 `lv_anim_t` 结构体定义动画参数,比如持续时间、延迟时间和循环次数等。通过调用 `lv_obj_set_style_opa()` 函数改变透明度,或者调整位置、大小等其他样式属性来制造视觉上的变化效果。 3. **启动与控制动画** 创建并配置好动画之后,利用 `lv_anim_start()` 开始播放;还可以借助事件回调机制,在特定条件下暂停/继续或停止当前正在运行中的动画。 下面是一个简单的代码片段展示如何在一个标签上应用淡入淡出的效果作为基础示例: ```c static void fade_in_out(lv_obj_t * label){ lv_anim_t a; lv_anim_init(&a); /* 设置目标对象 */ lv_anim_set_var(&a, label); /* 定义从完全不透明到半透明再到全透明的变化过程 */ lv_anim_set_values(&a, LV_OPA_COVER, LV_OPA_TRANSP); lv_anim_set_time(&a, 500); // 动画时间为500毫秒 lv_anim_set_playback(&a, true); // 往返执行一次 /* 将此动画应用于指定的对象 */ lv_anim_path_t path; lv_anim_path_linear_init(&path); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_style_opa); lv_anim_set_path(&a, &path); /* 启动动画 */ lv_anim_start(&a); } ``` 为了更贴近实际需求——即针对表情符号进行动画化,可能还需要结合具体的业务逻辑以及所使用的表情数据源来进行定制化的开发工作。例如,如果是基于 Unicode 编码的表情字符,则可以直接嵌入到字符串中并通过 `lv_label` 显示出来;而若是自定义绘制的表情图案,则需按照上述提到的方法逐帧渲染。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值