源码来自lvgl页面管理器–LanFly
大佬很厉害,我先学习一下,后面模仿着将相册demo也这样抽象出来。
LVGL 页面管理
1.初始化
lv_pm_history_len:
lv_pm_router:
LV_PM_PAGE_NUM:页面总数
2.创建页面
主要流程为创建页面管理结构体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.打开页面
1.通过lv_pm_router
管理所有页面,通过lv_pm_history[lv_pm_history_len] = id;
管理id。
2.留下函数指针接口,让用户自定义。页面的加载用到了主函数中注册的load函数。
3.于动画相关的函数没具体阅读,后面需要用到了再来学习。
4.根据id获取页面时,令_back = false
,但是不清楚有什么用,我猜测这个是是否删除页面的标志。
4.关闭当前页面并显示上一个页面
这个与3打开页面很相似,不同的点在于
pm_page->_back = true;
_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;
}