LVGL如何创建页面并实现页面的切换

news2024/10/23 17:28:19

如何绘制一个页面

先搞清楚一个问题,那就是绘制一个页面,是直接创建一个新的屏幕,还是基于默认的屏幕创建一个一个的父类呢?

参考这篇文章

LVGL_多界面切换_lvgl 多页面建立-CSDN博客

可知通常是创建一个新的屏幕,每个页面一个新的屏幕。

比如:

注意,如果页面背景比较复杂,比如特定公司的LOGO,用LVGL没法绘制,或者说很难绘制,那就只能直接用图片来作为页面了。通常,背景都不会很复杂,而是很简洁的,复杂的背景会干扰实体的内容,没有人会这么设计的。

创建屏幕时发现一个问题,那就是创建新屏幕,烧录后界面显示白屏;

但是基于默认的活动屏幕可以显示LOGO图片

为啥?

LVGL百问网

找到这样的一段话

显示器只有一个,我们可以把这里的NULL就理解成显示器,就是真实的显示设备。

然后在这个显示器上创建一个屏幕,这里是逻辑屏幕,也就是我们想要的页面。 

但是,创建一个屏幕时,它还不是活动屏幕,必须调用lv_scr_load()函数来激活屏幕,比如:

此时就可以正常显示了。

页面切换

我们可以按照上面的思路来绘制自己想要的页面,但是在此之前,还得了解下另外一个问题,那就是页面的切换。

在lvgl使用的过程中,最初的时候,肯定都会遇到这样的问题,页面之间的切换以及空间的释放。如果不合理的设计的话,一上来就将所有的页面进行初始化,那将会占用许多不必要的内存空间,硬写之间的切换的话,界面一旦多起来,那切换逻辑将会绕来绕去,最终会写不下去。

页面切换时有个要考虑的问题,那就是页面切换时,是否要释放掉原来的页面内存?如果不释放的话,内存占用是不是够用?

那么,如何合理地切换页面呢?

可参考这篇文章:

LVGL学习(3):页面切换原理和页面管理实现_gui guider页面切换-CSDN博客

我们之前已经学过,切换页面有两种方式:一种是绘制所有的页面,然后为他们添加隐藏和显示标志,从而实现页面的切换;还有一种就是切换页面时,先删除前一个页面,再创建新的页面。前者占用大量内存空间,但是可以保留页面信息;后者同一时间只会占用一份内存空间,但是每次进入时数据需要手动重新设置。

隐藏页面切换法?

隐藏页面切换法就是调用以下这两个函数,lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN)和lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN),来隐藏/显示页面以实现页面的切换。此时,可以指定所有页面有一个共有的父类(通常是一个活动屏幕)。但是如果将所有的页面都建立于一个屏幕上,不仅浪费内存,而且页面之间的管理也非常乱。

所以,我们可以给每个页面分配一个屏幕,然后采用函数lv_scr_load来加载一个屏幕。

有了这个函数,实际上页面切换就很简单了,对于每个页面来说,一个lv_obj_t基础对象表示一个页面,我们只需要让一个页面中所有的组件都以这个页面lv_obj_t为父类即可,然后用lv_scr_load函数进行加载就行了。对于lv_scr_load函数来说,仅支持单个页面的显示,参数是哪个页面,显示的就是哪个页面。并且,显示的屏幕就会变成当前的活动屏幕,可以通过lv_scr_act来获取。

也就是说,如果是隐藏和显示标志,就需要先后调用lv_obj_add_flag和lv_obj_clear_flag来实现切换,如果不隐藏,会对新显示的页面有影响;但是使用lv_scr_load来加载一个屏幕,则不用先隐藏之前的屏幕,因为同一时间只会有一个活动屏幕。这种情况下,就算之前的页面没有被删除,也不会影响新的页面。

此时,我们可以在切换之前,释放之前屏幕上的内存,注意,用的是函数lv_obj_clean,而不是lv_obj_del,因此并不是删除原来的屏幕。当然,也可以选择删除。

总结上面的内容,得出两种常用的切换页面的方式:

1

所有的页面共用一个活动屏幕,然后一起创建出来,接着用隐藏和显示来切换,此时,页面越多,则内存占用越多;

参考这篇文章:

LVGL实现页面切换 - 知乎

2

每个页面单独一个屏幕,然后通过lv_scr_load加载屏幕来切换页面,切换时,可以选择释放之前屏幕的内存,也可以直接一些,删除之前的屏幕对象。这种情况下,每次加载新页面时,都需要重新初始化页面中的组件。

这里基于第二种思路,提供一种初步的切换方案。

这种方案主要分为三个部分。

第一部分:先定义所有的页面对象,并在初始化时创建好所有的屏幕页面,因为后续会释放屏幕的内存空间,但是并不会删除对象,所以初始时就创建好,而且后续操作页面就会基于这些变量进行,从而利用面向对象的思路使得操作更加简便,同时也避免了每次进入页面时都要重新创建一个新的屏幕(这样新建的屏幕的指针可能每次都不一样);

第二部分:基于已经创建好的页面来添加各页面中的组件,也就是将各页面绘制出来,绘制完成之后,别忘了要加载屏幕;

第三部分:实现页面的切换,就是先释放当前的页面内存,然后绘制新的页面;

这里使用枚举来定义了各个页面,是可选的。

总结来说就是:

① 定义和创建页面对象;

② 绘制页面内容;

③ 切换页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1498211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

洛谷P2233 公交车路线

本题题号特殊,相对简单。 题目描述 在长沙城新建的环城公路上一共有 88 个公交站,分别为 A、B、C、D、E、F、G、H。公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站…

Eclipse调试技巧 条件断点 监视

实验代码 import java.util.Scanner;public class Test {// 判断n是否为质数public static boolean isPrime(int n){if (n < 2)return false;for (int i 2; i < n; i){if (n % i 0)return false;}return true;}public static void main(String[] args){Scanner scanne…

数据中台:企业数字化转型的关键基础设施

文章目录 为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿&#xff0c;方法论体系更新与时俱进&#xff0c;紧跟时代热点深入6大行业&#xff0c;提炼实践精华大咖推荐&#xff0c;数字化转型必备案头书 在数字中国这一国家战略的牵引下&#xff0c;数据要素和数字…

vue el-avatar 使用require提示无法找到图片

报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案

OA系统看飞书,能把繁杂场景设计的这么流畅,绝对是高手。

OA系统看飞书&#xff0c;能把繁杂场景设计的这么流畅&#xff0c;绝对是高手。 2023-08-18 23:33贝格前端工场 飞书是一款功能强大、操作流畅的企业协作工具&#xff0c;它提供了丰富的功能和灵活的场景设计&#xff0c;使得用户在使用过程中能够更加高效地协作和沟通。 以…

设计模式在芯片验证中的应用——备忘录

1. 前言 软件设计模式定义了一组类和它们之间的关系&#xff0c;它们相互作用用以解决软件开发过程中面临的常见问题。由于验证工程师所做工作的重要部分包括使用面向对象语言(如SystemVerilog)进行编码&#xff0c;因此许多遇到的挑战都适合应用特定的设计模式来解决。将它们…

揭秘CPU可视化:探索计算机心脏的神秘之旅

在数字化飞速发展的今天&#xff0c;中央处理器&#xff08;CPU&#xff09;作为计算机的心脏&#xff0c;其复杂度和重要性不言而喻。 中央处理器&#xff0c;这个小小的芯片&#xff0c;却承载着计算机运行的所有指令和数据处理任务。它的内部构造复杂而精密&#xff0c;每一…

根据标准化开发流程---解析LIN总线脉冲唤醒的测试方法和用例设计思路

前言&#xff1a;本文从标准化开发流程的角度&#xff0c;以LIN总线脉冲唤醒为切入点。从测试工程师的角度来讲测试工作应当如何展开&#xff08;结合我干测试总结出来的测试经验&#xff09;。希望大家都能从中有收获&#xff01;&#xff01;谢谢&#xff01;&#xff01; 1…

吴恩达deeplearning.ai:机器学习项目的完整周期伦理

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 语音识别部署公平、偏见、伦理 这节博客中&#xff0c;我们主要看看构建一个机器学习的完整周期是什么&#xff0c;也就是说&#xff0c;当你想构建一个有价值的机器学习系统时&am…

【conda】实现conda环境迁移的4种方式

文章目录 方案1: 使用conda pack制作压缩包并在目标环境解压使用方案2: 使用package列表文件重新创建conda环境方案3: scp将环境文件夹拷贝到目标主机上方案4: 通过--clone先克隆一个环境再conda pack打包迁移 方案1: 使用conda pack制作压缩包并在目标环境解压使用 适合离线环…

python爬虫(2)

继上节 查看数组维数 可以使用数组的ndim属性 代码示例如下&#xff1a; import numpy as np c np.random.randint(1,9,5) print(c.ndim) 结果如下&#xff1a; 当然这些也可以结合前面的各种用法来使用 1、选取数组元素 &#xff08;1&#xff09;一维数组的元素…

NDK,Jni

使用 NDK&#xff08;Native Development Kit&#xff09;意味着在 Android 应用程序中集成 C/C 代码。通常情况下&#xff0c;Android 应用程序主要使用 Java 或 Kotlin 编写&#xff0c;但有时候需要使用 C/C 来实现一些特定的功能或性能优化。 NDK 提供了一组工具和库&…

onnx模型优化利器onnxoptimizer、onnxsim

ONNX性能优化和调试技巧 - 知乎ONNX模型是一种跨平台、跨框架的模型表示格式,允许用户在不同的深度学习框架之间共享模型和数据,从而加速模型开发和部署。然而,在实际应用中,我们通常需要对ONNX模型进行性能优化和调试,以确保其在不同硬件和…https://zhuanlan.zhihu.com/…

C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码

David A. Huffman 1 哈夫曼编码简史&#xff08;Huffman code&#xff09; 1951年&#xff0c;哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是&#xff0c;寻找最有效的二进制编码。由于无法证明哪个已有编码是…

和为K的子数组

题目&#xff1a; 使用前缀和的方法可以解决这个问题&#xff0c;因为我们需要找到和为k的连续子数组的个数。通过计算前缀和&#xff0c;我们可以将问题转化为求解两个前缀和之差等于k的情况。 假设数组的前缀和数组为prefixSum&#xff0c;其中prefixSum[i]表示从数组起始位…

JavaWeb-Maven基础

Maven是专门用于管理和构建Java项目的工具&#xff0c;是 Apache 下的一个纯 Java 开发的开源项目&#xff0c;基于项目对象模型&#xff08;POM&#xff09;概念。先来学习一下Maven基础&#xff0c;等后面学完开发框架后再学Maven高级&#xff0c;这次的内容如下 一、概述 …

主题乐园如何让新客变熟客,让游客变“留客”?

群硕跨越时间结识了一位爱讲故事的父亲&#xff0c;他汇集了一群幻想工程师&#xff0c;打算以故事为基础&#xff0c;建造一个梦幻的主题乐园。 这个乐园后来成为全球游客最多、收入最高的乐园之一&#xff0c;不仅在2023财年创下了近90亿&#xff08;美元&#xff09;的营收…

9款世界级垂直领域软件架构师Visio平替作图工具!

1 LucidChart 一个基于HTML5的在线流程图绘制和协作应用平台&#xff0c;用户可以通过它方便快速的实现流程图表的绘制&#xff0c;同时还可以实现与他人进行实时的流程图绘制和修改功能&#xff0c;对需要群组协作功能的团队来说&#xff0c;这点非常方便。 由于LucidChart是…

机器学习-面经(part8、贝叶斯和其他知识点)

机器学习面经其他系列 机器学习面经系列的其他部分如下所示&#xff1a; 机器学习-面经(part1)-初步说明 机器学习-面经(part2)-交叉验证、超参数优化、评价指标等内容 机器学习-面经(part3)-正则化、特征工程面试问题与解答合集机器学习-面经(part4)-决策树共5000字的面试问…

【CSP试题回顾】201503-3-节日

CSP-201503-3-节日 关键点&#xff1a;格式化输出 在C中&#xff0c;格式化输出通常利用iostream库中的功能&#xff0c;特别是iomanip头文件提供的一系列操作符。这些操作符用于控制输出格式&#xff0c;如宽度、填充、对齐方式等。在你提供的代码中&#xff0c;用于格式化输…