【嵌入式LVGL】04.LVGL常用结构体、函数、变量+LVGL接口函数区分

【嵌入式LVGL】04.LVGL常用结构体、函数、变量+LVGL接口函数区分

一、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

  1. 空白容器
lv_obj_t* menu3 = lv_obj_create(parent); // 直接创建基础lv_obj_t空白对象
  1. 专用控件(开关、窗口、按钮)
lv_obj_t *sw = lv_switch_create(parent); // 内部先创建lv_obj_t,再追加开关专属扩展属性,返回指针依然是lv_obj_t*
所有xxx_create()返回值全是lv_obj_t*,统一类型。

4. 极简总结

  1. LVGL 里所有看得见的东西都是 lv_obj_t
  2. 它是整个图形库的底层骨架,层级、渲染、样式、事件全部依赖它;
  3. 几乎 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()
读取触摸坐标

快速判断口诀

  1. lv_obj_xxx → 随便哪个控件都能用
  2. lv_label/lv_list/lv_btn_xxx → 只能对应同种控件
  3. lv_style/lv_timer/lv_fs_xxx → 和控件无关,操作配套功能

句柄(lv_obj_t* 指针)是什么