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);  // 删除对象及其所有子对象

🖼 四、对象的属性设置(常用函数)

设置大小

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()

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务