用户工具

站点工具


icore4tlvgl_9
银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-11-28 yang 初次建立

实验九:Layers图层

一、创建顺序

默认情况下,LVGL 在背景上绘制旧对象,在前景上绘制新对象。例如,假设我们在屏幕中创建一个名为 button1 的按钮,然后又创建另一个名为 button2 的按钮。然后你会发现 button1(及其子对象)将在背景图层中,并且可以被 button2 及其子对象覆盖。

void lv_gui_run(void)
{
	lvgl2rtt_init("lcd");                                /* 初始化lvgl2rtt */
 
	lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); /* 在屏幕中创建button1 */
	lv_obj_set_pos(btn1, 80, 50);                        /* 设置button1坐标 */
	lv_obj_set_size(btn1, 150, 100);                     /* 设置button1尺寸 */
 
	lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), btn1); /* 在屏幕中创建button2 */
	lv_obj_set_pos(btn2, 180, 80);                       /* 设置button2坐标 */
	lv_obj_set_size(btn2, 150, 100);                     /* 设置button2尺寸 */
 
	lv_obj_t * label1 = lv_label_create(btn1, NULL);     /* 在button1中创建一个标签子对象 */
	lv_label_set_text(label1, "Button 1");               /* 设置标签内容 */
	lv_obj_t * label2 = lv_label_create(btn2, NULL);     /* 在button2中创建一个标签子对象 */
	lv_label_set_text(label2, "Button 2");               /* 设置标签内容 */
}

二、设置到前景图层

有几种方法可以将对象置于前台:

  • 使用 lv_obj_set_top (obj, true)。如果 obj 或它的任何子对象被点击,那么 LVGL 将自动将该对象置于前台。它的工作原理类似于 PC 上的典型 GUI。当点击背景中的一个窗口时,它会自动来到前台。
  • 使用 lv_obj_move_foreground(obj) 显式地告诉库将一个对象放到前台。类似地,使 用lv_obj_move_background(obj) 移动对象到背景图层中。
  • lv_obj_set_parent(obj, new_parent) 被使用时,obj 将在 new_parent 的前台。

下面的例子是使用第一种方式,通过点击将按钮自动置于前台。

void lv_gui_run(void)
{
	lvgl2rtt_init("lcd");                                 /* 初始化lvgl2rtt */
	lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);  /* 在屏幕中创建button1 */
	lv_obj_set_pos(btn1, 80, 50);                         /* 设置button1坐标 */
	lv_obj_set_size(btn1, 150, 100);                      /* 设置button1尺寸 */
	lv_obj_set_top(btn1, true);                           /* 被点击时置于前景图层 */
	lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), btn1);  /* 在屏幕中创建button2 */
	lv_obj_set_pos(btn2, 180, 80);                        /* 设置button2坐标 */
	lv_obj_set_size(btn2, 150, 100);                      /* 设置button2尺寸 */
	lv_obj_set_top(btn2, true);                           /* 被点击时置于前景图层 */
 
	lv_obj_t * label1 = lv_label_create(btn1, NULL);      /* 在button1中创建一个标签子对象 */
	lv_label_set_text(label1, "Button 1");                /* 设置标签内容 */
	lv_obj_t * label2 = lv_label_create(btn2, NULL);      /* 在button2中创建一个标签子对象 */
	lv_label_set_text(label2, "Button 2");                /* 设置标签内容 */
}

下面的例子是使用第二种方式,通过软件命令将按钮自动置于前台。

void lv_gui_run(void)
{
	lvgl2rtt_init("lcd");                                /* 初始化lvgl2rtt */
 
	lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); /* 在屏幕中创建button1 */
	lv_obj_set_pos(btn1, 80, 50);                        /* 设置button1坐标 */
	lv_obj_set_size(btn1, 150, 100);                     /* 设置button1尺寸 */
	lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), btn1); /* 在屏幕中创建button2 */
	lv_obj_set_pos(btn2, 180, 80);                       /* 设置button2坐标 */
	lv_obj_set_size(btn2, 150, 100);                     /* 设置button2尺寸 */
 
	lv_obj_t * label1 = lv_label_create(btn1, NULL);     /* 在button1中创建一个标签子对象 */
	lv_label_set_text(label1, "Button 1");               /* 设置标签内容 */
	lv_obj_t * label2 = lv_label_create(btn2, NULL);     /* 在button2中创建一个标签子对象 */
	lv_label_set_text(label2, "Button 2");               /* 设置标签内容 */
 
	while(true){
		lv_obj_move_foreground(btn1);                /* 将button1置于前景图层 */
		rt_thread_mdelay(1000);
		lv_obj_move_foreground(btn2);                /* 将button2置于前景图层 */
		rt_thread_mdelay(1000);
	}
}

三、顶层和系统层

LVGL 使用两个特殊的层,分别名为 layer_toplayer_sys。两者在显示器的所有屏幕上都是可见的和常见的。但是,它们不能在多个物理显示器之间共享。layer_top 总是位于默认屏幕的顶部 ( lv_scr_act() ),而 layer_sys 位于 layer_top 的顶部 用户可以使用 layer_top 创建一些随处可见的内容。例如,一个菜单栏,一个弹出窗口等等。如果单击属性是启用的,那么 layer_top 将吸收所有用户单击,并作为一个模块运行。

lv_obj_set_click (lv_layer_top(), true);

在 LVGL 上 layer_sys 也用于类似的目的。例如,LVGL将鼠标光标放在系统层上,以确保它总是可见的。

icore4tlvgl_9.txt · 最后更改: 2022/04/01 11:13 由 sean