在 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
额外说明:
-
依赖关系
标注Requires: lv_label
的部件表示其内部使用了标签功能(如显示文字),需确保LV_USE_LABEL
已启用。 -
性能影响
LV_USE_CANVAS
:启用画布会增加内存占用,适合需要自定义绘图的场景LV_LABEL_LONG_TXT_HINT
:通过缓存布局信息优化长文本渲染性能,但会略微增加内存占用
-
交互特性
LV_LABEL_TEXT_SELECTION
:启用后可通过触控/鼠标选择并复制文本LV_ROLLER_INF_PAGES
:值越大滚动越流畅,但会消耗更多资源
-
特殊用途
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
)和文档快速掌握属性的实际用法。