对象

在 LVGL 中,用户界面的基本构建块是对象,也称为小部件。 例如,按钮标签图像列表图表文本区域

您可以在对象类型中查看所有对象类型。

所有对象都通过 lv_obj_t 指针作为句柄进行引用。稍后可以使用此指针设置或获取对象的属性。

属性

基本属性

所有对象类型共享一些基本属性:

  • 位置

  • 大小

  • 父对象

  • 样式

  • 事件处理程序

  • 等等

您可以使用 lv_obj_set_...lv_obj_get_... 函数设置/获取这些属性。例如:

/*设置基本对象属性*/
lv_obj_set_size(btn1, 100, 50);	  /*设置按钮的大小*/
lv_obj_set_pos(btn1, 20,30);      /*设置按钮的位置*/

要查看所有可用的函数,请访问基础对象的文档

特定属性

对象类型也有特殊属性。例如,滑块具有:

  • 最小值和最大值

  • 当前值

对于这些特殊属性,每种对象类型可能都有独特的 API 函数。例如,对于滑块:

/*设置滑块的特定属性*/
lv_slider_set_range(slider1, 0, 100);	   				/*设置最小值和最大值*/
lv_slider_set_value(slider1, 40, LV_ANIM_ON);		/*设置当前值(位置)*/

小部件的 API 在其文档中进行了描述,您也可以查看相应的头文件(例如 widgets/lv_slider.h)。

工作机制

父子结构

父对象可以被视为其子对象的容器。每个对象都有一个父对象(屏幕除外),但一个父对象可以有任意数量的子对象。 父对象的类型没有限制,但某些对象通常是父对象(例如按钮)或子对象(例如标签)。

一起移动

如果父对象的位置发生变化,其子对象也会随之移动。 因此,所有位置都是相对于父对象的。

../_images/par_child1.png

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);	                     /*设置新对象的位置*/

修改父对象的位置:

../_images/par_child2.png

lv_obj_set_pos(parent, 50, 50);	/*移动父对象。子对象将随之移动。*/

(为了简洁,示例中未显示对象颜色的调整。)

仅在父对象上可见

如果子对象部分或完全超出其父对象,则超出部分将不可见。

../_images/par_child3.png

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_act() 函数。

加载屏幕

要加载新屏幕,请使用 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_NONEdelay 毫秒后立即切换

  • 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() 返回)。 在屏幕动画期间,所有输入都被禁用。

处理多个显示器

屏幕是在当前选择的默认显示器上创建的。 默认显示器是使用 lv_disp_drv_register 注册的最后一个显示器。您还可以使用 lv_disp_set_default(disp) 显式选择一个新的默认显示器。

lv_scr_act()lv_scr_load()lv_scr_load_anim() 在默认屏幕上操作。

访问多显示器支持以了解更多信息。

部件

小部件由多个部件组成。例如,一个基础对象使用主部件和滚动条部件,而一个滑块使用主部件、指示器和旋钮部件。 部件类似于 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)

要了解有关状态的更多信息,请阅读样式概述的相关部分。

快照

可以为对象及其子对象生成快照图像。详细信息请参阅快照