LanFly作者的lvgl page manager流程学习

源码来自lvgl页面管理器–LanFly
大佬很厉害,我先学习一下,后面模仿着将相册demo也这样抽象出来。

LVGL 页面管理

1.初始化

1.1

lv_pm_history_len:
lv_pm_router:
LV_PM_PAGE_NUM:页面总数

2.创建页面

图2.1
主要流程为创建页面管理结构体pm_page以及页面对象page
lv_pm_router为全局页面管理器

2.1主要结构体lv_pm_page_t

typedef struct _lv_pm_page_t
{
  lv_obj_t *page;
  lv_pm_lifecycle onLoad;
  lv_pm_lifecycle willAppear;
  lv_pm_lifecycle didAppear;
  lv_pm_lifecycle willDisappear;
  lv_pm_lifecycle didDisappear;
  lv_pm_lifecycle unLoad;
  lv_pm_open_options_t _options;
  bool _back;
} lv_pm_page_t;

3.打开页面

图3-1

1.通过lv_pm_router管理所有页面,通过lv_pm_history[lv_pm_history_len] = id;管理id。
2.留下函数指针接口,让用户自定义。页面的加载用到了主函数中注册的load函数。
3.于动画相关的函数没具体阅读,后面需要用到了再来学习。
4.根据id获取页面时,令_back = false,但是不清楚有什么用,我猜测这个是是否删除页面的标志。

4.关闭当前页面并显示上一个页面

这个与3打开页面很相似,不同的点在于

  1. pm_page->_back = true;
  2. _pm_anima_disAppear(pm_page, &pm_page->_options, _back_disAppear_complete_cb);

很显然,这个函数在页面disApper时调用了会删除页面的回调函数,其中有用户注册的unLoad函数。

5.新增接口:页面切换

模仿上述接口写的

/*****************************************************************************
* @data    :                                                                 *
* @input   : current_id:当前显示页面id                                             *
*            show_id:将要显示页面id                                                *
* @output  : 0:成功                                                            *
*            6:id非法                                                          *
* @brief   : 切换当前显示界面                                                        *
*****************************************************************************/

uint8_t lv_pm_switch(uint8_t current_id, uint8_t show_id)
{
    if (!(lv_pm_router[current_id]) || !(lv_pm_router[show_id]) || current_id > LV_PM_PAGE_NUM || show_id > LV_PM_PAGE_NUM)
        return 6;

    lv_pm_page_t* pm_page = lv_pm_router[current_id];
    pm_page->_back = false;
    lv_obj_t* page = pm_page->page;

    if (pm_page->willDisappear) {
        pm_page->willDisappear(page);
    }
    _pm_anima_disAppear(pm_page, &pm_page->_options, _disAppear_complete_cb);


    lv_pm_page_t* show_pm_page = lv_pm_router[show_id];
    lv_obj_t* show_page = show_pm_page->page;
    show_pm_page->_back = false;

    if (show_pm_page->willAppear) {
        show_pm_page->willAppear(show_page);
    }
    lv_obj_clear_flag(show_pm_page->page, LV_OBJ_FLAG_HIDDEN);
    _pm_anima_appear(show_pm_page, &pm_page->_options, _appear_complete_cb);

    return 0;
}

6.新增接口:根据id获取页面。用于获取隐藏页面,实现多页面中某些对象的同步改变

/*****************************************************************************
* @data    :                                                                 *
* @input   : page_id: 要获取的页面id                                          *
* @output  : 0:成功                                                          *
*            page:获取到的页面                                                *
* @brief   : 根据id获取页面                                                    *
*****************************************************************************/

lv_obj_t *lv_pm_get_page(uint8_t page_id)
{
	if (!(lv_pm_router[page_id])  || page_id > LV_PM_PAGE_NUM)
		return 6;

	lv_pm_page_t* pm_page = lv_pm_router[page_id];

	lv_obj_t* page = pm_page->page;

	return page;
}
LVGL(Light and Versatile Graphics Library)是一个开源的嵌入式图形库,用于创建图形化界面。它提供了丰富的界面元素和功能,可以在各种硬件平台上运行。LVGL的页面管理框架是LVGL图形库的核心组成部分之一。 页面管理框架是LVGL用于组织和管理界面显示的机制。在LVGL中,界面被划分为不同的页面,每个页面可以包含一个或多个界面元素,如按钮、标签、图像等。页面管理框架允许用户通过在不同页面之间进行切换来实现不同功能的展示和操作。 通过页面管理框架,用户可以轻松地创建和管理多个界面,并在需要时进行切换。例如,可以在一个页面上显示主菜单,另一个页面上显示设置选项,还可以在一个页面上显示实时数据等。通过切换页面,用户可以在不同的功能模块之间进行快速切换,提高用户体验和操作效率。 LVGL的页面管理框架还支持页面间的传递参数和数据共享。这意味着用户可以在切换页面时传递参数,从而实现不同页面之间的数据传递和共享。例如,可以在一个页面上设置某个参数,然后在另一个页面上使用该参数进行相应的计算或展示。 总之,LVGL的页面管理框架是一个灵活且强大的工具,可以帮助开发者轻松创建和管理多个界面,实现复杂的用户界面和交互功能。无论是在嵌入式设备上还是其他硬件平台上,LVGL的页面管理框架都能得到广泛的应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值