【LVGL】学习笔记--(3)界面切换以及显示优化_lvgl切换界面_公子无缘
界面切换和帧率优化...
一 界面切换
灵活运用lvgl结构作图GUI免不到需求保持多种界面的转换,我觉得把其它性能和模块都放着整页上都有些不太高贵典雅,还有而言植入式设施配置的小液晶屏有些过度吃力。所以说下面就需求保持多种界面(又某种程度lvgl里的screen)试述其他人转换。 控制目标方式(分类论文《LVGL V8APP——经过组合键调节网页》),有一些两大类控制目标方式:【1】通过LV_OBJ_FLAG_HIDDEN隐藏属性实现页面切换:
体现工具栏1在前一天给工具栏2的贮槽配置LV_OBJ_FLAG_HIDDEN取消潜藏抗性,体现工具栏2在前一天给工具栏1的贮槽配置LV_OBJ_FLAG_HIDDEN取消潜藏抗性。【2】切换到窗口2时,删除窗口1的容器:
附进的重要进行也还可以可以分为两种类型策略:切换到窗口2时,可以在回调函数中删除窗口1的容器,这样可以删除窗口1下的所有子对象,这种方式适用于运存较小的设备。
static void win_btn_event_callback1(lv_event_t* event)
{
lv_event_code_t code = lv_event_get_code(event);
if (code == LV_EVENT_CLICKED)
{
// 删除窗口1的win1_contanier容器,这样就可以把win1_contanier上的子对象全部删除,然后显示窗口2
lv_obj_del(win1_contanier);
show_button_win2();
}
}
static void win_btn_event_callback2(lv_event_t* event)
{
lv_event_code_t code = lv_event_get_code(event);
if (code == LV_EVENT_CLICKED)
{
// 删除窗口2的win2_contanier容器,这样就可以把win2_contanier上的子对象全部删除,然后显示窗口1
lv_obj_del(win2_contanier);
show_button_win1();
}
}
使用函数lv_scr_load_anim和lv_scr_load加载和切换屏幕:
/* 直接加载该屏幕scr
参数1:要加载的屏幕 */
static inline void lv_scr_load(lv_obj_t * scr)
{
lv_disp_load_scr(scr);
}
/* 通过动画的方式显示
参数1:要加载的屏幕
参数2:动画类别
参数3:切换动画需要的时间
参数4:为true时则会在切换界面后将旧界面删除,节约内存*/
void lv_scr_load_anim(lv_obj_t * scr, lv_scr_load_anim_t anim_type, uint32_t time, uint32_t delay, bool auto_del);
我这边用到的是第二类方式,即GUI Guider中自动生成的事件+加载页面动作的方式:

二 显示优化
因为用到界面的切换,涉及整屏(320*240)的刷新,如果绘制较为复杂的画面,界面切换的过程中会有拉窗帘的效果,非常影响美观。所以显示的优化就不得不考虑了。
对比《LVGL体现网站升级简化—最基本网站升级简化》、《LVGL 网站升级简化帧率窍门》,有接下来五种网站升级简化做法以供对比:【1】disp_flush刷屏方法改进
一种点事先移殖的情况下也提过(《【LVGL】学习成绩读书笔记--(1)Keil中镶入式软件系统移殖LVGL》),在disp_flush中使用封安装好的LCD_Fill_LVGL刷屏数学指数函数带替一开始默认要求的画点数学指数函数。【2】LVGL帧率限制
LVGL是有个个帧率重置时间间隔的宏名词解释,在lv_conf.h里。LVGL会凭借LVGL里面的的tick,订时去刷荧屏,也也是说该宏名词解释限定版了LVGL刷屏帧率的进攻,同意满帧33帧。 这儿自己会直接变成10ms加载第一次,满帧100帧。随手再把投入机调用周期长也变成10ms。/*Default display refresh period. LVG will redraw changed areas with this period time*/
#define LV_DISP_DEF_REFR_PERIOD 10 /*[ms]*/ //默认30
/*Input device read period in milliseconds*/
#define LV_INDEV_DEF_READ_PERIOD 10 /*[ms]*/ //默认30
【3】LV_DPI_DEF配置
在lv_conf.h里增加DPI:/*
* LV_DPI_DEF 注意这里,虽然LVGL的作者说这个没这么重要,但他会严重影响到LVGL的动画效果
* 你应该进行DPI的手动计算,例如320*240分辨率3.2英寸的屏幕,那么 DPI = (320*320+240*240)^0.5 / 3.2 = 125
*/
#define LV_DPI_DEF 125 /*[px/inch]*/
【4】编译器版本以及代码优化等级
编译器固件版本一定用arm compiler5。编号提升档次能增强到Level 2:
【5】堆栈设置
栈设置:

Stack_Size EQU 0x00002000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
堆设置:
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
#define LV_MEM_SIZE (48U * 1024U) /*[bytes]*/
【6】显存类型
LVGL本来给出了两类独显存储品类。两类分辨对应着不同于条件,都能以值得 (B站多大神开展过两类品类的软件测验LVGL 最佳手机配置软件测验 (STM32),应该参考选取一点,我她测了单BUFFER和非全尺寸大小双BUFFER,不同于不多)。先学下论证:
单BUFFER
/* 单缓冲区示例) */
static lv_disp_draw_buf_t draw_buf_dsc_1;
static lv_color_t buf_1[MY_DISP_HOR_RES * MY_DISP_VER_RES / 4];
lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * MY_DISP_VER_RES / 4); /*Initialize the display buffer*/
非全尺寸双BUFFER
全尺寸双BUFFER
皇冠新体育APP相关的文章
- 自动切换背景的登录页面_极客李华
- 皇冠新体育APP字符串大小写转换(3种)函数及用法_chijiude_python将字符串小写转换为大写
- Springcloud Stream整合Rabbitmq(生产者和消费者)_菜鸟小邓_stream rabbit消费者返回数据
- 汇编语言简明教程习题答案_Li Guogang
- Spring Boot异步消息之AMQP讲解及实战(附源码)_showswoller_springboot amqp 最佳实践
- Java实现snmp SNMP4J通过get、trap、walk监控交换机 附带api_一个好孩子啊_java 监控交换机
- 皇冠新体育APP:通讯录管理系统_愈努力俞幸运
- 皇冠新体育APP:皇冠新体育APP操作Excel表格_QQVQQ...
- Nacos的集群配置、NacosRule负载均衡、权重设置、namespace_茂桑_集群一般把权重设为多少
- 皇冠新体育APP:皇冠新体育APP绘制3D图形:Axes3D_老秦子弟_axes3d
- 皇冠新体育APP:二维数组与函数调用案例_远方青木_二维数组函数调用
- 皇冠新体育APP:RabbitMQ延时队列_呆萌很
- 皇冠新体育APP:C语言之算法的概念_花开至夏_c语言算法是什么意思
- AMQP协议详解_?菠萝皮~_amqp协议
- RabbitMQ中VirtualHost相关设置、SpringBoot中集成常见问题总结_三婶儿_rabbitmq virtualhost配置
- 【Linux】常用的Linux命令(初学者必读)_小孙的代码分享