lvgl | guider应用笔记
字体数据生成
采用guider工具,
步骤如下;
- 在顶部菜单栏中,选择Resource Mannager 选择 font
- 然后导入字库文件ttf
层级
在开发UI界面的过程中,有时候,要求有图片分层的概念。
具体就是后创建的元素,在图层最上层
LVGL(Light and Versatile Graphics Library)是一个轻量级的嵌入式图形库,它支持多种显示设备。在 LVGL 中,图片确实有层级的概念。
当你创建一个对象(如图像、按钮等)时,你可以指定它的父对象。这样,子对象就会相对于其父对象进行定位和绘制。通过这种方式可以控制不同对象的显示顺序和覆盖关系。
例如:
lv_obj_t * parent = lv_cont_create(NULL, NULL); // 创建一个容器作为其他对象的父对象
lv_obj_set_size(parent, 100, 100); // 设置父容器的大小
// 在这个容器中创建一个新的图像
lv_img_t * img1 = lv_img_create(parent, NULL);
lv_img_set_src(img1, &my_image_symbol);
// 创建另一个图像,并将其放置在第一个图像之上
lv_img_t * img2 = lv_img_create(parent, NULL);
lv_img_set_src(img2, &my_image_background);
在这个例子中,img1 和 img2 是兄弟元素,它们都位于同一个父容器内。默认情况下,后添加的对象会覆盖先前添加的对象。如果你想要改变它们的层级关系(即哪个在上面),可以使用 lv_obj_move_foreground() 或者 lv_obj_move_background() 函数来调整特定对象的 Z-order。
使用 lv_obj_move_foreground(obj) 可以将某个对象移动到最前面。
使用 lv_obj_move_background(obj) 可以将某个对象移动到最后面。
因此,在 LVGL 中你可以通过设置不同的Z-order来管理图片和其他GUI组件之间的显示层级。
页面切换
元素显示、隐藏
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN)
lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN)
新页面加载API lv_scr_load
lv_scr_load(scr)
: 表示适不适用任何动画,而直接加载动画
在guider中,代码生成器中,生成的页面切换代码如下:
/* 未选中Delete current screen */
lv_obj_t * act_scr = lv_scr_act();
lv_disp_t * d = lv_obj_get_disp(act_scr);
if (d->prev_scr == NULL && (d->scr_to_load == NULL || d->scr_to_load == act_scr))
{
if (guider_ui.screen_2_del == true)
setup_scr_screen_2(&guider_ui);
lv_scr_load_anim(guider_ui.screen_2, LV_SCR_LOAD_ANIM_NONE, 100, 100, false);
guider_ui.screen_1_del = false;
}
}
原理解析:
(1)lv_obj_t * act_scr = lv_scr_act()
:获取当前屏幕中正在显示的页面的lv_obj_t类型的指针
(2)lv_disp_t * d = lv_obj_get_disp(act_scr)
;:获取当前屏幕对象关联的显示器对象
(3)d->prev_scr == NULL
LVGL支持页面切换动画,如从左到右切换,prev_scr就用作于此。当prev_scr不为NULL时,表示当前屏幕对象正在进行切换动画,并且可以通过prev_scr引用到前一个屏幕对象。当prev_scr为NULL时才能切换页面,这样做是为了防止在动画执行过程中对前一个屏幕对象进行删除操作,以及避免可能的资源冲突或不一致性
(4)(d->scr_to_load == NULL || d->scr_to_load == act_scr)
只有在scr_to_load 等于NULL或act_scr时才能切换页面。NULL表示当前没有在执行切换页面的动画(已经执行完毕),act_scr表示当前正处于从别的页面切换为当前页面的过程中。其它情况下,如当前页面1(act_scr)正准备切换到页面2时,执行切换到页面3是不被允许的。
(5)lv_obj_clean
表示在载入新的页面之前,删除当前页面的所有子对象。但当lv_scr_load_anim的最后一个参数为true时,会在下一次切换屏幕时调用lv_obj_del删除前一个页面及其子对象。但实际上我们先删除其子对象也不影响动画切换的效果,这是因为子对象已经绘制在act_scr中了,我们只需要当前页面的一个显示状态即可完成动画的过渡效果。