LVGL笔记(一)
LVGL学习笔记
1.对象
屏幕
屏幕是没有父类的基础对象
LVGL的三层屏幕:
lv_scr_act(void); // 活动屏幕 disp->act_scr
lv_layer_top (void); // 顶层 disp->top_layer
lv_layer_sys (void); // 系统层 disp->sys_layer
设置相对于父级的位置(Position)
1 | 设置x轴方向的坐标位置: |
对齐(Alignment)
1 | 参照父对象对齐: |
对齐类型(LV_ALIGN_…)

获取位置(Get position)
1 | 获取x轴坐标位置: |
父子关系
1 | 为对象设置新的父级 |
LVGL对象的盒子模型

LVGL 遵循 CSS 的 border-box 模型。 对象的“盒子”由以下部分构成:
边界(bounding):元素的宽度/高度围起来的区域(整个盒子)。
边框(border):边框有大小和颜色等属性(相当于盒子的厚度和它的颜色)。
填充(padding):对象两侧与其子对象之间的空间(盒子的填充物)。
内容(content):如果边界框按边框宽度和填充的大小缩小,则显示其大小的内容区域(盒子实际装东西的区域)。
轮廓(outline) :LVGL中没有外边距(margin)的概念(盒子之间的距离),确认代之的是轮廓(outline)。它是绘制于元素(盒子)周围的一条线,它不占据空间,位于边框边缘的外围,可起到突出元素(盒子)的作用。在浏览器里,当鼠标点击或使用Tab键让一个选项或者一个图片获得焦点的时候,这个元素就会多了一个轮廓框围绕。轮廓(outline) 。
LVGL的盒子模型是我们理解对象(部件)的组成,修改对象的样式,实现对对象的布局、处理对象排列等等的关键。
样式总结
Styles 用于设置对象的外观
样式是 lv_style_t 变量,它可以保存边框宽度、文本颜色等属性
将样式(变量)分配给对象就可以改变其外观。
在赋值过程中,可以指定目标部分和目标状态。
一个样式可以给多个对象使用(正常样式)。
样式可以级联,也就是可以将多个样式分配给一个对象。
LVGL 会优先使用我们定义的样式,如果没有就会使用默认值。
后来添加的样式具有更高的优先级。
如果对象中未指定某些属性(例如文本颜色),就会从父级继承。
上面说的是 “正常” 样式,对象还有本地样式,它比 “正常” 样式具有更高的优先级。
默认有一个样式主题,我们也可以自己定义样式主题,作为默认的样式主题使用。
初始化样式
1 | static void lv_example_slider_2(void) |
获取样式属性
1 | 获取属性的最终值(考虑级联、继承、本地样式和转换): |
删除样式
1 | 删除对象的所有样式: lv_obj_remove_style_all(obj); |
背景部分的属性
1 | 背景属性和我们前面学习的盒子模型关系很大,背景属性主要有一下这些: |
样式的状态和部分
1 | 对象可以处于以下状态的组合: |
1 | 对象可以有 部分(parts) ,它们也可以有自己的样式。LVGL 中存在以下预定义部分: |
本地样式
1 | 除了“普通” 样式外,对象还可以存储 本地样式(私有样式) 。 |
样式继承
1 | 某些属性(通常与文本相关)可以从父对象的样式继承。 |
过渡特效
1 | 默认情况下,当一个对象改变状态(例如它被按下)时,新状态的新属性会立即设置。但是,通过转换,可以在状态更改时播放动画。 例如,按下按钮时,其背景颜色可以在 300 毫秒内动画显示为按下的颜色。 |
样式主题
1 | 主题是风格的集合。如果存在活动主题,LVGL将其应用于每个创建的部件(对象)。 这将为UI提供一个默认外观,然后可以通过添加更多样式对其进行修改。 |
宏开关
详见官方文档
1 | lv_obj_add/clear_flag(obj, LV_OBJ_FLAG_...); 启用/禁用 |
事件
1 |
|
添加事件
1 | lv_obj_add_event_cb(obj, event_cb, event_code, user_data); |
发送事件
1 | lv_event_send(obj, event_cb, event_code, user_data); |
删除事件
1 | lv_obj_remove_event_cb(obj, event_cb); |
事件类型(event_code)
1 | 输入设备事件(Input device events) |
事件回调函数的 lv_event_t 参数
1 | 事件回调函数只有一个参数,这个参数对我们的作为非常大,现在的版本提供这些功能: |
1 | 一个事件回调函数可给多个对象使用 |
事件冒泡
1 | 启用方式: |
标签
1 | #include "../../lv_100ask_teach_demos.h" |
在盒子模型里面,标签的组成包括:
1 | LV_PART_MAIN 矩形部分(盒子区域)。 填充值可用于在文本和背景之间添加空间。 |
创建标签:
1 | lv_obj_t * label = lv_label_create(parent); |
设置显示文本
1 | 直接设置要显示的文本: |
大小
1 | lv_label_set_long_mode(label, LV_LABEL_LONG_...) 指定模式。 |
1 | 默认情况标签的大小会自动拓展成和文本一样的大小(LV_SIZE_CONTENT) |
文本着色
1 | lv_style_set_text_color(&style_obj, lv_color_hex(0xf7b37b)); |
也可以让文本某些部分重新着色,例如:
1 | lv_label_set_recolor(label1, true); |
文本选择
1 | 如果在 lv_conf.h 中打开了 LV_LABEL_TEXT_SELECTION (默认开启),就可以选择部分文本了。这个和我们在PC用鼠标选中文本类似,但是这个效果只能在文本框(lv_textarea)中实现。Label只能事先手动选择指定范围的文本: |
显示图标

用法(LV_SYMBOL_…):
1 | lv_label_set_text(my_label, LV_SYMBOL_OK); // 直接显示图标 |
事件处理
1 | Label默认不接收输入事件,如果我们想设置输入类型的样式或者事件会无法生效,就需要打开 LV_OBJ_FLAG_CLICKABLE,示例: |
显示中文
1 | LVGL内置有一个中文字库 [CJK](https://zh.wikipedia.org/wiki/中日韓統一表意文字)[字库](https://zh.wikipedia.org/wiki/中日韓統一表意文字) ,这个字库在 lv_conf.h中定义为:LV_FONT_SIMSUN_16_CJK。 |
1 | 1.为要输出字体命名。例如“font_source_han_sans_bold_20” |

1 | 1.将结果 C 文件复制到你的 LVGL 项目中,并包含到项目; |

