LVGL是一款开源轻量的嵌入式图形库,专门用于单片机等资源有限的设备,能轻松做出按钮、文字、动画等界面,用C语言就能开发。

但直接开发容易出现UI和业务代码混写、项目杂乱难维护的问题。本文用通俗的话,教你跑通基础Demo、学会MVP分层架构,还能搞定动画资源的便捷处理。


一、LVGL基础入门:极简可跑Demo

1. 核心基础概念

  • 对象:按钮、文字、图片等所有UI元素,都叫对象。

  • 屏幕:界面的根容器,所有控件都要放在屏幕上。

  • 事件:处理点击、长按等用户操作的方式。

  • 主循环:LVGL靠它持续刷新界面、处理交互。

2. 基础Demo代码

#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"

int main(void)
{
    // 初始化LVGL核心
    lv_init();
    // 初始化屏幕、触摸驱动
    lv_port_disp_init();
    lv_port_indev_init();

    // 创建居中文字
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello LVGL!");
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);

    // 创建按钮
    lv_obj_t *btn = lv_btn_create(lv_scr_act());
    lv_obj_set_size(btn, 120, 50);
    lv_obj_align(btn, LV_ALIGN_CENTER, 0, 60);

    // 按钮文字
    lv_obj_t *btn_label = lv_label_create(btn);
    lv_label_set_text(btn_label, "Click Me");

    // 按钮点击事件
    static void btn_event_cb(lv_event_t *e)
    {
        lv_label_set_text(label, "已点击!");
    }
    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);

    // LVGL主循环
    while (1) {
        lv_timer_handler();
        usleep(5000);
    }
    return 0;
}

3. 运行效果

屏幕中央显示提示文字,下方有一个可点击按钮,点击后居中文字会发生变化,这就是LVGL最基础的界面交互逻辑。


二、原生LVGL开发痛点

入门写小Demo很简单,但项目做大后,问题就很明显:

  • UI布局、业务逻辑、数据处理代码混在一起,又乱又难读。

  • 页面多了之后,跳转逻辑混乱,改一处牵一发而动全身。

  • 代码耦合度高,换硬件、改功能、维护升级成本极高。

  • 多人协作开发,分工不清,极易出现代码冲突。

想要解决这些问题,MVP分层架构是最适合LVGL的解决方案,能彻底理清代码结构。


三、MVP架构在LVGL中的落地

1. 通俗理解MVP三层

View(视图层)

只负责做界面:画控件、排布局、调样式、播动画,不碰任何业务逻辑。

Model(模型层)

只负责做业务:联网、传感器读取、数据存储、功能逻辑,不依赖LVGL。

Presenter(调度层)

相当于中间桥梁,接收界面操作、调用业务逻辑、再通知界面刷新,彻底隔离View和Model。

2. 项目目录结构

project/
├── view/       // 界面布局代码
├── model/      // 业务功能代码
├── presenter/  // 中间调度代码
└── lvgl/       // LVGL图形库

3. 执行流程

  1. 用户点击按钮,View把事件传给Presenter

  2. Presenter调用Model处理业务

  3. Model返回数据给Presenter

  4. Presenter调用View刷新界面

4. MVP优势

  • 代码分工明确,结构清晰,可读性、维护性大幅提升

  • 界面和业务完全分离,方便测试、跨平台复用

  • 改界面不动业务,改业务不动界面,减少bug

  • 适合中大型项目,多人协作更高效


四、LVGL帧动画实现+资源工程化处理

LVGL里实现表情、动态图标这类效果,最常用、最稳定的就是逐帧动画:把动画拆成多张连续的静态图片,定时切换图片,就形成流畅动画。

1. 图片转C代码(工程化方案)

嵌入式开发中,图片无法直接使用,需要转换成C语言数组格式。我们可以用Python脚本,一键将PNG/JPG帧图片,转换成LVGL可直接调用的.c和.h文件,完全不用手动编写繁琐的二进制数组。

2. 脚本转换核心优点

  • 自动生成合法C语言变量名,避免语法报错

  • 标准化生成LVGL适配格式,直接调用无门槛

  • 支持增量更新,图片不变则不重复生成,节省编译时间

  • 省去手动编写资源代码的工作量,减少人为失误

3. 动画播放

将转换后的资源加入项目,通过定时器定时切换图片,就能实现流畅的逐帧动画,代码简洁,运行稳定,适配各类嵌入式屏幕。


总结

LVGL轻量好用,是嵌入式GUI开发的首选,能快速做出界面;MVP架构能解决代码混乱、难维护的问题,让项目更规范。

加上脚本自动处理图片资源,不用手动写代码,这套LVGL+MVP方案,不管做简单界面还是带动画的产品,都好用又省心。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐