LVGL的三层屏幕结构
文章目录
- 🌟 LVGL 的三层屏幕架构
- 1. **Top Layer(顶层)**
- 2. **System Layer(系统层)**
- 3. **Active Screen(当前屏幕层)**
- 🧠 总结对比
- 🔍 整体作用
- ✅ 普通屏幕层对象(绿色背景)
- ✅ 顶层对象(红色面板)
- ✅ 系统层对象(蓝色面板)
- 🖼️ 屏幕显示效果(视觉叠加图)
在 LVGL(Light and Versatile Graphics Library)中,屏幕(Screen)是 GUI 的最顶级容器,它负责管理和承载所有 UI 对象。为了增强灵活性和分层显示的能力,LVGL 引入了三层屏幕架构,分别是:
🌟 LVGL 的三层屏幕架构
从显示优先级高到低,三层为:
1. Top Layer(顶层)
-
位置:最上层
-
作用:用于显示始终在最前面的元素,如弹窗(modal)、消息提示框、加载动画(spinner)、自定义浮动组件等。
-
特性:
- 不受普通屏幕的切换影响;
- 不会随屏幕变化被清除或覆盖;
- 可用于临时性 UI 组件的显示;
-
使用方式:
lv_obj_t * top_layer = lv_layer_top(); lv_obj_t * label = lv_label_create(top_layer);
2. System Layer(系统层)
-
位置:中间层,介于 Top Layer 和 active screen 之间
-
作用:用于 LVGL 系统自身使用的图层,如:
- 输入法弹出窗口
- 鼠标光标
- LVGL 内部提示组件
-
特点:
- 一般不推荐用户使用;
- 可通过
lv_layer_sys()
访问,但应谨慎操作; - 和 Top Layer 一样,也不随屏幕切换而消失;
-
使用方式(如需了解):
lv_obj_t * sys_layer = lv_layer_sys();
3. Active Screen(当前屏幕层)
-
位置:最底层
-
作用:用于正常显示 UI 的主界面
- 包含按钮、标签、图像、滑块等常规控件;
-
特点:
- 通过
lv_scr_act()
获取当前活跃的屏幕; - 屏幕切换时,原屏幕会被替换;
- 通过
-
使用方式:
lv_obj_t * screen = lv_scr_act(); lv_obj_t * btn = lv_btn_create(screen);
🧠 总结对比
层级 | 位置 | 典型用途 | 是否随屏幕切换清除 |
---|---|---|---|
Top Layer | 最上 | 弹窗、提示、遮罩等 | ❌ 否 |
System Layer | 中间 | 系统组件、光标等 | ❌ 否 |
Active Screen | 最下 | 主界面 UI | ✅ 是 |
案例:
lv_obj_t* obj1;lv_obj_t* obj2;lv_obj_t* obj3;/* 屏幕层对象 */obj1 = lv_obj_create(lv_screen_active());lv_obj_set_size(obj1, 300, 300);lv_obj_align(obj1, LV_ALIGN_CENTER, -60, 0);lv_obj_set_style_bg_color(obj1, lv_color_hex(0x00FF00), 0); // 绿色lv_obj_set_style_border_width(obj1, 2, 0);lv_obj_set_style_border_color(obj1, lv_color_hex(0x003300), 0);/* 顶层对象 */obj2 = lv_obj_create(lv_layer_top());lv_obj_set_size(obj2, 100, 100);lv_obj_align(obj2, LV_ALIGN_CENTER, 0, 0);lv_obj_set_style_bg_color(obj2, lv_color_hex(0xFF0000), 0); // 红色lv_obj_set_style_border_width(obj2, 2, 0);lv_obj_set_style_border_color(obj2, lv_color_hex(0x330000), 0);/* 系统层对象 */obj3 = lv_obj_create(lv_layer_sys());lv_obj_set_size(obj3, 200, 200);lv_obj_align(obj3, LV_ALIGN_CENTER, 60, 0);lv_obj_set_style_bg_color(obj3, lv_color_hex(0x0000FF), 0); // 蓝色lv_obj_set_style_border_width(obj3, 2, 0);lv_obj_set_style_border_color(obj3, lv_color_hex(0x000033), 0);
这段代码是使用 LVGL(Light and Versatile Graphics Library) 创建并演示“三层屏幕结构”的经典示例:普通屏幕层、顶层和系统层。
🔍 整体作用
本示例创建了三个矩形对象(obj1、obj2、obj3),分别挂载在 不同层 上,并通过位置、颜色、尺寸来让它们可视化地叠加显示,从而清晰看出 LVGL 层级结构的优先级和遮挡关系。
✅ 普通屏幕层对象(绿色背景)
obj1 = lv_obj_create(lv_screen_active());
lv_obj_set_size(obj1, 300, 300);
lv_obj_align(obj1, LV_ALIGN_CENTER, -60, 0);
lv_obj_set_style_bg_color(obj1, lv_color_hex(0x00FF00), 0); // 绿色
lv_obj_set_style_border_width(obj1, 2, 0);
lv_obj_set_style_border_color(obj1, lv_color_hex(0x003300), 0);
📌 说明:
- 创建在当前屏幕(普通 UI 层)上。
- 宽高为
300x300
,相当大。 - 居中后左移
-60px
,偏左一点。 - 背景为绿色,边框较深绿。
📊 效果:
- 是最底层,任何在“顶层”和“系统层”的对象都会遮挡它。
✅ 顶层对象(红色面板)
obj2 = lv_obj_create(lv_layer_top());
lv_obj_set_size(obj2, 100, 100);
lv_obj_align(obj2, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_style_bg_color(obj2, lv_color_hex(0xFF0000), 0); // 红色
lv_obj_set_style_border_width(obj2, 2, 0);
lv_obj_set_style_border_color(obj2, lv_color_hex(0x330000), 0);
📌 说明:
- 创建在
lv_layer_top()
顶层,比普通层高。 100x100
,居中显示。- 红色背景,深红边框。
📊 效果:
- 会部分遮挡 obj1(绿色矩形)
- 不会被 obj1 遮挡。
- 会被 obj3 遮挡(系统层)
✅ 系统层对象(蓝色面板)
obj3 = lv_obj_create(lv_layer_sys());
lv_obj_set_size(obj3, 200, 200);
lv_obj_align(obj3, LV_ALIGN_CENTER, 60, 0);
lv_obj_set_style_bg_color(obj3, lv_color_hex(0x0000FF), 0); // 蓝色
lv_obj_set_style_border_width(obj3, 2, 0);
lv_obj_set_style_border_color(obj3, lv_color_hex(0x000033), 0);
📌 说明:
- 创建在
lv_layer_sys()
系统层,优先级最高。 200x200
,居中右移+60px
,偏右。- 蓝色背景,深蓝边框。
📊 效果:
- 会遮挡 obj1(屏幕层)、obj2(顶层)
- 不会被任何对象遮挡。
🖼️ 屏幕显示效果(视觉叠加图)
+-------------------------------------------------------------+
| |
| [obj3 蓝色 200x200] ← 最上面,偏右 |
| ________ |
| | | |
| | obj2 | ← 中间红色100x100(浮在obj1上) |
| |________| |
| |
| [obj1 绿色 300x300] ← 最下层,偏左 |
| |
+-------------------------------------------------------------+
你将看到:
- 一个大大的绿色矩形偏左。
- 一个中间红色小方块浮在绿色上方。
- 一个偏右的蓝色方块遮住了红色和绿色部分。
相关文章:

LVGL的三层屏幕结构
文章目录 🌟 LVGL 的三层屏幕架构1. **Top Layer(顶层)**2. **System Layer(系统层)**3. **Active Screen(当前屏幕层)** 🧠 总结对比🔍 整体作用✅ 普通屏幕层对象&…...

【PDF】使用Adobe Acrobat dc添加水印和加密
【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具: 1.Adobe Acrobat dc 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加保护加…...
AI 搜索引擎 MindSearch
背景 RAG是一种利用文档减少大模型的幻觉,AI搜索也是 AI 搜索引擎 MindSearch 是一个开源的 AI 搜索引擎框架,具有与 Perplexity.ai Pro 相同的性能。您可以轻松部署它来构建您自己的搜索引擎,可以使用闭源 LLM(如 GPT、Claude…...

Windows下安装mysql8.0
一、下载安装离线安装包 (下载过了,可以跳过) 下载网站:MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/ 二、安装mysql 三、安装完成验证...
【android bluetooth 框架分析 02】【Module详解 7】【VendorSpecificEventManager 模块介绍】
1. 背景 我们在 gd_shim_module 介绍章节中,看到 我们将 VendorSpecificEventManager 模块加入到了 modules 中。 // system/main/shim/stack.cc modules.add<hci::VendorSpecificEventManager>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module…...

水滴Android面经及参考答案
static 关键字有什么作用,它修饰的方法可以使用非静态的成员变量吗? static关键字在 Java 中有多种作用。首先,它可以用来修饰变量,被static修饰的变量称为静态变量。静态变量属于类,而不属于类的某个具体实例…...

工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
TDR真的是一个用来看阻抗跟Delay的好工具,通过一个Port的测试就可以看到通道各个位置的阻抗变化。 可是使用上其实没这么单纯,有很多细节需要非常地小心,才可以真正地看到您想看的信息! 就让我们整理3个极为重要的TDR使用小细节&…...

C++中的各式类型转换
隐式转换: 基本类型的隐式转换: 当函数参数类型非精确匹配,但是可以转换的时候发生 如: void func1(double x){cout << x << endl; }void func2(char c){cout << c << endl; }int main(){func1(2);//…...
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
这篇文章的内容是阿里云ACP人工智能高级工程师认证考试的模拟试题。 所有模拟试题由AI自动生成,主要为了练习和巩固知识,并非所谓的 “题库”,考试中如果出现同样试题那真是纯属巧合。 1、在PAl-Studio实验运行完毕后,可以右键单…...
如何使用scp命令拉取其他虚拟机中的文件
使用 SCP 命令拉取远程虚拟机文件 scp(Secure Copy)是基于 SSH 协议的安全文件传输工具,可以在本地与远程主机之间复制文件。以下是使用scp从其他虚拟机拉取文件的详细指南: 一、基本语法 bash # 从远程主机复制到本地 scp [选…...

Nacos源码—9.Nacos升级gRPC分析七
大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 14.gRPC简单介绍 10.gRPC客户端初始化分析 (1)gRPC客户端代理初始化的源码 (2)gRPC客户端启动的源码…...
从入门到精通:Drools全攻略
目录 一、Drools 初相识二、快速上手 Drools2.1 环境搭建2.2 第一个 Drools 程序 三、深入理解 Drools 核心概念3.1 规则(Rule)3.2 工作内存(Working Memory)3.3 知识库(Knowledge Base, KieBase)3.4 会话&…...
最大子段和(递推)
题目描述 给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数,表示序列的长度 n。 第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai。 输出格式 输出一行一个整数表示答案。 输…...

【计算机视觉】基于深度学习的实时情绪检测系统:emotion-detection项目深度解析
基于深度学习的实时情绪检测系统:emotion-detection项目深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法1) 数据预处理流程2) 改进型MobileNetV2 2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 数据集准备3.3 模型训练3.4 实时推理 4. 常见问题与解决方案4.…...
Windows CMD通过adb检查触摸屏Linux驱动是否被编译
检查 CONFIG_TOUCHSCREEN_GT9XX 是否启用,检查内核是否编译了Goodix GT9XX系列触摸屏的驱动支持 Windows CMD.exe输入: adb shell “zcat /proc/config.gz | grep CONFIG_TOUCHSCREEN_GT9XX” 如果返回CONFIG_TOUCHSCREEN_GT9XXy,表示驱动已编…...

【图像处理基石】什么是油画感?
在图像处理中,“油画感”通常指图像呈现出类似油画的块状纹理、笔触痕迹或色彩过渡不自然的现象,表现为细节模糊、边缘不锐利、颜色断层或人工纹理明显。这种问题常见于照片处理、视频帧截图或压缩后的图像,本质是画质受损的一种表现。以下是…...

AD PCB布线的常用命令
PCB布线顺序:先信号,再电源,再GNG 1.多根走线的应用 将IC上的引脚分类 更改一类引脚以及引线的颜色,画出走线(将脚引出) 选中这些走线,点击‘交互式总线布线’,便可以多根拉线 shi…...
Python操作Elasticsearch实战指南:从安装到性能调优的全链路解析
一、引言:为什么选择Python+Elasticsearch? Elasticsearch作为分布式搜索引擎,在日志分析、全文检索等场景中表现卓越。Python凭借其简洁语法和丰富生态,成为操作ES的首选语言。本文将带您从环境搭建到性能调优,系统掌握Python操作ES的核心技能。 二、环境准备:三步完成…...

【3-2】HDLC
前言 前面我们提到了 PSTN(Public Switched Telephone Network) ,今天介绍一种很少见的数据链路层的协议,HDLC! 文章目录 前言1. 定义2. 帧边界3. 零比特填充4. 控制字段4.1. 信息帧(I帧)4.2. …...

MySQL 学习(八)如何打开binlog日志
目录 一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)3.2 永久开启(需修改配置文件)3.3 验证是否开启成功3.4 查看 binlog 内容 四、高级配置建议五、注意事项六、开启后的日常维护 知识回顾&a…...
《数据库原理》部分习题解析
《数据库原理》部分习题解析 1. 课本pg196.第1题。 (1)函数依赖 若对关系模式 R(U) 的任何可能的关系 r,对于任意两个元组 t₁ 和 t₂,若 t₁[X] t₂[X],则必须有 t₁[Y] t₂[Y],则称属性集 Y 函数依赖…...

OpenCV进阶操作:光流估计
文章目录 前言一、光流估计1、光流估计是什么?2、光流估计的前提?1)亮度恒定2)小运动3)空间一致 3、OpenCV中的经典光流算法1)Lucas-Kanade方法(稀疏光流)2) Farneback方…...
uniapp+vue3开发项目之引入vuex状态管理工具
前言: 我们在vue2的时候常用的状态管理工具就是vuex,vue3开发以后,又多了一个pinia的选项,相对更轻便,但是vuex也用的非常多的,这里简单说下在uni-app中vuex的使用。 实现步骤: 1、安装&#x…...
SparkSQL 连接 MySQL 并添加新数据:实战指南
SparkSQL 连接 MySQL 并添加新数据:实战指南 在大数据处理中,SparkSQL 作为 Apache Spark 的重要组件,能够方便地与外部数据源进行交互。MySQL 作为广泛使用的关系型数据库,与 SparkSQL 的结合可以充分发挥两者的优势。本文将详细…...
面试题:请解释Java中的设计模式,并举例说明单例模式(Singleton Pattern)的实现方式
Java中的设计模式 设计模式是在软件开发过程中针对特定场景而使用的通用解决方案。设计模式可以帮助开发者编写出更加清晰、灵活和可维护的代码。设计模式分为三大类: 创建型模式:用于对象的创建过程,如单例模式、工厂模式、建造者模式等。…...

4. 文字效果/2D-3D转换 - 3D翻转卡片
4. 文字效果/2D-3D转换 - 3D翻转卡片 案例:3D产品展示卡片 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">.scene {width: 300px;height…...
嵌入式学习笔记 - 关于单片机的位数
通常我们经常说一个单片机是8位的,16位的,32位的,那么怎么判断一款单片机的位数是多少位呢,判断的依据是什么呢, 一 单片机的位数 单片机的位数是指单片机数据总线的宽度,也就是一次能处理的数据的位数&a…...

【AI News | 20250513】每日AI进展
AI Repos 1、iap-diffusion-labs 从零开始带我们构建完整的扩散模型。通过三个精心设计的实验练习,循序渐进地引导我们实现流匹配和扩散模型,从基础 SDE 到条件图像生成,每一步都有详尽指导和完整代码,让复杂理论简单易懂。主要内…...

mybatisplus 集成逻辑删除
一开始,没去查资料,后面要被AI气死了,先看它的的话 一开始,看ai的描述,我还以为,不需要改数据库,mybatis-puls自动拦截集成就可以实现逻辑删除,c,最后还是要给数据库加一…...
typedef unsigned short uint16_t; typedef unsigned int uint32_t;
你提到的这两行是 C/C 中的类型别名定义: typedef unsigned short uint16_t; typedef unsigned int uint32_t;它们的目的是让代码更具可读性和可移植性,尤其在处理精确位数的整数时非常有用。 ✅ 含义解释 typedef unsigned short uint16_t;…...