文章目录
- 一、LVGL
- [二、LVGL 版本选择](#二、LVGL 版本选择)
-
- [ 1、V8.3(经典稳定版)](# 1、V8.3(经典稳定版))
- [ 2、V9.x(新版主推)](# 2、V9.x(新版主推))
- [三、LVGL 核心运行机制(四大必懂核心)](#三、LVGL 核心运行机制(四大必懂核心))
-
- [ 1、lv_init() 库初始化](# 1、lv_init() 库初始化)
- [ 2、lv_tick_inc(ms)系统节拍](# 2、lv_tick_inc(ms)系统节拍)
- [ 3、lv_timer_handler() UI 任务内核](# 3、lv_timer_handler() UI 任务内核)
- [ 4、lv_display_flush_ready() 刷新完成通知](# 4、lv_display_flush_ready() 刷新完成通知)
- [四、LVGL 三大硬件驱动层](#四、LVGL 三大硬件驱动层)
-
- [ 1、显示驱动 Display](# 1、显示驱动 Display)
- [ 2、输入驱动 INDEV](# 2、输入驱动 INDEV)
- [ 3、时间驱动 Tick](# 3、时间驱动 Tick)
- 五、开发平台
-
- [ 1、PC平台](# 1、PC平台)
- [ 2、MCU平台](# 2、MCU平台)
- [ 3、MPU Linux 平台](# 3、MPU Linux 平台)
- 六、核心概念
-
- [ 1、Object 对象(lv_obj_t)](# 1、Object 对象(lv_obj_t))
- [ 2、Screen 屏幕](# 2、Screen 屏幕)
- [ 3、Style 样式(lv_style_t)](# 3、Style 样式(lv_style_t))
- [ 4、Event 事件系统(lv_event_t)](# 4、Event 事件系统(lv_event_t))
- [ 5、Timer 软件定时器(lv_timer_t)](# 5、Timer 软件定时器(lv_timer_t))
- [ 6、Memory 内存管理](# 6、Memory 内存管理)
- [ 7、Tick 节拍](# 7、Tick 节拍)
- 七、渲染概念
-
- [ 1、Dirty area 脏区(核心机制)](# 1、Dirty area 脏区(核心机制))
- [ 2、Display 显示设备 lv_disp_t](# 2、Display 显示设备 lv_disp_t)
- [ 3、Input device 输入设备 lv_indev_t](# 3、Input device 输入设备 lv_indev_t)
- [ 4、Draw 绘制管线](# 4、Draw 绘制管线)
- [八、布局 Layout概念](#八、布局 Layout概念)
-
- [ 1、Flex(弹性布局,最常用):](# 1、Flex(弹性布局,最常用):)
- [ 2、Grid(网格布局):](# 2、Grid(网格布局):)
- [九、Widgets 控件](#九、Widgets 控件)
- [十、Extra 扩展模块(lv_conf.h 开关控制)](#十、Extra 扩展模块(lv_conf.h 开关控制))
一、LVGL
LVGL(Light and Versatile Graphics Library)是一款开源、轻量级、跨平台的嵌入式 GUI 图形库。
核心定位:纯软件绘图、与硬件无关、适配所有MCU/RTOS。
特点总结:
纯 C 语言、无依赖、MIT 开源(商用免费)。
资源占用极低:最小 RAM 8KB、Flash 64KB 即可运行。
自带控件、样式、动画、布局、事件系统。
只负责生成像素数据,不操作屏幕硬件。
支持裸机 / FreeRTOS / RT-Thread / ESP-IDF / Linux。
二、LVGL 版本选择
1、V8.3(经典稳定版)
兼容性最好,旧项目主流版本。
IDF4.x 全系推荐使用。
驱动结构体:lv_disp_drv_t / lv_indev_drv_t。
2、V9.x(新版主推)
API 更简洁、性能优化、内存管理升级。
IDF5.x 官方默认适配版本。
驱动结构体更名:lv_display_t / lv_indev_t。
硬性规则:项目中 不能混用 V8/V9 代码,否则编译报错、运行崩溃。
三、LVGL 核心运行机制(四大必懂核心)
LVGL 能跑起来,只依赖四个核心机制,是所有开发的基础。
1、lv_init() 库初始化
初始化 LVGL 内核、内存池、控件、样式系统,程序启动执行一次。
2、lv_tick_inc(ms)系统节拍
为 LVGL 提供时间基准,用于动画、倒计时、长按判定。
必须放在定时器中精准调用(一般 1ms 中断)。
不调用:所有动画、长按、定时器全部失效。
3、lv_timer_handler() UI 任务内核
处理:界面刷新、事件检测、动画运算、控件状态更新。
裸机:while(1) 循环调用。
RTOS:单独低优先级任务循环调用。
铁律:所有 LVGL 控件操作,必须和该函数同任务。
4、lv_display_flush_ready() 刷新完成通知
放在屏幕刷新回调函数末尾。
告知 LVGL:像素数据已经写完,可以刷新下一帧。
不调用:界面卡死、花屏、停止刷新。
四、LVGL 三大硬件驱动层
LVGL 本身不碰硬件,需要用户/官方端口对接三个驱动:
1、显示驱动 Display
作用:定义屏幕分辨率、颜色格式、绘制缓冲区、刷屏回调。
核心:draw_buf 绘制缓冲区。
单缓冲:省内存、轻微闪烁。
双缓冲:流畅无撕裂、占用双倍 RAM。
ESP32-S3 必须将缓冲区放在 PSRAM,否则内存溢出崩溃。
2、输入驱动 INDEV
对接:触摸屏、按键、编码器、鼠标。
作用:上报坐标、按下/松开状态给 LVGL。
3、时间驱动 Tick
即 lv_tick_inc,提供系统毫秒时钟。
五、开发平台
1、PC平台

2、MCU平台

3、MPU Linux 平台

六、核心概念
1、Object 对象(lv_obj_t)
LVGL 万物皆对象。按钮、标签、图片、窗口,全部继承 lv_obj_t。
对象树:父子层级,父对象裁剪子对象(子超出父区域自动截断)
属性:坐标、大小、样式、事件、可见性
API:lv_obj_create(parent) 创建;lv_obj_set_pos/size() 设置位置大小
示例:lv_obj_t *label = lv_label_create(lv_screen_active()); lv_screen_active():获取当前激活屏幕(顶层父对象)
2、Screen 屏幕
特殊对象,GUI 的根。
可以多屏幕切换 lv_screen_load(),一次只显示一个 screen。
3、Style 样式(lv_style_t)
解耦 UI 数据和控件,类似 CSS。颜色、圆角、边框、阴影、padding、文字大小透明度。
支持状态:默认、按下、聚焦、禁用等(LV_STATE_PRESSED)
可多个样式叠加;可全局 / 局部样式
写法:lv_style_set_bg_color(&style, lv_color_hex(0x3366ff));
绑定:lv_obj_add_style(obj, &style, LV_STATE_DEFAULT);
4、Event 事件系统(lv_event_t)
控件交互核心,回调驱动。
常见事件:LV_EVENT_CLICKED点击、LV_EVENT_PRESSING按下、LV_EVENT_VALUE_CHANGED值变化(滑块 / 开关)、LV_EVENT_DRAW_PART_BEGIN绘制回调
注册:lv_obj_add_event_cb(obj, event_handler, LV_EVENT_CLICKED, user_data);
在回调内:lv_event_get_target(e) 获取触发对象;lv_event_get_user_data(e)拿到自定义参数
5、Timer 软件定时器(lv_timer_t)
LVGL 内部软件定时器,不是硬件定时器,由 lv_timer_handler() 轮询驱动。
用途:动画、周期刷新 UI、轮询传感器。
注意:lv_timer_handler()必须周期性调用(10~20ms 一次),V9 必调用。
6、Memory 内存管理
LVGL 自带内存池,LV_MEM_SIZE 在lv_conf.h配置。
所有对象、样式、图片 buffer 从这个池分配
内存碎片风险:频繁创建删除对象会产生碎片;产品尽量预分配对象
可替换成 malloc/free(配置项)
7、Tick 节拍
lv_tick_inc(uint32_t tick_period) 给 LVGL 提供系统时间基准。裸机 / RTOS 都要提供,单位 ms。
模拟器:SDL 提供;ESP32:用 ESP-IDF 系统节拍。
七、渲染概念
1、Dirty area 脏区(核心机制)
对象修改后(改文字、移动、样式变化)标记脏区,只重绘脏的区域,不是全屏刷新,节省 CPU。
流程:修改 obj → 标记脏区 → lv_timer_handler触发绘制 → 渲染脏区到 buffer → flush 回调推送屏幕。
2、Display 显示设备 lv_disp_t
移植重点,对接屏幕。
Display buffer:渲染缓冲区(单 buffer / 双 buffer / 部分 buffer)
lv_disp_flush_cb():刷屏回调。LVGL 画好像素,调用这个函数,由底层驱动把 buffer 送到屏幕(SDL/ST7789)
双 buffer 优势:渲染下一帧的同时屏幕传输上一帧,减少撕裂
3、Input device 输入设备 lv_indev_t
输入抽象层:触摸、鼠标、编码器、按键。
类型:LV_INDEV_TYPE_POINTER触摸 / 鼠标;LV_INDEV_TYPE_ENCODER旋转编码器;LV_INDEV_TYPE_KEYPAD按键
回调:周期性上报坐标 / 按键状态给 LVGL
PC 模拟器:鼠标作为 pointer;ESP32:XPT2046 触摸芯片
4、Draw 绘制管线
Draw unit:绘制单元,分软件渲染 / GPU 加速(DMA2D、PPA、VG-Lite)
图元绘制:矩形、文字、圆弧、图片、蒙版、透明度混合
V9 新架构:draw unit 解耦,很容易接入硬件 GPU 加速(ESP32-S3 PPA)
八、布局 Layout概念
1、Flex(弹性布局,最常用):
类似前端 flex。自动排列子控件,自动换行、对齐。
lv_obj_set_flex_flow()、lv_obj_set_flex_align()
2、Grid(网格布局):
表格式,按行和列分配单元格。适合仪表盘、矩阵按钮。
推荐:简单排列用 Flex;规整矩阵界面用 Grid,尽量少手动写坐标lv_obj_set_pos。
九、Widgets 控件
全部在 src/widgets,是预封装好的对象。
基础:label 文字、btn 按钮、img 图片、slider 滑块、switch 开关、checkbox 复选框。
复杂:tabview 分页、list 列表、textarea 文本输入、roller 滚轮选择、chart 图表、msgbox 弹窗。
每个控件都有专属属性,同时继承 obj 的通用属性(位置、样式、事件)。
十、Extra 扩展模块(lv_conf.h 开关控制)
Font 字体:内置点阵字体;工具生成自定义字体(中文必须自己生成)。
Image decoder 图片解码器:PNG/JPG/GIF/SVG/Lottie 矢量动画。
File system FS:对接文件系统,读取 SD 卡 /flash 里图片字体。
Themes 主题:预设整套样式,一键切换 UI 风格。