LVGL8.2 父对象与子对象概念LVGL 所有控件按钮、标签、容器等都是对象 (lv_obj_t)。对象之间通过父‑子关系组织构成一棵对象树。子对象依附于父对象父对象管理所有子对象的位置、裁剪、显示、删除、事件传递。1. 核心定义父对象 (parent)容纳其他控件的对象。子对象 (child)被放在父对象内部的对象。根对象lv_scr_act()当前屏幕是最顶层父对象没有父。// 创建一个容器父对象是当前屏幕 lv_obj_t * cont lv_obj_create(lv_scr_act()); // 创建标签父对象是上面的容器cont标签成为cont的子对象 lv_obj_t * label lv_label_create(cont);xxx_create(parent)的第一个参数就是父对象创建完自动建立父子关系2. 父子关系带来的关键特性2.1 位置坐标是相对父对象子对象的 x/y 坐标原点是父对象左上角不是屏幕左上角。// label 在cont内部距离cont左上角x10,y10 lv_obj_set_pos(label,10,10);父对象移动所有子对象跟着一起移动2.2裁剪clipping默认情况下子对象不能绘制到父对象边界外面超出部分会被截断不显示。关闭裁剪lv_obj_set_clip_children(parent, false);子控件可以画出父控件范围外。2.3删除父对象子对象自动销毁lv_obj_del(cont); // cont被删除它所有子对象(label、button等)全部自动释放不用手动del子对象不要手动 delete 已经被父对象管理的子对象也可以当然也可以单独删除某个子对象lv_obj_del(label)。2.4大小继承与布局lv_obj_set_size()设置父容器大小子对象可以用布局flex/grid自动排布。Flex、Grid 布局父对象开启布局自动排列它所有的直接子对象2.5 事件传递事件会从子对象向上冒泡到父对象。比如点击按钮按钮收到点击事件之后事件会传给它的父容器再往上直到屏幕。3.常用父子对象 APILVGL8.2// 获取父对象 lv_obj_t * parent lv_obj_get_parent(child); // 获取第一个子对象 lv_obj_t * child lv_obj_get_child(parent, 0); // 获取子对象数量 int child_cnt lv_obj_get_child_cnt(parent); // 将对象移到另一个父下重新指定父 lv_obj_set_parent(child, new_parent); // 将子对象移到最顶层同一父下最后绘制显示在最前面 lv_obj_move_to_front(child); // 移到底层最先绘制被其他同级遮挡 lv_obj_move_to_back(child); // 是否是某个对象的后代递归判断孙子也返回true bool is_desc lv_obj_is_descendant(obj, ancestor);直接子对象 vs 后代孙子对象屏幕 scr_act() └── cont1父 └── cont2cont1的子 └── labelcont2的子cont1的孙子cont1的直接子对象只有cont2label是cont1的后代不是直接子对象flex/grid 布局只作用于直接子对象孙子对象不受父容器布局影响