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. 页面管理对象的实现,页面管理对象主要是为了方便页面之间的切换以及内存的释放(即删除没有加载在界面上页上的资源)。主要功能为函数有添加新的页面切换页面。用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. 添加页面函数,参数分别为添加的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. 页面切换函数,这个函数主要是根据传递进来的标识符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;
        }
    }
}

至此一个简单的页面管理就这样完成了,可以满足大部分要求了。在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

完整代码如下


#ifndef __PAGE_MANAGE_
#define __PAGE_MANAGE_


#include "../lvgl/lvgl.h"
#include <iostream>
#include <vector>


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;
        }
    }
}

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值