当前位置: 首页 > news >正文

任县城乡建设局网站广东源江建设集团有限公司网站

任县城乡建设局网站,广东源江建设集团有限公司网站,成都交易网站建设,佛山新网站建设机构lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存#xff0c;界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举#xff0c;用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_por…lv_scr_mgr lvgl 界面管理器 适配 lvgl 8.3 降低界面之间的耦合使用较小的内存界面切换后会自动释放内存内存泄漏检测 使用方法 在lv_scr_mgr_port.h 中创建一个枚举用于界面ID为每个界面创建一个页面管理器句柄将界面句柄添加到 lv_scr_mgr_port.c 数组中在 lv_init() 后对页面管理器进行初始化 lv_scr_mgr_init(NULL);使用 lv_scr_mgr_switch 设置初始根界面使用 lv_scr_mgr_push lv_scr_mgr_pop 对界面进行操作 git地址 git地址 gitee /*********************************CopyRight ************************************* file lv_scr_mgr.c* author 不咸不要钱* date 2023-10-11 13:4:36* brief #* *******************************************************************************//* Includes ------------------------------------------------------------------*/ #include lvgl.h #include lv_scr_mgr.h #if !LV_SCR_MGR_REG_ENABLE #include lv_scr_mgr_port.c #endiftypedef struct {uint32_t scr_cnt; void* param;lv_scr_mgr_handle_t **handles; #if LV_SCR_MGR_PRINTF_MEMuint32_t *max_mem; #endif }scr_mgr_list_handle_t;static scr_mgr_list_handle_t mgr_list; static lv_scr_mgr_stack_node_t* mgr_stack_top NULL; static lv_scr_mgr_stack_node_t* mgr_stack_root NULL;static lv_scr_mgr_handle_t* find_handle_by_id(uint32_t id) {for (int i 0; i mgr_list.scr_cnt; i){if (mgr_list.handles[i]-scr_id id){return mgr_list.handles[i];}}return NULL; } #if LV_SCR_MGR_PRINTF_MEM static uint32_t* find_mem_addr_by_id(uint32_t id) {for (int i 0; i mgr_list.scr_cnt; i){if (mgr_list.handles[i]-scr_id id){return mgr_list.max_mem[i];}}return NULL; }static void mem_max_printf(uint32_t id) {static uint32_t mem_max 0;lv_mem_monitor_t mon;lv_mem_monitor(mon);if (mon.total_size - mon.free_size mem_max){mem_max mon.total_size - mon.free_size;LV_LOG_USER(used: %d (%d %%), frag: %d %%, biggest free: %d\n, mem_max,mon.used_pct,mon.frag_pct,(int)mon.free_biggest_size);}/* 当前界面最大使用内存 */uint32_t* page_max_mem find_mem_addr_by_id(id);if (mon.total_size - mon.free_size *page_max_mem){*page_max_mem mon.total_size - mon.free_size;LV_LOG_USER(page id %d, used: %d (%d %%), frag: %d %%, biggest free: %d\n, id, *page_max_mem,mon.used_pct,mon.frag_pct,(int)mon.free_biggest_size);} }static void anim_mem_max_printf(lv_event_t* e) {lv_event_code_t event_code lv_event_get_code(e);if (event_code LV_EVENT_SCREEN_LOADED){mem_max_printf((uint32_t)lv_event_get_user_data(e));} } #endifstatic void scr_mgr_stack_free(void) {lv_scr_mgr_stack_node_t* stack_node NULL;/* 释放界面栈 */while (NULL ! mgr_stack_top){stack_node mgr_stack_top-prev;if(mgr_stack_top-handle-scr_destroy)mgr_stack_top-handle-scr_destroy();lv_mem_free((void*)mgr_stack_top);mgr_stack_top stack_node;}mgr_stack_root NULL; }/*** brief 入栈* param tag 要入栈的句柄* return 栈顶句柄 */ static lv_scr_mgr_stack_node_t* scr_mgr_stack_push(lv_scr_mgr_handle_t* tag) {lv_scr_mgr_stack_node_t* stack_node NULL;stack_node lv_mem_alloc(sizeof(lv_scr_mgr_stack_node_t));LV_ASSERT_MALLOC(stack_node);stack_node-handle tag;stack_node-next NULL;if (stack_node-handle-scr_first_create){stack_node-handle-scr_first_create();}if (tag-scr_create){stack_node-scr tag-scr_create(stack_node-handle-scr_id, mgr_list.param);}else{LV_LOG_ERROR(no create fun!);}if (NULL mgr_stack_top){stack_node-prev NULL;mgr_stack_root stack_node;}else{stack_node-prev mgr_stack_top;mgr_stack_top-next stack_node;}mgr_stack_top stack_node;return stack_node; }static int32_t scr_mgr_stack_pop(int32_t n) {lv_scr_mgr_stack_node_t* stack_node NULL;int32_t i n;if ((NULL mgr_stack_top) || (NULL mgr_stack_top-prev)){return 0;}while (i){if ((NULL mgr_stack_top) || (NULL mgr_stack_top-prev)){break;}stack_node mgr_stack_top-prev;if (mgr_stack_top-handle-scr_destroy){mgr_stack_top-handle-scr_destroy();}lv_mem_free((void*)mgr_stack_top);mgr_stack_top stack_node;i--;}if (NULL ! mgr_stack_top-handle-scr_create){mgr_stack_top-scr mgr_stack_top-handle-scr_create(mgr_stack_top-handle-scr_id, mgr_list.param);}else{LV_LOG_ERROR(no create fun!);}if (i){LV_LOG_WARN(stack pop %d, but stack is %d, n, n-i);}return n - i; }/*** brief 切换界面* param cur_scr 当前界面* param stack_node 目标界面句柄* param anim 切换界面动画开关* 关闭界面切换动画切换界面时会先创建一个新的空界面切换到空界面后* 删除之前的界面然后再创建切换到新界面最后再删除中间界面。会节省内存。* 关闭界面切换动画切换界面时直接创建新界面然后再用动画切换到新界面。** return true */ bool scr_mgr_switch(lv_obj_t* cur_scr, lv_scr_mgr_stack_node_t* stack_node, bool anim) {lv_scr_load_anim_t load_anim LV_SCR_MGR_LOAD_ANIM_DEFAULT;lv_obj_t* tmp_scr NULL;if (anim){if ((stack_node-handle-anim_type ! LV_SCR_LOAD_ANIM_NONE) (LV_SCR_LOAD_ANIM_OUT_BOTTOM stack_node-handle-anim_type)){load_anim stack_node-handle-anim_type;}#if LV_SCR_MGR_PRINTF_MEMlv_obj_add_event_cb(stack_node-scr, anim_mem_max_printf, LV_EVENT_SCREEN_LOADED, stack_node-handle-scr_id); #endiflv_scr_load_anim(stack_node-scr, load_anim, LV_SCR_MGR_LOAD_ANIM_TIME, LV_SCR_MGR_LOAD_ANIM_DELAY, true);}else{if (NULL ! cur_scr){tmp_scr lv_obj_create(NULL);lv_scr_load(tmp_scr);lv_obj_del(cur_scr);cur_scr NULL;}lv_scr_load(stack_node-scr);#if LV_SCR_MGR_PRINTF_MEMmem_max_printf(stack_node-handle-scr_id); #endifif (NULL ! tmp_scr){lv_obj_del(tmp_scr);}}return true; }/*** brief 初始化界面管理器* param param 创建界面时的参数* return */ bool lv_scr_mgr_init(void* param) {mgr_list.param param; #if LV_SCR_MGR_REG_ENABLE#elsemgr_list.scr_cnt sizeof(scr_mgr_handles) / sizeof(scr_mgr_handles[0]);mgr_list.handles scr_mgr_handles; #endif if (0 mgr_list.scr_cnt){LV_LOG_ERROR(no screen!);return false;}#if LV_SCR_MGR_PRINTF_MEMmgr_list.max_mem lv_mem_alloc(mgr_list.scr_cnt * sizeof(uint32_t*));LV_ASSERT(mgr_list.max_mem);memset(mgr_list.max_mem, 0, mgr_list.scr_cnt * sizeof(uint32_t*)); #endifreturn true; }void lv_scr_mgr_deinit(void) {mgr_list.param NULL; #if LV_SCR_MGR_PRINTF_MEMlv_mem_free(mgr_list.max_mem); #endifscr_mgr_stack_free(); }void lv_scr_mgr_param_set(void* param) {mgr_list.param param; }void* lv_scr_mgr_param_get(void) {return mgr_list.param; }/*** brief 设置根界面* param id 根界面序号* param anim 动画开关* return */ bool lv_scr_mgr_switch(uint32_t id, bool anim) {lv_scr_mgr_handle_t* tag_handle find_handle_by_id(id);lv_scr_mgr_handle_t* cur_handle NULL;lv_scr_mgr_stack_node_t* stack_node NULL;lv_obj_t* cur_scr NULL;if (NULL tag_handle){LV_LOG_ERROR(no screen, id %d, id);return false;}if (NULL ! mgr_stack_top){/* 栈内有界面 */cur_handle mgr_stack_top-handle;cur_scr mgr_stack_top-scr;}else{cur_scr lv_scr_act();}scr_mgr_stack_free();if ((NULL cur_handle) || (tag_handle-scr_id cur_handle-scr_id)){/* 没有界面切换不使用动画效果 */anim false;}stack_node scr_mgr_stack_push(tag_handle);return scr_mgr_switch(cur_scr, stack_node, anim); }/*** brief 入栈一个新的界面* param id * param anim * return */ bool lv_scr_mgr_push(uint32_t id, bool anim) {lv_scr_mgr_handle_t* tag_handle find_handle_by_id(id);lv_scr_mgr_stack_node_t* stack_node NULL;lv_obj_t* cur_scr NULL;if (NULL tag_handle){LV_LOG_ERROR(no screen, id %d, id);return false;}if ((NULL mgr_stack_top) || (NULL mgr_stack_root)){LV_LOG_ERROR(no root screen, please use lv_scr_mgr_switch create root screen);return false;}cur_scr mgr_stack_top-scr;stack_node scr_mgr_stack_push(tag_handle);return scr_mgr_switch(cur_scr, stack_node, anim); }/*** brief 出栈n个界面* param n 如果栈内界面没有n个则返回根界面* param anim * return */ bool lv_scr_mgr_popn(uint32_t n, bool anim) {lv_obj_t* cur_scr NULL;if ((mgr_stack_top NULL) || (mgr_stack_top-prev NULL)){return false;}cur_scr mgr_stack_top-scr;scr_mgr_stack_pop(n);return scr_mgr_switch(cur_scr, mgr_stack_top, anim); }/*** brief 出栈一个界面* param anim * return */ bool lv_scr_mgr_pop(bool anim) {return lv_scr_mgr_popn(1, anim); }/*** brief 退回到根界面* param anim * return */ bool lv_scr_mgr_pop_root(bool anim) {lv_scr_mgr_stack_node_t* stack_node NULL;lv_scr_mgr_stack_node_t* stack_top NULL;uint32_t cnt 0;if (NULL mgr_stack_root || NULL mgr_stack_top){return false;}stack_top mgr_stack_top;while (stack_top ! NULL){cnt;stack_node stack_top-prev;stack_top stack_node;}return lv_scr_mgr_popn(cnt-1, anim); }/*** brief 获取当前界面id* param * return */ int32_t lv_scr_mgr_get_cur_id(void) {if (NULL ! mgr_stack_top NULL ! mgr_stack_top-handle){return mgr_stack_top-handle-scr_id;}else{return -1;} }/*** brief 获取根界面id* param* return */ int32_t lv_scr_mgr_get_root_id(void) {if (NULL ! mgr_stack_root NULL ! mgr_stack_root-handle){return mgr_stack_root-handle-scr_id;}else{return -1;} } /************************ (C) COPYRIGHT ***********END OF FILE*****************/ /*********************************CopyRight ************************************* file lv_scr_mgr.h* author 不咸不要钱* date 2023-10-11 9:31:49* brief #* *******************************************************************************/ #ifndef _LV_SCR_MGR_H_ #define _LV_SCR_MGR_H_/* Includes ------------------------------------------------------------------*/ #include stdint.h #include lvgl.h#ifdef __cplusplus extern C { #endif/*! 界面切换动画默认值*/ #define LV_SCR_MGR_LOAD_ANIM_DEFAULT LV_SCR_LOAD_ANIM_MOVE_LEFT #define LV_SCR_MGR_LOAD_ANIM_TIME 500 #define LV_SCR_MGR_LOAD_ANIM_DELAY 0/*! 内存泄漏检测 */ #define LV_SCR_MGR_PRINTF_MEM 1 #define LV_SCR_MGR_REG_ENABLE 0#if LV_SCR_MGR_REG_ENABLE#else#endiftypedef struct {uint32_t scr_id; /*! id */lv_scr_load_anim_t anim_type; /*! 切换动画类型 如果为空则使用 LV_SCR_MGR_LOAD_ANIM_DEFAULT */void (*scr_first_create)(void); /*! lv_scr_mgr_switch lv_scr_mgr_push 函数会调用该创建函数 pop则不会调用 可以方便实现pop记住焦点 而push使用默认焦点 */lv_obj_t* (*scr_create) (const uint32_t id, void* param); /*! 创建界面创建界面时不要使用 lv_scr_mgr_xxx 函数 */void (*scr_destroy)(void); /*! 删除界面的回调函数一般用于删除如 lv_timer 等不会随界面自动删除的资源 */ }lv_scr_mgr_handle_t;typedef struct _lv_scr_mgr_stack_node_t {lv_scr_mgr_handle_t* handle;lv_obj_t* scr;struct _lv_scr_mgr_stack_node_t* prev;struct _lv_scr_mgr_stack_node_t* next; }lv_scr_mgr_stack_node_t;bool lv_scr_mgr_init(void* param); void lv_scr_mgr_deinit(void); void lv_scr_mgr_param_set(void* param); void* lv_scr_mgr_param_get(void);bool lv_scr_mgr_switch(uint32_t id, bool anim); bool lv_scr_mgr_push(uint32_t id, bool anim); bool lv_scr_mgr_popn(uint32_t n, bool anim); bool lv_scr_mgr_pop(bool anim); bool lv_scr_mgr_pop_root(bool anim); int32_t lv_scr_mgr_get_cur_id(void); int32_t lv_scr_mgr_get_root_id(void); #ifdef __cplusplus } #endif#endif /* _LV_SCR_MGR_H_ *//************************ (C) COPYRIGHT *****END OF FILE*****************/
http://wiki.neutronadmin.com/news/415560/

相关文章:

  • 网站开发 前端 后端最好的销售管理系统
  • 破天网站定制网站实名审核中心
  • 西部数码创建子网站做自己移动端网站
  • 网站建设首选九零后网络网站建设80hoe
  • 企业网站必备模块17z一起做网站广州
  • 天津网站制作的公司黑龙江建设网官方网站监理查询
  • 手机网站源码 html5网站建设汇报书 ppt
  • 第一站商城建设购物网站多少钱
  • 公司 网站建设 会计科目网站建设维护视频教程
  • 商业网站建设开发手机wap网页设计
  • 门户营销型网站搭建网站搭建代码
  • 高端网站创建广州网站建设维护
  • 哪里做网站百度收录块宝安做网站信科
  • 网站开发适合女生吗租空间做网站
  • 百度站长工具网站提交网站关键词密度过高
  • 不建议网站如何购买网站域名
  • 平凉崆峒建设局网站北京做网站价格
  • 南沙定制型网站建设ftp上传网站之后怎么做
  • 加强门户网站建设与管理办法百度网址大全免费下载
  • 邮箱注册网站申请wordpress文章不能添加标签
  • 网站建设开发兴田德润seo是免费推广吗?
  • 泉州建设人才网站如何推销自己的产品
  • 广州做网站多wordpress 虎嗅2016
  • 网页设计跟网站建设的区别中国城乡建设厅网站首页
  • 查看网站开发商工业设计公司宣传语
  • 宿迁宿豫网站建设视频制作表情包
  • 如何分析网站竞争对手徐州领航装饰工程有限公司
  • 百度电脑版登录网站冯耀宗seo课程
  • 苏州建网站用路由器建设网站
  • 建立自己的网站费用长沙百度百科