LVGL对象(Objects)
在 LVGL(Light and Versatile Graphics Library)中,对象(Object)是 UI 的基本构建单元,几乎所有控件(按钮、标签、滑块等)都是从基础对象派生出来的。理解 LVGL 中对象的结构、创建与操作,是掌握 LVGL 的核心之一。
🧱 一、LVGL 中的对象(lv_obj)
LVGL 中的对象是从 lv_obj_t
类型派生的,所有控件本质上都是 lv_obj_t
的一个子类型。
🔹 lv_obj_t 的作用
lv_obj_t
就像一个“GUI 元素基类”,提供了:
- 样式(Style)
- 坐标(位置与大小)
- 子对象容器(父子层级结构)
- 信号与事件处理机制(如回调函数)
- 渲染与重绘管理
🧩 二、对象的分类结构(类比继承)
lv_obj_t ├── lv_btn_t 按钮 ├── lv_label_t 标签 ├── lv_slider_t 滑块 ├── lv_img_t 图片 ├── lv_canvas_t 画布 ├── lv_list_t 列表 └── lv_chart_t 图表
每个控件最终都继承自 lv_obj_t
,但通过“类型封装 + 宏 + 函数接口”实现“伪面向对象”风格。
🧰 三、对象的创建与销毁
✅ 创建对象
lv_obj_t * obj = lv_obj_create(parent); // 创建一个基础对象
所有对象必须挂载在父对象上,最上层的是屏幕(
lv_scr_act()
)
示例:创建一个按钮
lv_obj_t * btn = lv_btn_create(lv_scr_act()); // 在当前活动屏幕创建按钮 lv_obj_set_size(btn, 100, 50); lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0);
❌ 删除对象
lv_obj_del(obj); // 删除对象及其所有子对象
🖼 四、对象的属性设置(常用函数)
设置大小 |
|
设置位置 |
|
居中对齐 |
|
设置背景颜色 |
|
设置圆角 |
|
设置边框宽度 |
|
🧬 五、对象的层级与父子关系
LVGL 中每个对象都有一个 父对象(Parent),可以嵌套形成 树状结构。
lv_scr_act() └── 容器 container ├── 按钮 button1 └── 标签 label1
通过父子关系自动:
- 控制显示区域裁剪
- 执行坐标变换
- 执行事件冒泡(例如点击穿透)
📩 六、事件机制(事件回调)
LVGL 对象支持事件机制,例如点击、拖动、滚动等,可以注册回调函数处理:
static void my_event_cb(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * obj = lv_event_get_target(e); if(code == LV_EVENT_CLICKED) { printf("Button clicked!\n"); } } lv_obj_add_event_cb(btn, my_event_cb, LV_EVENT_ALL, NULL);
事件枚举值示例:
LV_EVENT_CLICKED
:点击LV_EVENT_PRESSED
:按下LV_EVENT_RELEASED
:松开LV_EVENT_DRAW_MAIN
:绘制时触发
🎨 七、样式系统(Style)
对象通过样式系统控制外观,包括颜色、字体、边框、圆角等:
static lv_style_t style; lv_style_init(&style); lv_style_set_bg_color(&style, lv_color_hex(0xff0000)); lv_obj_add_style(obj, &style, LV_PART_MAIN);
支持多个部件(Part)和状态(State):
LV_PART_MAIN
:主区域LV_STATE_PRESSED
:按下状态LV_STATE_DISABLED
:禁用状态
🧵 八、容器对象(布局)
lv_obj_create()
可以作为通用容器- 可设置布局和子对象自动排布
示例:垂直布局容器
lv_obj_t * cont = lv_obj_create(lv_scr_act()); lv_obj_set_layout(cont, LV_LAYOUT_COLUMN_MID); // 子对象垂直居中排列
🔚 总结(关键词串讲)
基类 |
|
创建 |
等 |
属性设置 |
|
父子关系 |
、
|
样式系统 |
、
|
事件回调 |
|
层级结构 | 树状结构管理 UI |
自动布局 |
|