文章目录
在 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); // 删除对象及其所有子对象
🖼 四、对象的属性设置(常用函数)
功能 | 函数 |
---|---|
设置大小 | lv_obj_set_size(obj, w, h) |
设置位置 | lv_obj_set_pos(obj, x, y) |
居中对齐 | lv_obj_align(obj, LV_ALIGN_CENTER, x_off, y_off) |
设置背景颜色 | lv_obj_set_style_bg_color(obj, lv_color_hex(0xff0000), LV_PART_MAIN) |
设置圆角 | lv_obj_set_style_radius(obj, 10, LV_PART_MAIN) |
设置边框宽度 | lv_obj_set_style_border_width(obj, 2, LV_PART_MAIN) |
🧬 五、对象的层级与父子关系
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); // 子对象垂直居中排列
🔚 总结(关键词串讲)
概念 | 关键词 |
---|---|
基类 | lv_obj_t |
创建 | lv_obj_create() 等 |
属性设置 | lv_obj_set_...() |
父子关系 | parent 、child |
样式系统 | lv_style_t 、lv_obj_add_style() |
事件回调 | lv_obj_add_event_cb() |
层级结构 | 树状结构管理 UI |
自动布局 | lv_obj_set_layout() |