LVGL 控件之基础对象(lv_obj)


一、 概述

1、基本概念

基础对象的作用有四个:

  1. 管理其他部件的基本属性;
  2. 作为背景装饰;
  3. 辅助布局;
  4. 界面切换。

基础对象 实现了屏幕上控件的基本属性,例如:

  • 坐标
  • 父对象
  • 基于父对象的后代
  • 包含样式
  • 诸如 ClickableScrollable 等属性。

在面向对象的思想中,基础对象就是 LVGL 中所有其他对象都继承自的基类

基础对象的功能可以与其他控件一起使用。 例如 lv_obj_set_width(slider, 100)

基础对象可以直接用作一个简单的控件:它只不过是一个矩形。 在 HTML 术语中,将其视为 <div>。

在这里插入图片描述
在设计较为复杂的 GUI 界面时,不同功能的模块之间需要清晰地划分区域,此时,我们可以使用基础对象作为背景,对不同的区域进行划分。

父对象可以被看作是其子对象的容器,每个对象只有一个父对象(screen 对象没有父对象),父对象可以有无限数量的子对象,同时父对象的类型是没有限制。父对象和子对象之间具有如下两点特性:

  1. 一起移动
    如果父对象的位置更改,则子对象将随父对象一起移动,因此子对象的坐标位置是以父对象的左上角而言的,而不是以屏幕的左上角。
  2. 子对象只能在父对象的区域内显示
    如果子对象的一部分在父对象的外面,那么子对象的这一部分将不会被显示出来。

2、lv_obj_t

lv_obj_t 定义在目录 lvgl\src\core\lv_obj.h 中:

struct _lv_obj_t {
   
    const lv_obj_class_t * class_p;  // 描述每个对象的通用方法
    lv_obj_t * parent;				 // 指向父对象
    _lv_obj_spec_attr_t * spec_attr; // 特殊的、很少使用的属性
    _lv_obj_style_t * styles;        // 样式的描述符(属性和值的集合)
#if LV_OBJ_STYLE_CACHE
    uint32_t style_main_prop_is_set;
    uint32_t style_other_prop_is_set;
#endif
    void * user_data;
#if LV_USE_OBJ_ID
    void * id;
#endif
    lv_area_t coords;							// 表示该对象屏幕的哪个区域
    lv_obj_flag_t flags;						// 为 uint32_t 类型,用来存放宏标志
    lv_state_t state;							// 为 uint16_t 类型,用来表示状态
    uint16_t layout_inv : 1;
    uint16_t readjust_scroll_after_layout : 1;
    uint16_t scr_layout_inv : 1;
    uint16_t skip_trans : 1;
    uint16_t style_cnt  : 6;
    uint16_t h_layout   : 1;
    uint16_t w_layout   : 1;
    uint16_t is_deleting : 1;
}
### 关于 `LV_OBJ_FLAG_DISABLED` 的替代方法 在 LVGL 中,当不再希望使用 `LV_OBJ_FLAG_DISABLED` 来控制对象的状态时,可以考虑其他机制来模拟禁用效果。一种常见的方式是通过修改对象的样式和响应行为。 #### 使用自定义属性代替 `LV_OBJ_FLAG_DISABLED` 可以通过设置特定样式的透明度或颜色变化以及阻止事件传递的方式来模仿禁用的效果: ```c // 创建一个按钮并应用初始样式 lv_obj_t *button = lv_btn_create(lv_scr_act()); // 定义一个新的样式用于表示“禁用” static lv_style_t style_disabled; lv_style_init(&style_disabled); lv_style_set_bg_opa(&style_disabled, LV_OPA_50); // 半透明背景 lv_style_set_text_opa(&style_disabled, LV_OPA_50); // 文本半透明 // 应用该样式到目标控件上以达到视觉上的禁用效果 lv_obj_add_style(button, &style_disabled, LV_PART_MAIN); // 阻止点击事件到达此控件 lv_group_remove_all_objs(); ``` 另一种做法是在处理输入事件之前先判断当前状态是否允许交互操作,在不允许的情况下忽略这些事件: ```c void button_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 && !is_enabled(obj)) { // 假设有一个 is_enabled 函数用来检测启用/禁用情况 return; // 如果处于禁用状态下,则不执行任何动作 } // 继续正常逻辑... } ``` 以上两种方法都可以有效地替换掉直接依赖 `LV_OBJ_FLAG_DISABLED` 的场景[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值