news 2026/8/22 11:30:00

LVGL 开发笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LVGL 开发笔记

LVGL采用的是一种面对对象编程思维,在 C语言中,并没有“类”的概念,而LVGL通过结构体的形式实现了“类”的功能(并 非真的“类”),具体的实现逻辑如下图所示:

lv_obj_t 定义控件(界面、按钮、文本)变量 必须是指针类型

LVGL 的所有样式设置、坐标对齐、事件绑定函数,参数类型统一都是lv_obj_t *;同时lv_obj_t 结构体的大小并不是完全固定死的,它会根据你在 lv_conf.h 里的配置(比如是否开启扩展属性、是否开启用户数据 LV_USE_USER_DATA、开启了哪些模块)而在编译期改变结构体的大小,因此在 LVGL 中定义控件变量时,必须(且只能)是指针类型(lv_obj_t *)

lv_obj_create() 创建容器、界面,常用它创建界面、自定义控件的基础

创建新界面首先要获取屏幕正在显示的活动屏幕对象,lv_scr_act() 是 lv_screen_active()(或 lv_scr_act 宏)的缩写,它是整个 UI 树的根节点(Root Node)。

在 LVGL 中,所有控件都遵循父子树形结构(Parent-Child Tree)。创建任何控件或容器(比如 lv_obj_create)时,必须指定一个“父对象”(parent):

lv_obj_t *scr = lv_scr_act();

lv_obj_t *page = lv_obj_create(scr);

lv_obj_create这些创建函数返回一个lv_obj_t类型的指针,指向你创建的控件lv_obj_t结构体

lv_obj_t结构体:

typedef struct _lv_obj_t {

const lv_obj_class_t * class_p;

struct _lv_obj_t * parent;

_lv_obj_spec_attr_t * spec_attr;

_lv_obj_style_t * styles;

#if LV_USE_USER_DATA

void * user_data;

#endif

lv_area_t coords;

lv_obj_flag_t flags;

lv_state_t state;

uint16_t layout_inv : 1;

uint16_t scr_layout_inv : 1;

uint16_t skip_trans : 1;

uint16_t style_cnt : 6;

uint16_t h_layout : 1;

uint16_t w_layout : 1;

} lv_obj_t;

里面包含控件类型,父对象,样式列表

先获取当前正在显示的屏幕对象,作为父节点 page为子对象,作为创建的界面,然后定义大小、样式;同样,界面里面的按钮文本这些控件也是page的子对象

lv_btn_create() 创建按钮

lv_label_create() 创建文本

lv_obj_set_size(btn_back, 70, 46); //控件大小

lv_obj_align(btn_back, LV_ALIGN_BOTTOM_RIGHT, -82, -44); //控件对齐方式,也就是控件位置 param(控件对象,相对于父容器对齐方式,x轴,y轴左负右正)

lv_obj_add_event_cb( //按钮绑定事件回调函数,也就是点击按钮会触发什么事件、触摸动作

btn_back,

page_navigate_cb, //事件回调函数

LV_EVENT_CLICKED, //触摸事件

(void *)(intptr_t)PAGE_HOME); //传给回调函数的变量,用户自定义数据

lv_timer_create()LVGL的软定时器,

lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data); 可以周期行的执行回调函数

eg :lv_timer_create(machine_running_ui_timer_cb, 100, NULL); 100ms 执行一次machine_running_ui_timer_cb函数

字体:eg:

lv_obj_t *lbl_prefix = lv_label_create(loop_cont); //文本标签

lv_label_set_text(lbl_prefix, "剩余圈数"); //显示文本内容

lv_obj_set_style_text_color(lbl_prefix, lv_color_hex(0x354554), 0); //字体颜色 第三个参数selector 选择器,常用0 也可以根据按钮状态动态的显示颜色

lv_obj_set_style_text_font(lbl_prefix, &lv_my_Font_20, 0); //使用的是哪一个字体

LVGL没有中文字库,显示的汉字需要到LVGL官方转换器里面把汉字转换成C语言文件,得到这个C语言文件之后添加到LVGL源码font目录下,并添加到项目工程,

然后在头文件或者.c文件顶部添加中文字体宏定义 LV_FONT_DECLARE(lv_my_Font_20);


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

PyVISA 完整指南:Python 控制测量仪器,三分钟跑通

PyVISA 完整指南:Python 控制测量仪器,三分钟跑通 【免费下载链接】pyvisa A Python package with bindings to the "Virtual Instrument Software Architecture" VISA library, in order to control measurement devices and test equipment …

作者头像 李华
网站建设 2026/8/22 11:26:22

NoFences:免费的 Windows 桌面分区工具指南

NoFences:免费的 Windows 桌面分区工具指南 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences NoFences 桌面分区是一款完全免费的开源工具,用来把 Windo…

作者头像 李华
网站建设 2026/8/22 11:25:05

机器学习分类模型实战:从原理到工程落地的完整指南

1. 项目概述:从“分类”这个核心动作说起“数学建模分类模型”——这个标题听起来很学术,但它的内核其实是我们每天都在面对的问题。简单来说,就是教会计算机,如何根据已有的经验(数据),去判断一…

作者头像 李华
网站建设 2026/8/22 11:21:26

内网渗透测试

七个阶段第一阶段:前期交互(Pre-engagement)确定测试范围和目标。第二阶段:情报搜集(Intelligence Gathering)指纹:操作系统 子域名 端口 被动监听第三阶段:威胁…

作者头像 李华