当前位置: 首页 > news >正文

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 是基类,所有控件基于此扩展。使用“对象”更强调通用性和面向对象特性,而“控件”强调具体功能,两者在不同语境下交替使用。

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. 父子对象结构

  • 父对象 是子对象的容器,每个对象(除屏幕外)必须有一个且仅有一个父对象。
  • 子对象 的位置相对于父对象计算,超出父对象范围的部分不可见。
  • 父子关系特性
    1. 位置跟随:父对象移动时,子对象随之移动。
    2. 可见性裁剪:子对象超出父对象范围的部分被裁剪。
    3. 样式继承:子对象默认继承父对象的样式(除非显式覆盖)。
    4. 事件冒泡:子对象的事件可传递到父对象。

示例类比

  • 浏览器窗口(父对象)包含多个页签(子对象),页签内容不能超出浏览器窗口边界。

4. 屏幕与图层管理

活动屏幕(Active Screen)
  • 每个显示器始终存在一个活动屏幕,默认由 lv_scr_act() 获取。
  • 加载新屏幕lv_scr_load(scr1) 会替换当前活动屏幕。
  • 屏幕生命周期:屏幕对象可动态创建和删除,无需提前定义。
图层(Layers)

LVGL 自动管理两个特殊图层:

  1. 顶层(Top Layer)
    • 位于所有屏幕对象之上,适合弹窗、菜单栏等全局元素。
    • 可通过 lv_layer_top() 获取。
  2. 系统层(System Layer)
    • 位于顶层之上,用于系统级元素(如光标、状态栏)。
    • 可通过 lv_layer_sys() 获取,不建议手动添加子对象

层级关系
活动屏幕(screen_active) < 顶层(top layer) < 系统层(system layer)


5. 关键函数与操作

功能函数说明
创建对象lv_obj_create(parent)创建基础对象,需指定父对象(parentNULL 时创建屏幕)。
加载屏幕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 语言中模拟面向对象特性,主要通过以下方式:

  1. 结构体模拟类lv_obj_t 结构体包含通用属性(如位置、样式)。
  2. 函数指针实现多态:通过函数指针定义对象的行为(如绘制、事件处理)。
  3. 继承与组合:子对象通过嵌套父对象结构体实现继承(如 lv_btn_t 包含 lv_obj_t)。

示例

// 所有控件继承自 lv_obj_t
typedef struct {lv_obj_t obj;         // 继承基础对象属性int value;            // 滑块特有属性
} lv_slider_t;

相关文章:

  • 基于Qt的app开发第六天
  • 东方泵业,室外消火栓泵 2#故障灯亮,报警生响
  • 词编码模型和回答问题的LLM是否为同一个; 词编码模型和回答问题模型分开时:需要保证词嵌入维度一致吗
  • STM32--TIM--函数
  • 【iOS】源码阅读(三)——内存对齐原理
  • 4G与5G网络频率:技术演进与应用场景解析
  • 自动化创业机器人:现状、挑战与Y Combinator的启示
  • XMP-Toolkit-SDK 编译与示例程序
  • WordPress:Locoy.php火车头采集
  • 手持小风扇方案解说---【其利天下技术】
  • 基于SpringBoot和PostGIS的应急运输事件影响分析-以1.31侧翻事故为例
  • nginx性能优化与深度监控
  • C++模板
  • [特殊字符] 深入解析:Go 与 Rust 中的数组与动态集合结构
  • redis bitmap数据类型调研
  • Java的HashMap面试题
  • JavaWeb:MySQL进阶
  • leetcode 141. Linked List Cycle
  • 软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)
  • 如何做界面自动化工具选择?
  • 国家发改委:美芯片药品等领域关税影响全球科技发展,损害人类共同利益
  • 复旦发文缅怀文科杰出教授裘锡圭:曾提出治学需具备三种精神
  • 人民日报整版调查:中小学春秋假,如何放得好推得开?
  • 陕西澄城樱桃在上海推介,向长三角消费者发出“甜蜜之邀”
  • 万玲、胡春平调任江西省鹰潭市副市长
  • 重磅金融政策密集发布!一文梳理这场国新办发布会