LVGL 界面跳转逻辑的设计与实现

使用方法

        源码 gui_scr_mgr.c 和 gui_scr_mgr.h 见最后参考资料,下面我会介绍一下使用方法,至于原理下面也有一些解释。

        1、初始化,假设 LVGL 的入口是 lvgl_app_init();然后初始化我们界面管理系统,21行初始化界面管理系统,22行设置界面的根界面。当然需要包括头文件 gui_scr_mgr.h。

         2、创建界面,假设创建界面 gui_main_scr.c 和 gui_main_scr.h。gui_main_scr.c 界面的框架如下(需要按照此框架写自己的代码),Create 创建 LVGL 控件;Enter 注册事件;Layout 界面的布局; Exit 与 Enter 对应,注销在 Enter 注册的事件,Destroy 与 Create 对应,释放在 Create 申请的空间。

gui_main_scr.h 的内容如下。

         3、声明 ID 和界面结构体 Handle,下面以添加界面 gui_main_scr 为例,添加 ID,ID 必须放到全局的 .h 文件中。

       声明界面结构体,在 gui_scr_mgr.c 中,将界面结构体放到界面管理系统中;然后在 gui_scr_mgr.h 中声明界面结构体。

         4、按照上面的方法,在创建一个界面,然后在两个界面中添加一下控件,然后在控件的回调中去调用界面管理的 push 和 pop 函数。运行效果如下图所示,详情见参考资料 vs2019 工程。

1、简介

        摘录:LVGL - Open Collective

What is LVGL?

        LVGL is the most popular free and open source embedded graphics library to create beautiful UIs for any MCU, MPU and display type.  It has all the features to create modern and smartphone-like GUIs: 30+ built-in widgets, a powerful style system, web inspired layout managers, and a typography system

        LVGL 之前好像叫做 litterVGL 不知道啥时候改名了,LVGL 和 litterVGL 说的是一个东西。相比于其他的嵌入式 UI,LVGL 的优势在于:1、它是免费开源的,白嫖的力量自然不用多说。2、第二个是它的 UI 风格类似于移动端,是比较好看的,更符合现在人的审美。3、它是跨平台的,基本上是适用于任何 MCU、MPC上显示。正事它的这些优势,LVGL 得以在最近一些年可以流行起来。

2、界面调度机制

        LVGL 虽然提供了 30+ 的组件,和上百种的样式,还支持之定义组件,但是 LVGL 还是缺少了界面管理的功能,所以 LVGL 需要我们关注一下页面管理机制(项目的 GUI 交互不因该只停留在一个界面上)。管理界面管理的机制可以参考 Android 的实现,主要关注的是界面生命周期界面返回栈,这个在最后的参考资料中给出。

2.1 界面的生命周期

        嵌入式 UI 和移动端的 UI 还是有比较大的差距的,所以也不用弄得和 Android 的 Activity 生命周期弄那么复杂,简单概括一下就是,LVGL 的一个界面生命周期有如下几个状态:创建界面和组件、进入界面、界面布局、退出界面、销毁界面,示意图如下。至于下面的从 Exit 到 Entry 状态的转变涉及到界面返回栈,后面会分享到。

        各个部分的主要功能如下表,这样就对界面处于某一状态下的功能有了具体的定义。这样就可以用一个结构体对一个界面进行描述了(见代码实现部分)。

Create界面 obj 的创建、各种组件的创建、定时器创建
Entry为组件添加事件,开启定时器,注册监听器

Layout

对界面进行布局,界面处于活跃状态
Exit屏蔽组件事件,暂停定时器,注销监听器
Destroy销毁组件、销毁定时器、销毁界面

2.2 界面返回栈

        界面返回栈是执行某项工作时产生的界面的集合,并按照界面打开的顺序排列在返回栈中,如下图所示,打开一个界面就向返回栈中执行 push 操作,关闭一个界面就执行一个 pop 操作。 这样做的好处是,界面与界面之间相互独立,也不用判断界面之间的跳转关系。

         举个例子说明返回栈的优势,如下图所示,假设我们从主界面 scr1 执行了一些操作让其到 scr5 上,那么界面的打开顺序是 scr1 -> scr2 -> scr5,如果用户执行完操作后,关闭了 scr5,那需要在 scr5 中判断要返回到 scr2 上,而不是返回到 scr3、scr4、scr6 上。这样的操作会让界面之间存在关联,会导致在界面较多的时候,难以更改界面的跳转逻辑。

         而返回栈就避免了这样问题,在界面打开的时候,就已经记录了界面的打开顺序,要想返回上一个打开的界面,直接执行 pop 操作就可以了。如下图所示,闭关界面 scr5 后,进入的是 scr2。

         返回栈的 push 和 pop 操作对应界面的生命周期如下图。以 push 和 pop scr2 为例,绿色为界面的活跃状态,绿色条纹表示界面正在构建中,灰色表示界面的退出态(Exit)。

         当有新的界面 scr2 入栈时,前一个界面 scr1 会进入 Exit 态;当 scr2 退出时,会先进入 Exit 态,最后在进入销毁态(Destory);这样做是确保在销毁界面前,关闭界面相关的回调、定时器等事件。

参考资料

VS2019模拟器工程:GitHub - ShallowGreen123/lvgl_mydemo: Daily development

见源码scr模块:https://github.com/ShallowGreen123/data

界面生命周期:SystemView

界面返回栈:Android 界面返回栈

  • 26
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【RT-Thread作品秀】基于 lvgl 的漏电保护装置校验仪 UI 界面设计作者:赵加文 概述低压漏电引起的各种安全事故已经严重影响到生产生活,威胁到生命财产安全。而解决这一现象的设备就是漏电保护开关,漏电保护开关的漏报率、误报率是很关键的参数,因此有必要对漏电保护开关的性能进行测试。因此,漏电保护装置校验仪是很有必要的。 开发环境硬件:ART-Pi 开发板,正点原子 480*272 4.3寸 RGB 屏幕 RT-Thread版本:4.0.3 开发工具及版本: RT-Thread Studio 2.0.0 :编写 编译 调试 下载代码 STM32CubeMX 6.1.0: codeBlocks 20.03:用于在 PC 机上进行 lvgl 模拟 MCU_Font V2.0: 用于转换中文,然后使得中文能够在 lvgl 中显示 RT-Thread使用情况概述在 UI 设计的整个过程中,使用到 RT-Thread 的部分主要有以下几个方面: 内核部分:动态线程,信号量 组件部分:PIN 设备、I2C 设备、TOUCH 设备框架、LCD 设备框架、finsh 组件 软件包部分:littlevgl2rtt、gt9147 硬件框架软件框架说明系统整体流程图: 软件模块说明整个UI 系统设计所遵循的是 lvgl 图形库的一个回调函数的机制,将各个事件与对应的操作所绑定起来,当滑动滑条时对应的滑条的回调函数就会被触发,那么就会执行滑条回调函数的内容,当滑动点击文本框时,文本框对应的回调函数就会被触发,进而创建键盘的控件,通过键盘输入所需要的数据。 演示效果图片展示: 演示视频: 比赛感悟这次参赛,之前还没有使用过 RT-Thread studio 这个集成开发环境,这次在使用 ART-Pi 的时候全程是使用 RT-Thread studio 这个开发环境,在使用的过程中也碰到了很多问题,有时候明明配置了相关组件,但是保存之后,并没有代码添加到工程里。现在也没有弄明白问题出在哪里,虽然存在着这里问题,但是在使用的过程中,还是非常的方便,整个开发过程就如同搭积木一样方便,与 RTT操作系统贴合的非常的紧密。 除此之外,便是在使用 lvgl 的过程中碰到了很多的问题,现在网上的教程基本是 lvgl v6 版本的教程,关于 lvgl v7 版本的教程很少,而且 v6版本与 V7 版本的 API 相差很大,不能按照 V6 版本来使用 V7 ,在这个过程中摸索了好多,同时也感受到了 lvgl 的魅力,使用在嵌入式系统上是非常不错的选择。
LVGL页面跳转动画可以通过使用lv_scr_load_anim函数来实现。该函数可以加载新的屏幕,并指定动画效果、切换时间和延迟时间。例如,可以使用LV_SCR_LOAD_ANIM_FADE_ON动画效果来实现淡入淡出的过渡效果。以下是一个示例代码: ```c lv_scr_load_anim(two, LV_SCR_LOAD_ANIM_FADE_ON, 500, 5000, true); ``` 在这个示例中,函数将加载名为"two"的新屏幕,并使用淡入淡出的动画效果。切换时间为500毫秒,延迟时间为5000毫秒。加载完成后,旧的屏幕将被删除。 此外,还可以使用其他动画效果,如LV_SCR_LOAD_ANIM_MOVE_LEFT、LV_SCR_LOAD_ANIM_OVER_TOP等,根据需要选择适合的动画效果。 请注意,以上示例代码是基于LVGL库的C语言实现。具体的页面管理和跳转逻辑可能会有所不同,具体实现可以参考引用\[2\]中的代码示例。 \[1\] 引用自:https://blog.csdn.net/qq_41673981/article/details/108051051 \[2\] 引用自:https://blog.csdn.net/qq_41673981/article/details/108051051 \[3\] 引用自:https://blog.csdn.net/qq_41673981/article/details/108051051 #### 引用[.reference_title] - *1* [lvgl 7.7.2 dev屏幕动画切换](https://blog.csdn.net/mygod2008ok/article/details/110108282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [lvgl页面管理 简单实现](https://blog.csdn.net/weixin_44678052/article/details/128211713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值