news 2026/6/10 0:26:30

lvgl界面编辑器新手教程:从创建按钮到页面切换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
lvgl界面编辑器新手教程:从创建按钮到页面切换

从零开始用 lvgl 界面编辑器:做一个能跳转的按钮,就这么简单

你有没有过这样的经历?
写了一堆 LVGL 的代码,改了十几次xy坐标才把一个按钮放到屏幕中间;换了个屏幕分辨率,整个布局又乱了;想加个动画还得翻手册查参数……

如果你点头了,那这篇文就是为你准备的。

我们今天不讲复杂理论,也不堆砌术语。就干一件事:用 lvgl 界面编辑器,从新建项目开始,拖一个按钮出来,点它就能切换页面——全程可视化操作,生成可运行代码,适合刚接触嵌入式 GUI 的新手快速上手。

更重要的是,我会告诉你“为什么这么做”,而不仅仅是“照着点”。


为什么你现在应该试试 lvgl 界面编辑器?

先说个现实:以前做嵌入式 UI,基本靠手敲 C 代码。比如创建个按钮:

lv_obj_t *btn = lv_btn_create(lv_scr_act()); lv_obj_set_size(btn, 100, 40); lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);

没问题,这很标准。但问题是——UI 设计师看不懂这段代码,你也懒得反复编译去调位置

这时候,“可视化工具”就成了刚需。

lvgl 界面编辑器(通常指 SquareLine Studio 或类似的 GUI Builder)就是为了解决这个问题诞生的。它让你像用 Figma 或 Photoshop 一样设计界面,然后一键导出 C 代码,直接集成进你的工程里。

它的核心价值不是“能不能做”,而是:
-:五分钟搭出一页 UI;
-:所见即所得,不用猜坐标;
-省心:样式、事件、动画都能在图形界面上配置;
-协作友好:UI 和逻辑可以分头并行开发。

别被“编辑器”三个字吓到,它其实比你想得更接地气。


第一步:创建两个页面,一个叫主页,一个叫设置页

LVGL 本身没有“页面”的概念,但它有“屏幕”(screen)。你可以把每个lv_obj_t *当成一个独立的屏幕来加载。

在 lvgl 界面编辑器中,第一步就是建两个“Screen”对象:

  1. 打开编辑器,新建项目,设置屏幕尺寸(比如 320x240);
  2. 拖一个Screen组件进来,重命名为home_screen
  3. 再拖一个Screen,重命名为setting_screen

这两个就是你的“页面”。它们彼此独立,不会同时显示,通过点击按钮来切换。

小知识:在底层,lv_obj_create(NULL)创建的对象就是顶级屏幕,和lv_scr_act()获取的是同一类东西。编辑器只是把这些操作变成了“拖拽”。


第二步:给主页加个按钮,点一下跳转到设置页

接下来是重点:我们要在这个主页上放一个按钮,并让它具备“点击后跳转”的功能。

1. 拖一个 Button 控件

从控件库找到Button,拖到home_screen上。你会看到它自动居中对齐(很多编辑器默认开启吸附功能),也可以手动调整大小和位置。

双击按钮上的文字,改成 “Go to Settings”。

提示:按钮其实是个容器,真正的文字是在里面嵌套了一个 Label。但编辑器帮你隐藏了这些细节,你只需要关心“看起来怎么样”。

2. 设置样式(颜色、圆角、字体等)

选中按钮,在右侧属性面板里可以改:
- 背景色(Background Color)
- 圆角半径(Radius)
- 字体大小(Font Size)
- 边框(Border Width / Color)

改完立刻就能在预览窗口看到效果,不用烧录、不用重启。这就是实时预览(WYSIWYG)的魅力。

比如你想做个现代感强的按钮,可以把背景设成蓝色,圆角设成 10px,字体加粗——几下点完,搞定。

3. 绑定点击事件:跳转到设置页

这才是关键一步。

在按钮的“事件”或“行为”选项卡里,找到Clicked事件(对应 LVGL 的LV_EVENT_CLICKED),然后添加动作:

👉Action: Load Screen
👉Target: setting_screen

意思是:“当这个按钮被点击时,加载setting_screen这个页面。”

背后的代码其实是这样的:

lv_obj_add_event_cb(btn, event_handler, LV_EVENT_CLICKED, NULL); void event_handler(lv_event_t *e) { if (lv_event_get_code(e) == LV_EVENT_CLICKED) { lv_scr_load(setting_screen); // 切换屏幕 } }

但你完全不用自己写!编辑器会自动生成这部分逻辑。


第三步:在设置页加个返回按钮

同理,在setting_screen上也拖一个按钮,文字改为 “Back”,绑定Clicked事件,动作设为:

👉Load Screen → home_screen

这样就实现了双向跳转。

如果你想让切换带点动画感,比如淡入淡出或者滑动入场,可以在“屏幕加载”设置里选择:

  • Fade In
  • Slide Left/Right
  • 动画时长(如 300ms)

生成的代码会变成:

lv_scr_load_anim(setting_screen, LV_SCR_LOAD_ANIM_FADE_IN, 300, 0, false);

是不是比手敲舒服多了?


自动生成的代码长什么样?

当你完成设计后,点击“生成代码”按钮,编辑器会输出类似下面的内容:

// 在 main.c 中调用一次 void gui_init(void) { create_home_screen(); // 初始化主页 create_setting_screen(); // 初始化设置页 lv_scr_load(home_screen); // 默认显示主页 }

每个页面都有一个create_xxx()函数,负责创建所有控件、设置样式、绑定事件。你只需要在主程序启动时调用一遍,剩下的交给 LVGL 内核处理。

而且这些函数通常是幂等的——即使不小心调两次,也不会崩溃(当然建议只调一次)。


那些你可能踩过的坑,我替你试过了

虽然编辑器大大简化了流程,但实际使用中还是有些“潜规则”需要注意:

❌ 坑点一:页面太多导致内存爆掉

LVGL 是基于对象管理的,每个控件都会占用 RAM。如果你一次性创建五个页面,每个页面几十个控件,MCU 内存可能扛不住。

秘籍:按需创建 + 及时销毁
只在要用的时候创建页面,离开时用lv_obj_del(page)删除。或者使用“单页面动态更新”策略,减少同时存在的对象数量。


❌ 坑点二:字体太大,编译失败

编辑器默认可能会给你加上大号字体(比如 24pt 的中文),结果生成的字体数组动辄几百 KB,Flash 直接不够。

秘籍:精简字体范围
在编辑器里设置字体时,只包含你需要的字符(比如“设置 主页 返回”这几个字),不要全量打包 GBK 或 Unicode。


❌ 坑点三:布局在小屏上溢出

你在电脑上看得好好的布局,放到 240x280 的小屏幕上发现文字被截断了。

秘籍:用 Flex 布局代替绝对定位
在编辑器里启用 Flex 布局模式,让控件自动适应父容器宽度。例如标题居中、按钮水平排列,Flex 几乎是必选项。


❌ 坑点四:事件回调函数名冲突

多个按钮都用了默认的event_handler,结果编译时报重复定义。

秘籍:编辑器支持自定义回调名,或者生成独立函数
高级编辑器允许你为每个控件指定不同的回调函数名,避免命名冲突。如果不行,后期手动改也行,但最好一开始就规划好。


它真的能替代手写代码吗?

我的答案是:对于 80% 的常规需求,完全可以。

特别是以下场景:
- 快速原型验证
- 固定菜单结构的产品(如家电面板、工业 HMI)
- 团队中有非程序员参与 UI 设计

但对于高度定制化的需求,比如:
- 自定义绘图动画
- 复杂状态机控制
- 极致资源优化

那你还是得深入到底层 API,甚至直接操作draw_ctx

但没关系——编辑器生成的代码是干净、可读、模块化的,你可以放心地在上面二次开发。


最后一句真心话

学习 lvgl 界面编辑器,不是为了“偷懒”,而是为了把精力留给真正重要的事

比如:
- 用户体验是否流畅?
- 操作路径是否合理?
- 界面信息是否清晰?

而不是纠结“这个 label 怎么又偏了 2px”。

技术的本质是解决问题,而不是制造障碍。当你能用拖拽完成原本要写上百行代码才能实现的功能时,你就已经赢了。


如果你现在正打算做一个带菜单切换的小设备,不妨花半小时试试 lvgl 界面编辑器。
说不定,你今晚就能看到第一个带动画跳转的界面跑在开发板上了。

动手才是最好的入门方式。

有问题?欢迎留言讨论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 19:58:26

Sonic模型能否支持Flow-based生成?概率密度建模

Sonic模型能否支持Flow-based生成?概率密度建模 在AI生成内容(AIGC)浪潮席卷数字人领域的当下,一个看似技术细节的问题却牵动着许多开发者和创作者的神经:Sonic这类语音驱动口型同步模型,是否基于Flow-base…

作者头像 李华
网站建设 2026/6/9 7:22:52

Sonic模型详解:高精度唇形对齐与自然表情生成的秘密

Sonic模型详解:高精度唇形对齐与自然表情生成的秘密 在虚拟主播24小时不间断带货、AI教师精准讲解课程、数字客服实时响应咨询的今天,我们正悄然进入一个由“会说话的脸”驱动的内容新纪元。而这一切的背后,往往只需要一张静态人像和一段音频…

作者头像 李华
网站建设 2026/6/10 0:45:14

STM32CubeMX点亮LED灯:STM32F1系列入门必看教程

从零开始点亮第一盏灯:STM32CubeMX STM32F1 实战入门指南 你有没有过这样的经历?买了一块STM32开发板,兴冲冲地插上电脑,打开IDE,却卡在“下一步该做什么”——寄存器不会配、时钟树看不懂、GPIO初始化写不对……最后…

作者头像 李华
网站建设 2026/6/9 22:01:18

Kent Beck 最新思考:AI 时代的“一人派对”,代码审查的终结与重生

大家好,我是Tony Bai。“以前是‘嘿,能在合并前帮我看一眼吗?’……现在是‘我在海滩上和一个神灯精灵结对编程’。”极限编程 (XP) 和测试驱动开发 (TDD) 的奠基人 Kent Beck,最近发表了一篇题为《Party of One for Code Review!…

作者头像 李华
网站建设 2026/6/6 12:07:34

51单片机流水灯代码keil操作指南:新手快速上手

从点亮第一盏灯开始:51单片机流水灯实战全解析你有没有过这样的经历?打开Keil,新建一个工程,照着教程敲下几行代码,编译、下载、上电……然后,那排LED灯像被施了魔法一样,依次亮起又熄灭——那一…

作者头像 李华