LVGL的部件详解

在 LVGL(Light and Versatile Graphics Library)中,部件(Widgets) 是构建用户界面(UI)的核心元素,类似于其他 UI 框架中的“控件”或“组件”。每个部件代表一个具有特定功能的交互式或非交互式对象,例如按钮、标签、滑块、进度条等。


一、概念

1. 部件的基本定义

  • 本质:部件是 lv_obj_t 结构体的实例,它是 LVGL 中所有对象的基类。
  • 继承关系:所有部件(如按钮 lv_btn、标签 lv_label)均继承自 lv_obj_t,因此具备以下基础特性:
    • 位置和大小:通过坐标和尺寸定义在屏幕上的布局。
    • 样式:定义外观(颜色、字体、边框、阴影等)。
    • 事件处理:响应点击、滑动、焦点变化等用户交互。
    • 父子关系:通过层级结构组织界面元素。

2. 部件的主要分类

LVGL 的部件分为两大类:

(1) 基础容器(Base Object)
  • 作用:作为其他部件的容器(类似 HTML 中的 <div>)。
  • 示例lv_obj_t 本身即可作为容器。
  • 用途:用于布局分组或作为复杂部件的父容器。
(2) 专用部件(Specialized Widgets)
  • 作用:提供特定功能或交互行为。
  • 常见类型
    部件类型功能描述示例函数
    标签(Label)显示文本lv_label_create()
    按钮(Button)点击触发事件lv_btn_create()
    滑块(Slider)通过拖动选择数值范围lv_slider_create()
    进度条(Bar)显示进度或数值lv_bar_create()
    复选框(Checkbox)勾选/取消勾选选项lv_checkbox_create()
    下拉列表(Dropdown)展开选择列表lv_dropdown_create()

3. 部件的核心特性

(1) 父子结构
  • 层级关系:每个部件必须有一个父容器(默认父容器是屏幕对象 lv_scr_act())。
  • 作用
    • 子部件的位置和可见性受父容器约束。
    • 父容器删除时,所有子部件自动删除。
  • 示例
    lv_obj_t *parent = lv_scr_act(); // 获取默认屏幕
    lv_obj_t *btn = lv_btn_create(parent); // 在父容器中创建按钮
    
(2) 样式系统
  • 作用:通过样式(lv_style_t)定义部件的外观。
  • 支持属性
    • 背景颜色、透明度、渐变。
    • 边框宽度、圆角、阴影。
    • 文本字体、对齐方式。
    • 边距(Margin)和填充(Padding)。
  • 示例
    static lv_style_t style_btn;
    lv_style_init(&style_btn);
    lv_style_set_bg_color(&style_btn, lv_color_hex(0x007AFF)); // 设置按钮背景色
    lv_obj_add_style(btn, &style_btn, LV_STATE_DEFAULT); // 应用样式
    
(3) 事件处理
  • 作用:通过回调函数响应用户交互(如点击、滑动、焦点变化)。
  • 常见事件
    • LV_EVENT_CLICKED:点击事件。
    • LV_EVENT_VALUE_CHANGED:数值变化(如滑块移动)。
    • LV_EVENT_FOCUSED:获得焦点。
  • 示例
    static void btn_click_cb(lv_event_t *e) {
      lv_obj_t *btn = lv_event_get_target(e);
      printf("按钮被点击!\n");
    }
    lv_obj_add_event_cb(btn, btn_click_cb, LV_EVENT_CLICKED, NULL);
    

4. 部件的高级功能

(1) 动画(Animations)
  • 可为部件属性(位置、透明度、大小)添加动态效果。
    lv_anim_t anim;
    lv_anim_init(&anim);
    lv_anim_set_var(&anim, btn);
    lv_anim_set_values(&anim, 0, 100); // 从 0 到 100 移动
    lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t)lv_obj_set_x); // 设置动画属性为 X 坐标
    lv_anim_start(&anim);
    
(2) 布局系统
  • 通过 Flex 布局Grid 布局 自动排列子部件。
    lv_obj_set_flex_flow(parent, LV_FLEX_FLOW_ROW); // 设置为横向排列
    lv_obj_set_flex_align(parent, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
    
(3) 状态管理
  • 部件可以有不同的状态(如默认、按下、禁用),每个状态可以有不同的样式。
    lv_style_set_bg_color(&style_btn, LV_STATE_PRESSED, lv_color_hex(0x0055FF)); // 按下状态颜色
    

5. 总结

  • 部件(Widgets) 是 LVGL 中构建用户界面的基本单元,通过组合和配置不同部件,可以快速创建复杂的交互式界面。
  • 核心能力:父子关系、样式系统、事件处理、动画和布局。
  • 学习建议:从基础部件(如按钮、标签)开始实践,逐步掌握布局和事件绑定,最终实现复杂的动态界面。

二、部件相关宏定义

以下是 LVGL 部件相关宏定义的详细功能注释:

/* 圆弧部件:用于创建圆弧形进度条或旋钮控件 */
#define LV_USE_ARC          1

/* 动画图片部件:支持加载和播放图片动画序列 */
#define LV_USE_ANIMIMG      1

/* 进度条部件:基础的水平/垂直进度条 */
#define LV_USE_BAR          1

/* 按钮部件:基础按钮控件 */
#define LV_USE_BTN          1

/* 按钮矩阵部件:创建网格状排列的多个按钮(如键盘布局) */
#define LV_USE_BTNMATRIX    1

/* 画布部件:提供自定义绘图功能的空白区域 */
#define LV_USE_CANVAS       1

/* 复选框部件:带文本标签的勾选框 */
#define LV_USE_CHECKBOX     1

/* 下拉列表部件:点击后展开选项列表(需依赖标签部件) */
#define LV_USE_DROPDOWN     1   /*Requires: lv_label*/

/* 图像部件:显示静态或动态图片(需依赖标签部件) */
#define LV_USE_IMG          1   /*Requires: lv_label*/

/* 标签部件:显示文本(支持换行、格式化等基础功能) */
#define LV_USE_LABEL        1
#if LV_USE_LABEL
#  define LV_LABEL_TEXT_SELECTION         1   /* 启用文本选中功能 */
#  define LV_LABEL_LONG_TXT_HINT    1   /* 启用长文本绘制优化(缓存布局信息) */
#endif

/* 线条部件:绘制直线 */
#define LV_USE_LINE         1

/* 滚轮部件:上下滚动选择器(如时间选择器,需依赖标签部件) */
#define LV_USE_ROLLER       1   /*Requires: lv_label*/
#if LV_USE_ROLLER
#  define LV_ROLLER_INF_PAGES       7   /* 定义无限滚动时虚拟页面数量 */
#endif

/* 滑块部件:通过拖动滑块选择值(基于进度条部件实现) */
#define LV_USE_SLIDER       1   /*Requires: lv_bar*/

/* 开关部件:类似 iOS 的 ON/OFF 切换控件 */
#define LV_USE_SWITCH    1

/* 文本域部件:多行文本输入框(需依赖标签部件) */
#define LV_USE_TEXTAREA   1     /*Requires: lv_label*/
#if LV_USE_TEXTAREA != 0
#  define LV_TEXTAREA_DEF_PWD_SHOW_TIME     1500    /* 密码输入时明文显示时间(毫秒) */
#endif

/* 表格部件:创建行列式数据表格 */
#define LV_USE_TABLE  1

额外说明:

  1. 依赖关系
    标注 Requires: lv_label 的部件表示其内部使用了标签功能(如显示文字),需确保 LV_USE_LABEL 已启用。

  2. 性能影响

    • LV_USE_CANVAS:启用画布会增加内存占用,适合需要自定义绘图的场景
    • LV_LABEL_LONG_TXT_HINT:通过缓存布局信息优化长文本渲染性能,但会略微增加内存占用
  3. 交互特性

    • LV_LABEL_TEXT_SELECTION:启用后可通过触控/鼠标选择并复制文本
    • LV_ROLLER_INF_PAGES:值越大滚动越流畅,但会消耗更多资源
  4. 特殊用途

    • LV_USE_BTNMATRIX:常用于实现数字键盘、快速选择菜单等场景
    • LV_USE_TABLE:适合显示结构化数据(如日志、传感器数据表格)

如果需要更详细的技术参数(如内存占用、API 用法),建议查阅 LVGL 官方文档对应部件的说明。


三、部件的属性

以下是关于 LVGL 部件属性的详细说明,包含基本属性和其他扩展属性:


一、基本属性

1. 大小(Size)
  • 作用:定义部件的宽度和高度。
  • 设置方式
    lv_obj_set_width(obj, 100);     // 设置宽度(像素)
    lv_obj_set_height(obj, 50);     // 设置高度(像素)
    lv_obj_set_size(obj, 100, 50); // 同时设置宽高
    
  • 特性
    • 支持百分比(如 LV_PCT(50) 表示父容器宽度的50%)。
    • 支持自动调整大小(LV_SIZE_CONTENT)。
2. 位置(Position)
  • 作用:定义部件相对于父容器或屏幕的位置。
  • 设置方式
    lv_obj_set_x(obj, 10);      // X 轴偏移(像素)
    lv_obj_set_y(obj, 20);      // Y 轴偏移(像素)
    lv_obj_set_pos(obj, 10, 20);// 同时设置 X/Y
    
  • 坐标系:原点 (0,0) 在父容器的左上角。
3. 对齐(Alignment)
  • 作用:控制部件在父容器中的对齐方式。
  • 常见对齐标志
    • LV_ALIGN_TOP_LEFT, LV_ALIGN_CENTER, LV_ALIGN_BOTTOM_RIGHT 等。
  • 示例
    lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); // 居中
    lv_obj_align_to(obj, reference_obj, LV_ALIGN_OUT_RIGHT_MID, 10, 0); // 相对于其他对象对齐
    
4. 样式(Style)
  • 作用:定义部件的外观(颜色、字体、边框等)。
  • 样式属性
    • 背景:颜色、透明度、渐变。
    • 边框:宽度、颜色、圆角。
    • 文本:字体、颜色、对齐。
    • 填充(Padding):内容与边框的间距。
    • 边距(Margin):部件与其他部件的间距。
  • 设置方式
    static lv_style_t style;
    lv_style_init(&style);
    lv_style_set_bg_color(&style, lv_color_hex(0x3498db));
    lv_style_set_text_font(&style, &lv_font_montserrat_16);
    lv_obj_add_style(obj, &style, LV_STATE_DEFAULT); // 应用样式
    
  • 样式状态LV_STATE_DEFAULT(默认)、LV_STATE_PRESSED(按下)、LV_STATE_DISABLED(禁用)等。
5. 事件(Events)
  • 作用:响应部件上的用户交互或系统事件。
  • 常见事件类型
    • LV_EVENT_CLICKED:点击事件。
    • LV_EVENT_VALUE_CHANGED:值改变事件(如滑块)。
    • LV_EVENT_FOCUSED:获得焦点。
    • LV_EVENT_DELETE:对象被删除前触发。
  • 事件回调函数
    static void event_cb(lv_event_t *e) {
      lv_obj_t *obj = lv_event_get_target(e);
      if(lv_event_get_code(e) == LV_EVENT_CLICKED) {
        printf("Clicked!\n");
      }
    }
    lv_obj_add_event_cb(obj, event_cb, LV_EVENT_CLICKED, NULL); // 绑定事件
    

二、其他扩展属性

1. 动画(Animations)
  • 作用:为属性变化添加过渡效果(如移动、缩放、颜色渐变)。
  • 示例
    lv_anim_t anim;
    lv_anim_init(&anim);
    lv_anim_set_var(&anim, obj);
    lv_anim_set_values(&anim, 0, 100);
    lv_anim_set_exec_cb(&anim, (lv_anim_exec_xcb_t)lv_obj_set_x);
    lv_anim_start(&anim);
    
2. 用户数据(User Data)
  • 作用:为部件绑定自定义数据(如ID、指针)。
  • 设置方式
    lv_obj_set_user_data(obj, (void*)123); // 设置数据
    int data = (int)lv_obj_get_user_data(obj); // 获取数据
    
3. 组管理(Groups)
  • 作用:通过键盘/编码器控制焦点导航(适用于嵌入式设备)。
  • 示例
    lv_group_t *group = lv_group_create();
    lv_group_add_obj(group, obj1);
    lv_group_add_obj(group, obj2);
    
4. 滚动(Scrolling)
  • 作用:控制部件或父容器的滚动行为。
  • 设置方式
    lv_obj_set_scroll_dir(obj, LV_DIR_VER); // 允许垂直滚动
    lv_obj_scroll_to_view(obj, LV_ANIM_ON); // 滚动到可见区域
    
5. 透明度(Opacity)
  • 作用:设置部件整体透明度(0-255)。
  • 示例
    lv_obj_set_style_opa(obj, LV_OPA_50, LV_STATE_DEFAULT); // 50%透明度
    
6. 隐藏/显示(Visibility)
  • 作用:临时隐藏部件而不删除。
  • 设置方式
    lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); // 隐藏
    lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN); // 显示
    
7. 焦点管理(Focus)
  • 作用:控制键盘/编码器操作的焦点对象。
  • 示例
    lv_group_focus_obj(obj); // 将焦点设置到指定部件
    

三、父子关系与层级

  • 父子关系:所有部件必须有一个父容器(默认为屏幕对象 lv_scr_act())。
  • 层级(Z-Index)
    • 后创建的部件默认显示在顶层。
    • 可通过 lv_obj_move_foreground(obj)lv_obj_move_background(obj) 调整层级。

四、特殊属性

1. 类型(Type)
  • 每个部件有唯一类型标识(如 LV_OBJ_CLASS_BTN),用于区分不同部件。
2. 状态(State)
  • 组合状态如 LV_STATE_DEFAULT | LV_STATE_PRESSED,影响样式和交互逻辑。
3. 标志(Flags)
  • 控制部件的通用行为,例如:
    • LV_OBJ_FLAG_CLICKABLE:允许点击。
    • LV_OBJ_FLAG_CHECKABLE:支持选中状态(如复选框)。

总结

  • 基本属性:大小、位置、对齐、样式、事件是部件的核心配置。
  • 扩展属性:动画、用户数据、组管理、滚动等提供更复杂的功能。
  • 实战建议:通过 LVGL 官方示例(如 lv_examples)和文档快速掌握属性的实际用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

九层指针

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

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

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

打赏作者

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

抵扣说明:

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

余额充值