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_...()
父子关系parentchild
样式系统lv_style_tlv_obj_add_style()
事件回调lv_obj_add_event_cb()
层级结构树状结构管理 UI
自动布局lv_obj_set_layout()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落已飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值