图层

创建顺序

默认情况下,LVGL 会将新对象绘制在旧对象的上方。

例如,假设我们向一个名为 button1 的父对象添加了一个按钮,然后再添加另一个名为 button2 的按钮。那么 button1(及其子对象)将位于背景中,并可能被 button2 及其子对象覆盖。

../_images/layers.png

/*创建一个屏幕*/
lv_obj_t * scr = lv_obj_create(NULL, NULL);
lv_scr_load(scr);          /*加载屏幕*/

/*创建两个按钮*/
lv_obj_t * btn1 = lv_btn_create(scr, NULL);         /*在屏幕上创建一个按钮*/
lv_btn_set_fit(btn1, true, true);                   /*启用根据内容自动设置大小*/
lv_obj_set_pos(btn1, 60, 40);              	   /*设置按钮的位置*/

lv_obj_t * btn2 = lv_btn_create(scr, btn1);         /*复制第一个按钮*/
lv_obj_set_pos(btn2, 180, 80);                    /*设置按钮的位置*/

/*为按钮添加标签*/
lv_obj_t * label1 = lv_label_create(btn1, NULL);	/*在第一个按钮上创建一个标签*/
lv_label_set_text(label1, "Button 1");          	/*设置标签的文本*/

lv_obj_t * label2 = lv_label_create(btn2, NULL);  	/*在第二个按钮上创建一个标签*/
lv_label_set_text(label2, "Button 2");            	/*设置标签的文本*/

/*删除第二个标签*/
lv_obj_del(label2);

移到前景

有四种显式方法可以将对象移到前景:

  • 使用 lv_obj_move_foreground(obj) 将对象移到前景。同样,使用 lv_obj_move_background(obj) 将其移到背景。

  • 使用 lv_obj_move_up(obj) 将对象在层级中上移一个位置。同样,使用 lv_obj_move_down(obj) 将其下移一个位置。

  • 使用 lv_obj_swap(obj1, obj2) 交换两个对象的相对层级位置。

  • 当使用 lv_obj_set_parent(obj, new_parent) 时,obj 将位于 new_parent 的前景。

顶层和系统层

LVGL 使用两个特殊的图层,分别是 layer_toplayer_sys。 这两个图层在显示器的所有屏幕上都是可见的,但它们不会在多个物理显示器之间共享layer_top 始终位于默认屏幕(lv_scr_act())的顶部,而 layer_sys 位于 layer_top 的顶部。

layer_top 可供用户创建一些在任何地方都可见的内容。例如,菜单栏、弹出窗口等。如果启用了 click 属性,则 layer_top 会吸收所有用户点击并充当模态层。

lv_obj_add_flag(lv_layer_top(), LV_OBJ_FLAG_CLICKABLE);

layer_sys 在 LVGL 中也用于类似的目的。例如,它将鼠标光标放置在所有图层之上,以确保其始终可见。