对象¶
在 LVGL 中,用户界面的基本构建块是对象,也称为小部件。 例如,按钮、标签、图像、列表、图表或文本区域。
您可以在对象类型中查看所有对象类型。
所有对象都通过 lv_obj_t 指针作为句柄进行引用。稍后可以使用此指针设置或获取对象的属性。
属性¶
工作机制¶
父子结构¶
父对象可以被视为其子对象的容器。每个对象都有一个父对象(屏幕除外),但一个父对象可以有任意数量的子对象。 父对象的类型没有限制,但某些对象通常是父对象(例如按钮)或子对象(例如标签)。
一起移动¶
如果父对象的位置发生变化,其子对象也会随之移动。 因此,所有位置都是相对于父对象的。

lv_obj_t * parent = lv_obj_create(lv_scr_act()); /*在当前屏幕上创建一个父对象*/
lv_obj_set_size(parent, 100, 80); /*设置父对象的大小*/
lv_obj_t * obj1 = lv_obj_create(parent); /*在先前创建的父对象上创建一个对象*/
lv_obj_set_pos(obj1, 10, 10); /*设置新对象的位置*/
修改父对象的位置:

lv_obj_set_pos(parent, 50, 50); /*移动父对象。子对象将随之移动。*/
(为了简洁,示例中未显示对象颜色的调整。)
仅在父对象上可见¶
如果子对象部分或完全超出其父对象,则超出部分将不可见。

lv_obj_set_x(obj1, -30); /*将子对象稍微移出父对象*/
此行为可以通过 lv_obj_add_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE); 覆盖,该标志允许子对象在父对象之外绘制。
创建和删除对象¶
在 LVGL 中,可以在运行时动态创建和删除对象。这意味着只有当前创建(存在)的对象会占用 RAM。
这允许在单击按钮打开屏幕时创建屏幕,并在加载新屏屏时删除屏幕。
可以根据设备的当前环境创建用户界面。例如,可以根据当前连接的传感器创建仪表、图表、条形图和滑块。
每个小部件都有自己的创建函数,其原型如下:
lv_obj_t * lv_<widget>_create(lv_obj_t * parent, <other parameters if any>);
通常,创建函数只有一个 parent 参数,用于指定在哪个对象上创建新小部件。
返回值是指向创建对象的指针,类型为 lv_obj_t *。
所有对象类型都有一个通用的删除函数。它会删除对象及其所有子对象。
void lv_obj_del(lv_obj_t * obj);
lv_obj_del 将立即删除对象。
如果由于某种原因无法立即删除对象,可以使用 lv_obj_del_async(obj),它将在下一次调用 lv_timer_handler() 时执行删除。
这在某些情况下很有用,例如在子对象的 LV_EVENT_DELETE 处理程序中删除父对象。
您可以使用 lv_obj_clean(obj) 删除对象的所有子对象(但不删除对象本身)。
您还可以使用 lv_obj_del_delayed(obj, 1000) 在一段时间后删除对象。延迟以毫秒为单位表示。
屏幕¶
创建屏幕¶
屏幕是没有父对象的特殊对象。因此可以这样创建:
lv_obj_t * scr1 = lv_obj_create(NULL);
屏幕可以用任何对象类型创建。例如,一个基础对象或一个图像来制作壁纸。
加载屏幕¶
要加载新屏幕,请使用 lv_scr_load(scr1)。
层¶
有两个自动生成的层:
顶层
系统层
它们独立于屏幕,并且会显示在每个屏幕上。顶层位于屏幕上的每个对象之上,系统层位于顶层之上。
您可以自由地将任何弹出窗口添加到顶层。但是,系统层仅限于系统级的内容(例如,鼠标光标将通过 lv_indev_set_cursor() 放置在那里)。
lv_layer_top() 和 lv_layer_sys() 函数分别返回顶层和系统层的指针。
阅读层概述部分以了解有关层的更多信息。
使用动画加载屏幕¶
可以通过使用 lv_scr_load_anim(scr, transition_type, time, delay, auto_del) 使用动画加载新屏幕。以下是可用的过渡类型:
LV_SCR_LOAD_ANIM_NONE在delay毫秒后立即切换LV_SCR_LOAD_ANIM_OVER_LEFT/RIGHT/TOP/BOTTOM将新屏幕向给定方向移动到当前屏幕上LV_SCR_LOAD_ANIM_OUT_LEFT/RIGHT/TOP/BOTTOM将旧屏幕向给定方向移出当前屏幕LV_SCR_LOAD_ANIM_MOVE_LEFT/RIGHT/TOP/BOTTOM将当前屏幕和新屏幕都向给定方向移动LV_SCR_LOAD_ANIM_FADE_IN/OUT将新屏幕淡入到旧屏幕上,或反之亦然
将 auto_del 设置为 true 将在动画完成时自动删除旧屏幕。
新屏幕将在动画开始后 delay 时间内变为活动屏幕(由 lv_scr_act() 返回)。
在屏幕动画期间,所有输入都被禁用。
部件¶
小部件由多个部件组成。例如,一个基础对象使用主部件和滚动条部件,而一个滑块使用主部件、指示器和旋钮部件。 部件类似于 CSS 中的伪元素。
LVGL 中存在以下预定义部件:
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可以从这里添加自定义部件。
部件的主要目的是允许为小部件的“组件”设置样式。 它们在样式概述部分中有更详细的描述。
状态¶
对象可以处于以下状态的组合中:
LV_STATE_DEFAULT正常,释放状态LV_STATE_CHECKED切换或选中状态LV_STATE_FOCUSED通过键盘或编码器聚焦,或通过触摸板/鼠标单击LV_STATE_FOCUS_KEY通过键盘或编码器聚焦,但不是通过触摸板/鼠标LV_STATE_EDITED通过编码器编辑LV_STATE_HOVERED被鼠标悬停(目前不支持)LV_STATE_PRESSED被按下LV_STATE_SCROLLED被滚动LV_STATE_DISABLED禁用状态LV_STATE_USER_1自定义状态LV_STATE_USER_2自定义状态LV_STATE_USER_3自定义状态LV_STATE_USER_4自定义状态
状态通常由库在用户与对象交互时自动更改(按下、释放、聚焦等)。
但是,状态也可以手动更改。
要设置或清除给定状态(但保留其他状态不变),请使用 lv_obj_add/clear_state(obj, LV_STATE_...)
在两种情况下都可以使用 OR-ed 状态值。例如:lv_obj_add_state(obj, part, LV_STATE_PRESSED | LV_PRESSED_CHECKED)。
要了解有关状态的更多信息,请阅读样式概述的相关部分。