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

2023-11-17

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);
    lv_style_set_height(&style_cont_main, 120);

否则不会生效

  1. 实际使用中设置两种风格变量,一个是主要风格,一个是过渡风格,这个在使用时不会出现错乱

使用示例:

#include "lvgl/lvgl.h"
#include "lvgl/examples/lv_examples.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/win32drv/win32drv.h"

#include "test.h"

static lv_style_t style_label;
static lv_obj_t* cont;
static lv_obj_t* cont_main;


LV_FONT_DECLARE(myFontOrbitron_18);

static void anim_x_cb(void* var, int32_t v)
{
    lv_obj_set_y(var, v);
}

static void label_ready_cb(lv_anim_t* var)
{
    lv_obj_fade_out(cont, 500, 100);
    lv_obj_fade_in(cont_main, 500, 100);
}

static void anim_ready_cb(lv_anim_t *var)
{
    lv_obj_t* label = lv_label_create(cont);
    lv_obj_remove_style_all(label);
    lv_obj_align(label, LV_ALIGN_CENTER, 0, -24);

    lv_obj_set_style_text_font(label, &myFontOrbitron_18, LV_PART_MAIN);
    lv_obj_add_style(label, &style_label, LV_PART_MAIN);

    lv_label_set_text(label, "Start Up");
    //lv_obj_fade_in(label, 1000, 100);

    lv_anim_t label_anim;
    lv_anim_init(&label_anim);
    lv_anim_set_var(&label_anim, label);
    lv_anim_set_values(&label_anim, lv_obj_get_y(label), -24);
    lv_anim_set_time(&label_anim, 500);
    lv_anim_set_exec_cb(&label_anim, anim_x_cb);
    lv_anim_set_path_cb(&label_anim, lv_anim_path_ease_in_out);
    lv_anim_set_repeat_count(&label_anim, 0);
    lv_anim_set_ready_cb(&label_anim, label_ready_cb);
    lv_anim_start(&label_anim);
}

static void set_value(void* bar, int32_t v)
{
    lv_bar_set_start_value(bar, 50 - (v - 50), LV_ANIM_OFF);
    lv_bar_set_value(bar, v, LV_ANIM_OFF);
    if (v == 100)
    {
        printf("v==100");
    }

}




void bar_demo(void)
{
    //进度条只有两个样式选择,一个是主要样式(不变化背景色),一个是指示器(变化的前景色)
    //http://t.csdn.cn/D1kgJ
    static lv_style_t style_main;           // 
    static lv_style_t style_indicator;      //


    cont = lv_obj_create(lv_scr_act());
    lv_obj_set_style_bg_color(cont, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(cont, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_size(cont, 240, 240);
    lv_obj_center(cont);

    lv_style_init(&style_main);
    lv_style_set_border_width(&style_main, 2);
    lv_style_set_border_color(&style_main, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_border_opa(&style_main, LV_OPA_TRANSP);
    //lv_style_set_bg_color(&style_main, lv_palette_main(LV_PALETTE_RED));
    //lv_style_set_bg_opa(&style_main, LV_OPA_COVER);
    lv_style_set_pad_all(&style_main, 6); /*To make the indicator smaller*/
    lv_style_set_radius(&style_main, 6);

    lv_style_init(&style_indicator);
    lv_style_set_bg_opa(&style_indicator, LV_OPA_COVER);
    lv_style_set_bg_color(&style_indicator, lv_palette_main(LV_PALETTE_ORANGE));
    lv_style_set_radius(&style_indicator, 3);

    lv_obj_t* bar = lv_bar_create(cont);
    //样式到这先添加,否则可能出现别的问题
    lv_obj_remove_style_all(bar);
    lv_obj_add_style(bar, &style_main,      LV_PART_MAIN);
    lv_obj_add_style(bar, &style_indicator, LV_PART_INDICATOR);

    lv_obj_set_size(bar, 160, 16);
    lv_obj_center(bar);
    lv_bar_set_range(bar, 0, 100);
    lv_bar_set_mode(bar, LV_BAR_MODE_RANGE);
    lv_bar_set_value(bar, 50, LV_ANIM_OFF);
    lv_bar_set_start_value(bar, 50, LV_ANIM_OFF);

    lv_style_init(&style_label);
    lv_style_set_text_font(&style_label, &lv_font_montserrat_16);
    lv_style_set_text_color(&style_label, lv_color_hex(0xff931e));

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

    cont_main = lv_obj_create(lv_scr_act());
    lv_obj_set_size(cont_main, 240, 60);
    lv_obj_set_style_bg_color(cont_main, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(cont_main, lv_color_black(), LV_PART_MAIN | LV_STATE_DEFAULT);
    lv_obj_set_align(cont_main, LV_ALIGN_TOP_MID);


    lv_style_init(&style_cont_main);
    lv_style_set_bg_color(&style_cont_main, lv_palette_main(LV_PALETTE_RED));
    lv_style_set_width(&style_cont_main, 240);
    lv_style_set_height(&style_cont_main, 120);

    lv_style_transition_dsc_init(&trans_main, trans_props, lv_anim_path_ease_in_out, 100, 0, NULL);
    lv_style_set_transition(&style_cont_main, &trans_main);
    lv_obj_add_style(cont_main, &style_cont_main, LV_STATE_PRESSED);



    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_var(&a, bar);
    lv_anim_set_values(&a, 50, 100);
    lv_anim_set_exec_cb(&a, set_value);
    lv_anim_set_time(&a, 500);
    //lv_anim_set_playback_time(&a, 2000);
    lv_anim_set_repeat_count(&a, 0);
    lv_anim_set_ready_cb(&a, anim_ready_cb);
    lv_anim_start(&a);
}

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LVGL 学习】样式(style)过渡动画学习 的相关文章

  • 初学stm32-库函数开发步骤及总结

    stm32库函数开发 一 外设常具备的几类寄存器 二 控制外设的常见操作 三 外设的初始化 四 数据传送 五 状态检查与清除 六 外设函数分类 一 外设常具备的几类寄存器 控制寄存器xxx CR Control Configuration
  • spring boot配置类注册深入解析

    前言 spring ApplicationContext的刷新总体来看有两个过程 第一个是注册BeanDefinition 提供整个IOC容器初始化的材料 第二个是根据BeanDefinition加载bean 从spring boot开始
  • 日常错误整理

    DOMException Failed to execute setItem on Storage Setting the value of widgetCacheData exceeded the quota 在使用sessionStor

随机推荐

  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • MyBatis一对多,多对一,多对多

    MyBatis中的一对多和对多一 多对多 主要就是resultMap中 association 关联 一个复杂的类型关联 许多结果将包成这种类型 多对一 嵌套结果映射 关联本身可以是一个 resultMap 元素 或者从别处引用一个 col
  • unity的UI元素层级调整的方法

    UI的渲染层级决定了最终显示效果 先渲染的在底层 后渲染的上层 层级按照如下优先级确定 相机深度 通过Camera控件中的Depth属性设置 值越大的后渲染 Canvas的Sorting Layer 约靠下的后渲染 Canvas的Order
  • 最适合 IoT标准化的许可证是哪一个?

    本文翻译至 http readwrite jp infrastructure 32485 IoT 是今年的技术趋势之一 该领域的潜力是相当大的 但是 关于 规格 依然是四分五裂缺乏统一感 最近可以看到世界已经迈出了标准化的一大歩 到现在为止
  • CocosCreator实战篇 |CocosCreator实现《飞机大战》

    博客主页 肩匣与橘 欢迎点赞 收藏 留言 如有错误敬请指正 本文由肩匣与橘编写 首发于CSDN 生活依旧是美好而又温柔的 你也是 飞机大战 前言 一 素材准备 二 场景搭建 背景 主角战斗机 敌方战机生成点 分数UI 副摄像机 三 脚本编写
  • 空余时间在家做短视频剪辑,一部手机就能搞定,0基础新手也能做

    新手小白刚进去短视频自媒体领域 0粉丝想赚钱就要选一个发布内容有播放量就有收益平台去操作 刚开始可能收益不高 但你坚持做下去 就会跟半途放弃的人不一样 今天大周就说一说具体步骤 该怎么去做 一 选择平台 选择一个有播放量就有收益的平台 今天
  • 【⑬MySQL

    前言 欢迎来到小K的MySQL专栏 本节将为大家带来MySQL数据类型简介 整数 浮点 定点 时间 日期类型的分享 目录 前言 0 数据类型简介 1 整数类型 2 浮点类型 3 定点类型 4 日期 时间类型 总结 0 数据类型简介 数据类型
  • 数论函数(一)

    转载请标明出处 目录 转载请标明出处 1 前言 2 数论函数介绍 2 1加性函数 2 1 1加性函数的性质 2 1 2一些加性函数的例子 2 2积性函数 2 2 1积性函数的性质 2 1 2一些积性函数的例子 2 3数论函数的重要操作 2
  • 原码、反码、补码的运算及在计算机中的作用

    一 概念简述 机器码 一个数在计算机中的二进制形式 机器码是带符号的 在计算机用机器码的最高位存放符号 正数为0 负数为1 如 0000 0011 和 1000 0011 机器码的真值 机器码除符号位剩下的真正数值 如 0000 0001的
  • python如何模拟键盘输入_python模拟鼠标点击和键盘输入的操作

    所有代码都是网上百度出来的 通过个人实践找到适合自己的 采用的python 库是 pymouse pykeyboard 安装时直接pip安装的 pip install PyUserInput 实现了一个最简单的输入密码 enter进入的登录
  • 四分位数与pandas中的quantile函数

    四分位数与pandas中的quantile函数 1 分位数概念 统计学上的有分位数这个概念 一般用p来表示 原则上p是可以取0到1之间的任意值的 但是有一个四分位数是p分位数中较为有名的 所谓四分位数 即把数值由小到大排列并分成四等份 处于
  • Streamlit 讲解专栏(十一):数据可视化-图表绘制详解(中)

    文章目录 1 前言 2 绘制交互式散点图 3 定制图表主题 4 增强数据可视化的交互性与注释 步骤1 步骤二 5 结语 1 前言 在上一篇博文 Streamlit 讲解专栏 十 数据可视化 图表绘制详解 上 中 我们学习了一些关于数据可视化
  • AI绘画是艺术还是技术?AI绘画会让插画师集体失业?

    今年以来 AI绘画的讨论热潮此起彼伏 过一段时间就会引起争议和恐慌 就在近日 日本推出一款名为mimic的AI绘画软件 被日本绘画圈集体声讨 许多画师公开禁止AI绘画 恰巧最近美国艺术圈里关于AI绘画也发生了一件大事 一副 数字绘画 作品获
  • day2 poc与exp学习之pikachu字符注入

    exp编写 这里以基于联合注入的exp为例子 1 全局变量 对数据存储以及http包头的自定义 url http 192 168 110 131 pikachu master vul sqli sqli str php 要验证注入点的url
  • IBM《智慧数据中心》

    部分内容摘要 IBM认为 数据中心的发展路径是从成本中心演变成为服务中心 其功能也从支撑业务发展到驱动业务 并进一步成为业务创新的加速器 未来数据中心将是智慧的 绿色的 灵活支撑业务发展的 实现监控可视化 控制自动化 管理流程化 信息系统从
  • 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

    目录 试题 A 日期统计 本题总分 5 分 试题 B 01 串的熵 本题总分 5 分 试题 C 冶炼金属 本题总分 10 分 试题 D 飞机降落 本题总分 10 分 试题 E 接龙数列 本题总分 15 分 试题 F 岛屿个数 本题总分 15
  • node.js express 文件服务器,如何用nodejs+express搭建一个简单的后台服务器?

    Express框架 根据官方的介绍 Express是一个基于Node js平台 快速 开放 极简的Web开发框架 安装 Express是一个基于Node js的平台 所以在安装Express之前 你得先确保你已经安装了Node js 打开命
  • 计算1到10的阶乘之和:1!+2!+3!+......+10!(C语言&&Python)

    计算1到10的阶乘之和 1 2 3 10 C语言 include
  • Java 文件上传 三种方式

    一 配置springBoot上传文件限制 spring servlet multipart max file size 100MB 单个文件大小 max request size 1024MB 总文件大小 二 代码 import org s
  • 【LVGL 学习】样式(style)过渡动画学习

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