【嵌入式LVGL】03.组件属性和样式+事件回调机制
一、组件属性,样式设计
1.设置左上角坐标位置
lv_obj_set_pos(组件指针,x坐标,y坐标);
2.设置尺寸大小
lv_obj_set_size(组件, 100, 50);
3.设置对齐——LVGL原点在第四象限
lv_obj_set_align(组件地址, LV_ALIGN_CENTER);——》两个参数
lv_obj_align(组件, LV_ALIGN_CENTER,-100,0); ——》四个参数
//居中表示把整个屏幕的中心位置作为(0,0),左边x是负数,右边x是正数,上面y是负数,下面y是正数
在对齐的基础之上再进行移动
LV_ALIGN_RIGHT_MID //靠右居中
LV_ALIGN_LEFT_MID
LV_ALIGN_TOP_MID

lv_obj_align_to(组件1,组件2, LV_ALIGN_OUT_BOTTOM_MID,0,20);——》五个参数
//设置参考物对齐方式,设置组件1参考组件2,在组件2的下方居中的位置,(0,20)表示y方向往下偏移20个像素,x方向居中
4.设置背景颜色,必须设置背景透明度,否则没用
lv_obj_set_style_bg_color(label, lv_color_hex(0xff0000), LV_STATE_DEFAULT);
LV_STATE_DEFAULT = 0,代表控件默认正常状态(无按下、无聚焦、无选中、无禁用的普通释放状态)
lv_obj_set_style_bg_opa(label, 100, LV_STATE_DEFAULT); //透明度0--255,值越大,上面的红色背景越深
//透明度设置为0表示这个组件跟主界面背景一样,肉眼看跟主界面融为一体
5.设置字体大小
lv_obj_set_style_text_font(label, &lv_font_montserrat_30, LV_STATE_DEFAULT);
参数: &lv_font_montserrat_30表示字体大小
注意: lv_conf.h头文件的348行定义所有的字体大小,默认值都是0表示关闭,你需要改成1才能使用
两个设置字体的接口对比
|
项目 |
lv_obj_set_style_text_font(obj, font, sel) |
lv_style_set_text_font(style, font) |
|
操作对象 |
直接操作控件 obj |
操作独立样式结构体lv_style_t |
|
复用性 |
仅当前控件生效,无法复用 |
可挂载到任意多控件,全局复用 |
|
代码量 |
一行搞定,无需提前初始化样式 |
需先lv_style_init,再 add_style 挂载 |
|
适用场景 |
单个控件特殊字体、少量控件 |
大量控件统一文字样式(列表、菜单) |
6.设置边框宽度
lv_obj_set_style_border_width(组件, 0,LV_PART_MAIN); //边框宽度设置为0表示去除边框

7.设置文本颜色(文字的颜色-->也叫做前景色)
lv_obj_set_style_text_color(label, lv_color_hex(0x5084db), LV_STATE_DEFAULT);
8.设置组件的标志
lv_obj_add_flag(组件, LV_OBJ_FLAG_HIDDEN); //隐藏对象
lv_obj_clear_flag(组件, LV_OBJ_FLAG_HIDDEN);//取消隐藏
9.设置组件的状态
lv_obj_add_state(按钮组件, LV_STATE_FOCUS_KEY); //按钮点击之后,按钮的背景颜色变成蓝色
lv_obj_add_state(开关组件/复选框, LV_STATE_CHECKED | LV_STATE_DISABLED); //设置开关/复选框组件不能点击
lv_obj_clear_state(开关组件/复选框, LV_STATE_CHECKED | LV_STATE_DISABLED); //取消开关/复选框组件不能点击
lv_obj_clear_state(开关组件,LV_STATE_CHECKED); //把开关组件的状态弄成关闭
10.获取组件的状态
if(lv_obj_has_state(开关组件/复选框, LV_STATE_CHECKED)) //如果开关/复选框组件被点击打开
二、基础对象的样式
- 样式是一个 lv_style_t 变量,它可以保存边框宽度、文本颜色等属性。
- 将样式 (变量) 分配给对象就可以改变其外观。在赋值过程中,可以指定目标部分和目标状态。
- 一个样式可以给多个对象使用(正常样式)。
- 样式可以级联,也就是可以将多个样式分配给一个对象。所以,我们不用将所有属性都在一个样式中指定,可以通过多个样式组合的形式指定。LVGL 会优先使用我们定义的样式,如果没有就会使用默认值。
- 后来添加的样式具有更高的优先级。也就是说如果在两种样式中指定了同一个属性,则将使用最后添加的样式。
- 如果对象中未指定某些属性(例如文本颜色),就会从父级继承。
- 上面说的是 “正常” 样式,对象还有本地样式,它比 “正常” 样式具有更高的优先级。
- 可以定义有过渡效果的样式。
- 默认有一个样式主题,我们也可以自己定义样式主题,作为默认的样式主题使用。
1.初始化
- static lv_style_t style_obj; 定义了一个 lv_style_t 类型的结构体变量 style_obj;static 修饰:存放在静态存储区,函数结束后变量不会销毁,符合 LVGL 样式的存储要求。
- lv_style_init(&style_obj);此时结构体内部成员全是随机垃圾值,样式还没生效,未完成初始化。
2.设置样式属性
通用函数格式
- 第 1 参数:样式结构体指针
- 第 2 参数:要设置的属性对应数值
代码示例
3.添加样式到对象
核心函数
- obj:目标 UI 控件对象指针,样式要挂载到这个控件上
- &style:lv_style_t 样式结构体的地址指针
- :选择器,由部件标识 + 状态标识按位或(|)组合,用于指定该样式生效的控件部位、交互状态;参数不能传入互斥标志,否则会被判定清除标记无法合并。
代码示例
补充拓展
- 多状态叠加写法(同时匹配按下 + 聚焦)
- 部件限定(仅修改按钮背景,不修改文字)
- 同一对象可多次调用 lv_obj_add_style 挂载多个样式,后添加样式优先级更高。
4.状态和部分
States(对象交互状态)
|
状态宏
|
数值
|
含义
|
|
LV_STATE_DEFAULT
|
0x0000
|
默认正常释放状态,传 0 等价于此
|
|
LV_STATE_CHECKED
|
0x0001
|
勾选 / 切换选中(开关、复选框)
|
|
LV_STATE_FOCUSED
|
0x0002
|
焦点(触摸点击、键盘选中)
|
|
LV_STATE_FOCUS_KEY
|
0x0004
|
仅键盘 / 编码器焦点,触摸不算
|
|
LV_STATE_EDITED
|
0x0008
|
编码器编辑中
|
|
LV_STATE_HOVERED
|
0x0010
|
鼠标悬浮,嵌入式触摸屏一般不支持
|
|
LV_STATE_PRESSED
|
0x0020
|
手指 / 鼠标按下
|
|
LV_STATE_SCROLLED
|
0x0040
|
正在滚动
|
|
LV_STATE_DISABLED
|
0x0080
|
控件禁用,不可交互
|
|
LV_STATE_USER_1~4
|
0x1000/0x2000/0x4000/0x8000
|
4 组自定义状态,自由拓展交互样式
|
Part(控件内部子部件)
|
部件宏
|
作用说明
|
|
LV_PART_MAIN
|
主体背景,绝大多数控件默认绘制区域
|
|
LV_PART_SCROLLBAR
|
滚动条部件
|
|
LV_PART_INDICATOR
|
指示器:滑块轨道、开关底色、复选框勾选区域
|
|
LV_PART_KNOB
|
可拖动旋钮 / 滑块手柄
|
|
LV_PART_SELECTED
|
列表 / 表格中被选中条目
|
|
LV_PART_ITEMS
|
批量重复元素:表格单元格、列表项
|
|
LV_PART_TICKS
|
刻度(仪表、进度条刻度)
|
|
LV_PART_CURSOR
|
光标(文本框输入光标、图表游标)
|
|
LV_PART_CUSTOM_FIRST
|
自定义部件起始标识,用于拓展控件
|
selector 组合使用示例(Part + State)
- selector = 部件 (Part) | 状态 (State),两者可以自由按位或合并;
- 不传 Part(只写状态 / 0)时,默认等价 LV_PART_MAIN;
- 样式匹配规则:控件当前部件 + 当前状态同时匹配 selector,该套样式才会生效;
5.本地样式
6.本地样式VS普通共享样式
- 共享限制:本地样式仅归属当前控件对象,无法多个控件共用;普通lv_style_t样式可以一次定义、批量绑定给任意多个对象。
- 内存管理:本地样式由 LVGL 内核自动分配内存,控件lv_obj_del()销毁时自动释放,无需手动管理;普通样式需要自己保证全局 /static 生命周期,不能是函数局部栈变量。
- 优先级:本地样式优先级高于所有通过lv_obj_add_style()挂载的普通级联样式,相同属性会覆盖普通样式。
- 适用场景:仅给单个控件做一次性自定义外观,无需复用样式时使用;批量统一外观优先用普通共享样式。
|
对比项
|
本地样式
lv_obj_set_style_xxx
|
普通共享样式 lv_style_t + lv_obj_add_style
|
|
复用性
|
仅当前控件可用,不能共享
|
一个 style 可批量绑定给 N 个按钮 / 窗口
|
|
内存管理
|
对象销毁自动释放,无需手动操作
|
需手动lv_style_init,无需手动销毁
|
|
优先级
|
更高,覆盖共享样式
|
更低,会被本地样式覆盖
|
|
使用场景
|
单个控件独有的特殊外观
|
统一批量 UI(全部按钮同色、全部标签同字体)
|
三、基础对象的事件
1.事件是什么
- 被点击
- 滚动
- 数值改变
- 重绘
- 等等。。
2.事件操作
添加事件回调
手动发送事件
删除事件
3.事件类型
- 输入设备事件 (Input device events)
- 绘图事件 (Drawing events)
- 其他事件 (Special events)
- 特殊事件 (Other events)
- 自定义事件 (Custom events)
4.事件回调函数的 lv_event_t 参数
- 获取触发的事件代码:
- 获取触发事件的对象:
- 获取最初触发事件的对象 (事件冒泡):
- 获取事件传递的用户数据:
- lv_event_get_user_data(e); 获取使用 lv_obj_add_event_cb 传递的用户数据
- lv_event_get_param(e); 获取使用 lv_event_send 传递的用户数据
5.事件冒泡
- lv_event_get_target(e); 获取触发事件的当前对象。
- lv_event_get_current_target(e); 获取事件冒泡的父对象。 备注:两个都是lv_event_t类型结构体中的成员
LVGL 事件冒泡完整解读
1. 冒泡机制原理
- 给控件开启 LV_OBJ_FLAG_EVENT_BUBBLE 标志后,自身产生的交互事件会向上传递给父控件;
- 若父控件同样开启冒泡标志,事件会继续向上传递给祖父控件,直到根屏幕;
- 每一层开启冒泡的父控件,绑定的事件回调都会依次执行。
2. target 与 current_target 核心区分
|
API
|
返回对象
|
冒泡场景举例(容器内按钮)
|
|
lv_event_get_target(e)
|
绑定回调的控件(监听对象)
|
容器绑定回调 → 返回容器
|
|
lv_event_get_current_target(e)
|
真正产生交互的原始控件(事件源头)
|
点击按钮触发冒泡 → 返回按钮
|
3. 冒泡开关 API 说明
4. 典型使用场景
- 容器统一处理:页面面板绑定点击回调,内部所有子按钮开启冒泡,点击任意子控件都能触发面板回调;
- 分层交互逻辑:子控件做细分操作,父容器做统一的页面背景响应;
- 全局拦截:给屏幕根对象开启冒泡,可捕获页面内所有控件的交互事件。
更多推荐


所有评论(0)