• lvgl页面管理 简单实现


    一. 简介

    lvgl使用的过程中,最初的时候,肯定都会遇到这样的问题,页面之间的切换以及空间的释放。如果不合理的设计的话,一上来就将所有的页面进行初始化,那将会占用许多不必要的内存空间,硬写之间的切换的话,界面一旦多起来,那切换逻辑将会绕来绕去,最终会写不下去。
    所以合理设计一个页面管理函数或者说是对象将会非常重要。

    欢迎关注 !!!!!!!


    二. 设计思路

    • 首先,每个页面,最好有一个属于它自己的标识符,也就是名字。
    • 其次,每个页面,拥有属于它自己的初始化函数。
    • 再者,每个页面,最好拥有它自己的动画函数(加载时和切换时)。

    基于上面三点就可以完成一个基本的页面管理对象了,是不是非常简单。


    三. 实现过程

    1. 上面的三个条件,可以使用一个结构体完成,代码实现如下,初始化函数和动画函数分别使用函数指针来存储,这样一个较为完整的页面结构体就完成了。
    typedef struct 
    {
        unsigned char     pageID;             //pageID 每个页面有唯一的ID
        lv_obj_t*         page;               //界面
        lv_scr_load_anim_t load_anim;
        void (*init)(lv_obj_t* page);         //页面初始化
        void (*exit)(lv_obj_t* page);         //退出动画
    }PAGE;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 页面管理对象的实现,页面管理对象主要是为了方便页面之间的切换以及内存的释放(即删除没有加载在界面上页上的资源)。主要功能为函数有添加新的页面切换页面。用c++实现,主要是为了使用c++的vector容器,使用c的话,可以用链接代替。
    class PageManage
    {
    public:
        PageManage(PAGE *home_page, void (*init)(lv_obj_t* page));     //初始化,并且设置home界面
        ~PageManage();
    
        void page_manage_add_page(PAGE* page,unsigned char id, lv_scr_load_anim_t anim, void (*init)(lv_obj_t* page));
        void page_manage_switch_page(unsigned char id);
    
    private:
        PAGE* curr_page;
        vector<PAGE *> pagelist;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 添加页面函数,参数分别为添加的PAGE,PAGE的标识符ID,加载时的动画,以及初始化函数。然后将添加的PAGE,添加到PageList中去,此时,页面并没有被初始化,只占用一个指针大小的空间,可忽略不计。
    void PageManage::page_manage_add_page(PAGE* page, unsigned char id, lv_scr_load_anim_t anim, void (*init)(lv_obj_t* page))
    {
        page->pageID = id;
        page->page = lv_obj_create(NULL);
        page->load_anim = anim;
        page->init = init;
        pagelist.push_back(page);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 页面切换函数,这个函数主要是根据传递进来的标识符ID,来切换页面。具体做法就是去pagelist中去查找对应ID号的PAGE,对其初始化后,加载在当前界面上,并且释放掉上一个界面的空间,最后更新当前界面界面。
    void PageManage::page_manage_switch_page(unsigned char id)
    {
        unsigned char i;
        for (i = 0; i < pagelist.size(); i++)
        {
            PAGE* page = pagelist[i];
    
            if (page->pageID == id)     //根据ID查找页面
            {
                page->init(page->page);    //初始化界面
                lv_scr_load_anim(page->page, page->load_anim, 800, 0, false);  //加载界面
                if(curr_page != NULL)
                    lv_obj_clean(curr_page->page);		//清除界面上的内容,释放空间
                curr_page = page;				//更新当前页
                break;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    至此一个简单的页面管理就这样完成了,可以满足大部分要求了。在main函数中添加页类似于,可以在此基础上进行进一步的完善。

        PAGE home_page;
        PAGE ble_page;
        PAGE clock_page;
        PAGE game_page;
        PAGE photo_page;
    
        PageManage manage(&home_page, ui_wifiset_init);  //默认ID为0
        manage.page_manage_add_page(&ble_page, 4, LV_SCR_LOAD_ANIM_MOVE_LEFT,BLE_HID_Page_Init);
        manage.page_manage_add_page(&clock_page, 2, LV_SCR_LOAD_ANIM_FADE_ON, Clock_Page_Init);
        manage.page_manage_add_page(&game_page,1, LV_SCR_LOAD_ANIM_FADE_ON, _2048_Page_Init);
        manage.page_manage_add_page(&photo_page,3, LV_SCR_LOAD_ANIM_OVER_TOP, Photo_Page_Init);
      
        manage.page_manage_switch_page(0);  //添加页面0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    完整代码如下

    
    #ifndef __PAGE_MANAGE_
    #define __PAGE_MANAGE_
    
    
    #include "../lvgl/lvgl.h"
    #include 
    #include 
    
    
    using namespace std;
    
    
    typedef struct 
    {
        unsigned char     pageID;             //pageID 每个页面有唯一的ID
        lv_obj_t*         page;               //界面
        lv_scr_load_anim_t load_anim;
        void (*init)(lv_obj_t* page);         //页面初始化
        void (*exit)(lv_obj_t* page);         //退出动画
    
    }PAGE;
    
    
    
    class PageManage
    {
    public:
        PageManage(PAGE *home_page, void (*init)(lv_obj_t* page));     //初始化,并且设置home界面
        ~PageManage();
    
        void page_manage_add_page(PAGE* page,unsigned char id, lv_scr_load_anim_t anim, void (*init)(lv_obj_t* page));
        void page_manage_switch_page(unsigned char id);
    
    private:
        PAGE* curr_page;
        vector<PAGE *> pagelist;
    };
    
    #endif
    
    
    --------------------------------------------------------------------
    
    #include "Page_Manage.h"
    
    
    
    
    PageManage::PageManage(PAGE* home_page, void (*init)(lv_obj_t* page))
    {
        home_page->page = lv_obj_create(NULL);
        home_page->load_anim = LV_SCR_LOAD_ANIM_MOVE_LEFT;
        home_page->pageID = 0;
        home_page->init = init;
        //curr_page = home_page;
        curr_page = NULL;
        //init(home_page->page);                      //初始化home_page
        pagelist.push_back(home_page);
    }
    PageManage::~PageManage()
    {
    
    }
    
    void PageManage::page_manage_add_page(PAGE* page, unsigned char id, lv_scr_load_anim_t anim, void (*init)(lv_obj_t* page))
    {
        page->pageID = id;
        page->page = lv_obj_create(NULL);
        page->load_anim = anim;
        page->init = init;
        //init(page->page);
        pagelist.push_back(page);
    }
    
    void PageManage::page_manage_switch_page(unsigned char id)
    {
        unsigned char i;
        for (i = 0; i < pagelist.size(); i++)
        {
            PAGE* page = pagelist[i];
    
            if (page->pageID == id)
            {
    
                page->init(page->page);
                lv_scr_load_anim(page->page, page->load_anim, 800, 0, false);
                if(curr_page != NULL)
                    lv_obj_clean(curr_page->page);
                curr_page = page;
                break;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95

    回复 LVGL页面管理 获取完成代码
    关注↓↓↓

  • 相关阅读:
    Redis工具类---常用方法
    solidity开发讲解
    [附源码]SSM计算机毕业设计整形美容咨询网站JAVA
    【算法】蓝桥杯全攻略:从语言基础到数学算法,一站式解锁竞赛技巧
    【Pytorch基础教程32】基于transformer的情感分类
    腾讯云服务器“可用区”相关问题解答(新手选择指导)
    校招程序员无项目经验如何破局
    文献 | 肥胖这种病,心理因素是源头?
    archlinux 安装matlab
    day33 文件上传&中间件解析漏洞&编辑器安全
  • 原文地址:https://blog.csdn.net/weixin_44678052/article/details/128211713