什么是 Screen?
在 LVGL 中,任何通过 lv_obj_create(NULL) 创建的控件都被视为一个 Screen。它是 Widget 树的根节点,通常使用 Base Widget 创建,但也可以用 Image Widget 来实现壁纸效果。
lv_obj_t * scr1 = lv_obj_create(NULL);
创建的 Screen 默认绑定到当前显示器,并自动匹配其分辨率。需要注意的是,不能对 Screen 使用 lv_obj_set_pos() 或lv_obj_set_size()进行位置和尺寸设置。
什么是 Active Screen
每个显示器(lv_display)可以拥有多个 Screens,但同一时刻只有一个是“Active Screen”,即当前显示的界面。LVGL 会在创建显示器时自动生成一个默认的 Active Screen。
获取当前 Active Screen:lv_screen_active()
设置新的 Active Screen:lv_screen_load() 或 lv_screen_load_anim()
如何切换 Screen?
切换界面时,可以选择是否使用动画效果:
lv_screen_load(scr1); // 直接切换
或者使用动画方式
lv_screen_load_anim(scr1, LV_SCREEN_LOAD_ANIM_FADE_IN, 500, 0, true);
动画类型包括:
无动画:LV_SCREEN_LOAD_ANIM_NONE
新界面覆盖旧界面:LV_SCREEN_LOAD_ANIM_OVER_LEFT 等
旧界面滑出:LV_SCREEN_LOAD_ANIM_OUT_RIGHT 等
双界面同时移动:LV_SCREEN_LOAD_ANIM_MOVE_TOP 等
淡入淡出:LV_SCREEN_LOAD_ANIM_FADE_IN / FADE_OUT
动画期间,所有输入事件(如触摸、按键)都会被禁用,确保切换过程流畅。
/**
* @brief 屏幕加载动画类型(LVGL 屏幕切换时的过渡效果)
*/
typedef enum {
LV_SCR_LOAD_ANIM_NONE, /**< 无动画,直接切换到新屏幕 */
LV_SCR_LOAD_ANIM_OVER_LEFT, /**< 新屏幕从左侧覆盖到旧屏幕上 */
LV_SCR_LOAD_ANIM_OVER_RIGHT, /**< 新屏幕从右侧覆盖到旧屏幕上 */
LV_SCR_LOAD_ANIM_OVER_TOP, /**< 新屏幕从顶部覆盖到旧屏幕上 */
LV_SCR_LOAD_ANIM_OVER_BOTTOM, /**< 新屏幕从底部覆盖到旧屏幕上 */
LV_SCR_LOAD_ANIM_MOVE_LEFT, /**< 新屏幕从右往左移动,旧屏幕同时左移退出 */
LV_SCR_LOAD_ANIM_MOVE_RIGHT, /**< 新屏幕从左往右移动,旧屏幕同时右移退出 */
LV_SCR_LOAD_ANIM_MOVE_TOP, /**< 新屏幕从下往上移动,旧屏幕同时上移退出 */
LV_SCR_LOAD_ANIM_MOVE_BOTTOM, /**< 新屏幕从上往下移动,旧屏幕同时下移退出 */
LV_SCR_LOAD_ANIM_FADE_IN, /**< 新屏幕从透明逐渐淡入 */
LV_SCR_LOAD_ANIM_FADE_ON = LV_SCR_LOAD_ANIM_FADE_IN, /**< 向后兼容,等价于 FADE_IN */
LV_SCR_LOAD_ANIM_FADE_OUT, /**< 旧屏幕逐渐淡出,再显示新屏幕 */
LV_SCR_LOAD_ANIM_OUT_LEFT, /**< 旧屏幕向左滑出,新屏幕立即出现 */
LV_SCR_LOAD_ANIM_OUT_RIGHT, /**< 旧屏幕向右滑出,新屏幕立即出现 */
LV_SCR_LOAD_ANIM_OUT_TOP, /**< 旧屏幕向上滑出,新屏幕立即出现 */
LV_SCR_LOAD_ANIM_OUT_BOTTOM, /**< 旧屏幕向下滑出,新屏幕立即出现 */
} lv_screen_load_anim_t;












删除 Screen 的注意事项
虽然可以使用 lv_obj_delete(scr) 删除 Screen,但千万不要删除当前的 Active Screen,否则可能导致显示异常。



2293

被折叠的 条评论
为什么被折叠?



