一、lv_obj_t是 LVGL 最核心、最重要的结构体,没有之一
1. 它是什么?
lv_obj_t =所有 UI 组件的基类(父模板)你学到的所有控件:标签、按钮、开关、进度条、空白容器、lv_win 窗口、列表、图片等等…… 底层全部继承 lv_obj_t。每一个界面上显示的东西,本质都是一个 lv_obj_t 对象。
2. 为什么它至关重要(4 个核心作用)
① 统一所有控件的通用属性
- parent:父子层级,构成界面树(窗口里放开关、标签,全靠这个指针关联)
- coords:坐标、宽高,决定控件画在屏幕哪个位置
- styles:样式(颜色、圆角、边框)
- state:状态(按下、禁用、聚焦)
- class_p:标记它到底是按钮 / 开关 / 窗口哪一类控件
不管什么控件,都必须保存这套基础信息,全部封装进 lv_obj_t。
② 实现通用函数一套通吃
LVGL 大量通用接口,参数统一是 lv_obj_t*:
lv_obj_set_size(lv_obj_t *obj, w, h); // 设置大小,按钮/窗口/开关都能用 lv_obj_align(lv_obj_t *obj, ...); // 设置对齐 lv_obj_set_style_bg_color(obj, ...); // 设置背景色 lv_obj_del(lv_obj_t *obj); // 删除任意控件
如果没有lv_obj_t,每一种控件都要单独写一套设置大小、移动、删除的函数,代码会爆炸。
③ 支撑界面层级渲染逻辑
LVGL 渲染流程:从根屏幕(lv_scr_act())遍历所有lv_obj_t对象,按父子顺序一层层绘制。没有lv_obj_t的父子指针,系统无法知道哪个控件在哪个容器内部、谁在前谁在后。
④ 事件系统全部依托它
点击、滑动、切换等事件,全部基于lv_obj_t对象传递;回调函数拿到的触发对象也是lv_obj_t*。
3. 两种创建方式本质都是 lv_obj_t
- 空白容器
lv_obj_t* menu3 = lv_obj_create(parent); // 直接创建基础lv_obj_t空白对象
- 专用控件(开关、窗口、按钮)
lv_obj_t *sw = lv_switch_create(parent); // 内部先创建lv_obj_t,再追加开关专属扩展属性,返回指针依然是lv_obj_t*
所有xxx_create()返回值全是lv_obj_t*,统一类型。
4. 极简总结
- LVGL 里所有看得见的东西都是 lv_obj_t;
- 它是整个图形库的底层骨架,层级、渲染、样式、事件全部依赖它;
- 几乎 90% 的 LVGL 函数都需要传入lv_obj_t*作为操作对象,是必须吃透的核心结构。
二、和 lv_obj_t 配套的顶层核心结构体
1.lv_obj_class_t
作用:区分控件类型(按钮 / 开关 / 标签 / 窗口),存在 lv_obj_t 的 class_p 指针里;
用途:内部保存该控件专属创建、绘图、事件回调函数,判断对象是什么组件。
2. lv_area_t
成员:x1,y1,x2,y2;记录控件坐标区域,lv_obj_t->coords 就是它;
常用函数:lv_area_set_pos、lv_area_is_inside,判断点击是否落在控件内。
3. lv_obj_style_t
控件样式结构体,存颜色、圆角、字体、边框、透明度;
所有组件共用,lv_obj_t 里挂载,lv_obj_set_style_xxx 系列函数操作它。
4. lv_event_t(超级高频)
所有组件点击、滑动、切换事件的载体,几乎所有交互控件(按钮、开关、复选框、键盘)都要用;
关键函数:
lv_obj_add_event_cb(obj, 回调函数, LV_EVENT_CLICKED, NULL)
lv_event_get_target(e) 获取触发的控件(返回lv_obj_t*)
5. lv_state_t
控件状态枚举:按下、聚焦、禁用、选中;开关、复选框、按钮、进度条依赖,样式会随状态切换。
6. 位域标记 lv_obj_flag_t
控制控件隐藏、可点击、可滚动、布局刷新,所有组件通用。
三、全局通用关键变量 / 句柄
lv_scr_act()获取当前激活屏幕,所有组件创建时最常用的父对象,返回lv_obj_t*;
LV_PALETTE_xxx 全局颜色常量(LV_PALETTE_BLUE/LV_PALETTE_RED);
LV_ALIGN_xxx 对齐宏:LV_ALIGN_CENTER、LV_ALIGN_TOP_LEFT;
LV_SYMBOL_xxx 内置图标符号(关闭、勾选、箭头,窗口 / 按钮 / 消息框用)。
极简总结
万物根基:lv_obj_t 所有组件父结构体,必掌握;
交互核心:lv_event_t 做点击、切换逻辑必备;
每个控件都有自己专属 xxx_t 结构体,只是创建函数返回统一转成lv_obj_t*;
屏幕、对齐、颜色、图标是全局宏变量,所有组件通用;
定时器lv_timer_t是配套工具,用来定时刷新界面数据。
四、LVGL 函数前缀分类对照表
一、通用控件接口lv_obj_*(所有控件通用,label/btn/list/switch/page 都能调用)
函数示例 | 功能 |
lv_obj_set_size() | 设置控件宽高 |
lv_obj_set_pos() | 设置坐标 |
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN) | 隐藏控件 |
lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN) | 显示控件 |
lv_obj_set_style_text_font() | 设置文字字体 |
lv_obj_add_style() | 挂载自定义样式 |
lv_obj_del() | 删除控件 |
lv_obj_center() | 居中 |
lv_obj_align() | 设置对齐方式 |
二、控件专属接口lv_控件类型_*(仅对应控件可用)
前缀 | 对应控件 | 示例函数 | 功能 |
lv_label_ | 文本标签 | lv_label_set_text() | 修改标签文字 |
lv_btn_ | 普通按钮 | lv_btn_set_checkable() | 设置按钮可勾选 |
lv_list_ | 列表框 | lv_list_add_btn() / lv_list_get_btn_text() | 添加按钮、读取按钮文字 |
lv_switch_ | 开关控件 | lv_switch_set_anim_time() | 设置开关动画时长 |
lv_textarea_ | 文本输入框 | lv_textarea_set_text() | 输入框赋值 |
lv_dropdown_ | 下拉框 | lv_dropdown_set_options() | 设置下拉选项 |
lv_slider_ | 滑动条 | lv_slider_set_value() | 设置滑块数值 |
lv_roller_ | 滚轮选择器 | lv_roller_set_options() | 设置滚轮选项 |
三、非控件类接口(操作样式 / 内存 / 定时器 / 文件 / 事件/工具 / 系统,和控件无关)
前缀 | 操作对象 | 示例函数 | 用途 |
lv_style_ | 样式结构体 lv_style_t | lv_style_set_text_font() | 给样式设置字体、颜色、圆角 |
lv_mem_ | LVGL 内存堆 | lv_mem_alloc() | 手动内存分配(底层) |
lv_timer_ | LVGL 软件定时器 | lv_timer_create() | 创建定时任务 |
lv_event_ | 事件工具 | lv_event_get_target() | 获取触发事件的控件 |
lv_fs_ | 文件系统 | lv_fs_open() / lv_fs_read() | 读写 SD 卡 / 本地文件 |
lv_font_ | 字体资源 | lv_font_load() | 加载外部字体 |
lv_disp_ | 显示屏幕 | lv_disp_set_bg_color() | 设置屏幕背景色 |
lv_indev_ | 输入设备(触摸) | lv_indev_read() | 读取触摸坐标 |
快速判断口诀
- lv_obj_xxx → 随便哪个控件都能用
- lv_label/lv_list/lv_btn_xxx → 只能对应同种控件
- lv_style/lv_timer/lv_fs_xxx → 和控件无关,操作配套功能