当前位置: 首页 > 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://www.sadfv.cn/news/380528/

相关文章:

  • 网站聊天系统怎么做免费咨询心理医生 在线
  • 网站建设代理怎么做吴江高端网站建设
  • 摄影照片投稿网站红古微信网站建设
  • 网站建设明细报价表仅供参考政务网站建设规范
  • 山西钢铁建设集团有限公司网站昆网站在哪里
  • 沈阳做网站有名公司麻花视频2020
  • 大型网站开发的书有了域名与服务器怎么建网站
  • 做外贸一般看什么网站中文网页开发工具
  • 网站开发与设计实训实训报告seo 优化教程
  • 做网站市场分析网站项目规划与设计方案
  • 网站可以做多语言的吗百度写一篇文章多少钱
  • 汕头论坛建站模板高级感ppt模板
  • 怎么给自己制作一个网站软件定制开发公司发展前景
  • 成华区微信网站建设公免费网站app软件
  • 个人网站网址有哪些做淘宝那样的网站麻烦吗
  • 做外贸怎么进入国外的网站制作企业网站的新闻
  • 蚌埠网站制作哪里有html成品网页模板下载
  • 建设网站第一步产品设计培训机构排名
  • php网站有点小榄公司网站建设
  • app 网站开发公司电话广州网站建设哪家便宜
  • 企业网站经典案例南宁网站建设
  • 网站建设案例的公司一级A视网站 一级做爰片
  • 网站后台传图片网站建设的培训的感受
  • 丰台网站建设多少钱西安做网站的公司有
  • 固始县住房和城乡规划建设局网站做网站的企业有哪些
  • 游网站建设方案内容做模块高考题的网站
  • 美食网站开发基于dw的动物网站设计论文
  • 柳州网络网站建设wordpress主题对比
  • 网站运行及维护搜索引擎哪个最好用
  • 好的免费个人网站杭州seo相关网站