LVGL-对象 lv_obj_t
LVGL-对象 lv_obj_t
- **LVGL 对象核心概念总结**
- **1. 对象与控件的关系**
- **2. 对象的基本属性**
- **3. 父子对象结构**
- **4. 屏幕与图层管理**
- **活动屏幕(Active Screen)**
- **图层(Layers)**
- **5. 关键函数与操作**
- **6. 面向对象设计的实现**
LVGL 对象核心概念总结
1. 对象与控件的关系
- 对象(Object) 是 LVGL 用户界面的基本组成单元,所有控件(如按钮、标签、图像等)均继承自
lv_obj_t
结构体。 - 控件(Widget) 是对象的特例,是带有特定功能的可视化组件。
- 术语混用原因:LVGL 采用面向对象设计思想,
lv_obj_t
是基类,所有控件基于此扩展。使用“对象”更强调通用性和面向对象特性,而“控件”强调具体功能,两者在不同语境下交替使用。
- 术语混用原因:LVGL 采用面向对象设计思想,
2. 对象的基本属性
所有对象共享以下通用属性,可通过 lv_obj_set_...
和 lv_obj_get_...
函数操作:
- 位置:
lv_obj_set_pos(obj, x, y)
- 大小:
lv_obj_set_size(obj, w, h)
- 父对象:
lv_obj_set_parent(obj, parent)
- 样式:通过
lv_obj_add_style()
添加样式 - 事件处理程序:通过
lv_obj_add_event_cb()
注册回调
示例代码:
lv_obj_t * btn1 = lv_btn_create(lv_scr_act()); // 创建按钮对象
lv_obj_set_size(btn1, 100, 50); // 设置按钮大小
lv_obj_set_pos(btn1, 20, 30); // 设置按钮位置
3. 父子对象结构
- 父对象 是子对象的容器,每个对象(除屏幕外)必须有一个且仅有一个父对象。
- 子对象 的位置相对于父对象计算,超出父对象范围的部分不可见。
- 父子关系特性:
- 位置跟随:父对象移动时,子对象随之移动。
- 可见性裁剪:子对象超出父对象范围的部分被裁剪。
- 样式继承:子对象默认继承父对象的样式(除非显式覆盖)。
- 事件冒泡:子对象的事件可传递到父对象。
示例类比:
- 浏览器窗口(父对象)包含多个页签(子对象),页签内容不能超出浏览器窗口边界。
4. 屏幕与图层管理
活动屏幕(Active Screen)
- 每个显示器始终存在一个活动屏幕,默认由
lv_scr_act()
获取。 - 加载新屏幕:
lv_scr_load(scr1)
会替换当前活动屏幕。 - 屏幕生命周期:屏幕对象可动态创建和删除,无需提前定义。
图层(Layers)
LVGL 自动管理两个特殊图层:
- 顶层(Top Layer):
- 位于所有屏幕对象之上,适合弹窗、菜单栏等全局元素。
- 可通过
lv_layer_top()
获取。
- 系统层(System Layer):
- 位于顶层之上,用于系统级元素(如光标、状态栏)。
- 可通过
lv_layer_sys()
获取,不建议手动添加子对象。
层级关系:
活动屏幕(screen_active) < 顶层(top layer) < 系统层(system layer)
5. 关键函数与操作
功能 | 函数 | 说明 |
---|---|---|
创建对象 | lv_obj_create(parent) | 创建基础对象,需指定父对象(parent 为 NULL 时创建屏幕)。 |
加载屏幕 | lv_scr_load(scr) | 替换当前活动屏幕。 |
获取活动屏幕 | lv_scr_act() | 返回当前显示的屏幕指针。 |
获取顶层/系统层 | lv_layer_top() / lv_layer_sys() | 返回顶层或系统层指针。 |
删除对象 | lv_obj_del(obj) | 删除对象及其所有子对象。 |
异步删除 | lv_obj_del_async(obj) | 异步删除对象(下次调用 lv_task_handler() 时生效)。 |
调整对象层级 | lv_obj_set_parent(obj, new_parent) | 修改对象的父容器,改变其显示层级。 |
6. 面向对象设计的实现
LVGL 在 C 语言中模拟面向对象特性,主要通过以下方式:
- 结构体模拟类:
lv_obj_t
结构体包含通用属性(如位置、样式)。 - 函数指针实现多态:通过函数指针定义对象的行为(如绘制、事件处理)。
- 继承与组合:子对象通过嵌套父对象结构体实现继承(如
lv_btn_t
包含lv_obj_t
)。
示例:
// 所有控件继承自 lv_obj_t
typedef struct {lv_obj_t obj; // 继承基础对象属性int value; // 滑块特有属性
} lv_slider_t;