跳转到内容

LVGL 图形库介绍

LVGL 图形库介绍

本节详细介绍 LVGL 开源图形库的技术特性和能力边界。学习完成后,您将能够:

  • 理解 LVGL 的核心架构和运行机制
  • 掌握 LVGL 的关键技术指标和资源需求
  • 评估 LVGL 是否适用于特定嵌入式显示场景
  • 说明 GUI 方案的技术选型依据

在开始本节之前,请确保:

  • 已完成智能家居系统概述学习
  • 了解基本的嵌入式系统概念
  • 了解 GUI 框架的基本概念
┌─────────────────────────────────────┐
│ User Application │
│ (智能家居面板、控制界面、仪表板) │
├─────────────────────────────────────┤
│ LVGL 对象系统 │
│ (Widgets, Styles, Animations, │
│ Layouts, Events) │
├─────────────────────────────────────┤
│ LVGL Core Engine │
│ (Display Driver, Input Driver, │
│ Memory Management, Task System) │
├─────────────────────────────────────┤
│ Hardware Abstraction │
│ (TFT_eSPI, lv_drivers, HAL) │
├─────────────────────────────────────┤
│ ESP32 Hardware │
│ (SPI, I2C, GPIO, PSRAM, DMA) │
└─────────────────────────────────────┘

LVGL 的核心是一个层级化的对象(Widget)系统:

lv_obj_t (根 - 屏幕 screen)
├── lv_obj_t (容器 container)
│ ├── lv_label_t (标签 - 显示温度)
│ ├── lv_btn_t (按钮 - 控制灯光)
│ │ └── lv_label_t (按钮文字)
│ └── lv_slider_t (滑块 - 调节音量)
├── lv_obj_t (容器 2)
│ ├── lv_switch_t (开关 - 控制插座)
│ └── lv_chart_t (图表 - 温度曲线)
└── lv_obj_t (状态栏)
├── lv_label_t (WiFi 图标)
└── lv_label_t (时钟)

对象生命周期

创建: lv_obj_create(parent) → 设置属性 → 添加到屏幕
显示: LVGL 自动渲染所有可见对象
事件: 用户触摸 → 事件触发 → 回调函数
销毁: lv_obj_del(obj) → 释放内存
配置项最低要求推荐配置说明
RAM64KB200KB+(含 PSRAM)帧缓冲 + 控件对象
Flash128KB1MB+库本体 + 字体 + 资源
CPU 频率80MHz240MHz刷新率和动画流畅度
显示缓冲区1/10 屏幕全屏双缓冲影响刷新率和撕裂效果
特性LVGL 8.xLVGL 9.x
发布时间20212023
核心 API稳定成熟有较大变更
内存优化优秀进一步优化
新控件基础控件新增图表、表格增强
ESP32 兼容性⭐⭐⭐⭐⭐⭐⭐⭐⭐(部分库更新中)
推荐使用稳定项目新项目开发

建议:对于本项目,推荐使用 LVGL 8.3.x,因为它在 ESP32 平台上经过充分测试,文档和社区支持丰富。

LVGL 提供 30+ 内置控件:

控件类型控件名称智能家居应用
基础Label、Button、Image显示文字、按钮
输入Slider、Switch、Roller调光、开关 、选择
容器Container、TabView、TileView页面布局、分页
数据Chart、Table、Calendar温度曲线、日程
反馈MessageBox、Bar、Arc弹窗确认、进度显示

LVGL 的样式系统类似于 CSS:

样式属性:
- 背景: 颜色、渐变、圆角、透明度
- 边框: 宽度、颜色、圆角
- 文字: 字体、颜色、对齐方式
- 阴影: X/Y 偏移、模糊、透明度
- 变换: 缩放、旋转、平移
- 过渡: 动画过渡效果
样式层级:
lv_style_t → 应用到对象 (对象级样式)
→ 应用到主题 (主题级样式)
→ 应用到部件 (部件默认样式)
触摸事件:
- LV_EVENT_CLICKED → 按钮点击
- LV_EVENT_PRESSING → 触摸滑动
- LV_EVENT_VALUE_CHANGED → 数值变化
- LV_EVENT_LONG_PRESSED → 长按
对象事件:
- LV_EVENT_DELETE → 删除对象
- LV_EVENT_CHILD_CHANGED → 子对象变化
- LV_EVENT_REFRESH → 刷新
动画类型说明示例
位移动画X/Y 坐标变化页面滑动切换
透明度动画透明值 0-255页面渐入/渐出
缩放动画缩放比例按钮点击效果
旋转动画角度变化加载指示器
数值动画自定义值温度计数值变化
缓冲区配置帧率(320×240)帧率(480×320)说明
单缓冲 1/10 屏幕25-30 fps15-20 fps最低配置
单缓冲 1/4 屏幕35-40 fps25-30 fps推荐
双缓冲 1/2 屏幕40-50 fps30-35 fps流畅
全屏双缓冲50-60 fps35-45 fps最高配置(需 PSRAM)
LVGL 核心库: ~30KB (flash)
默认字体 (16px): ~5KB (flash)
中文字体 (16px, 2000字): ~30KB (flash)
每个对象开销: ~20-50 字节 (RAM)
全屏帧缓冲 (320×240×2): ~150KB (RAM)
全屏帧缓冲 (480×320×2): ~300KB (RAM)

售前提示:中文显示需要额外的字体存储空间。中文字体文件通常在 30KB-200KB 之间,取决于选择标准和包含的字符数量。

能力说明沟通要点
控件丰富度30+ 内置控件”按钮、滑块、图表等一应俱全”
触摸交互完善的触摸事件系统”支持点击、滑动、长按、手势”
界面美观度样式 + 动画系统”可以实现现代 UI 风格的界面”
ESP32 适配成熟稳定”在 ESP32 上经过充分验证”
开源许可MIT 许可证”无版权费,可商用”

本节介绍了 LVGL 图形库的核心特性:

  1. 架构:层次化对象系统 + 事件驱动 + 硬件抽象层
  2. 资源需求:最低 64KB RAM + 128KB flash,推荐 200KB+ RAM
  3. 核心能力:30+ 控件、CSS 类样式、丰富动画、触摸支持
  4. 性能:320×240 屏幕可达 25-50fps,取决于缓冲区配置
  5. 中文支持:需要额外字体文件,约 30-200KB