之前在做项目的时候,需要用到多级GUI,当时使用的是用数组穷举列出来各个界面的方式(也有人管它叫索引法),缺点也是很多的,比如开发繁琐,维护不便,难以添加过渡动画,各个界面是定死的,扩展性不强……并且从严格意义上而言,这个方式只能算作实现多级菜单的伪GUI,而像emWin,LVGL等又太复杂占用太大,并且对各个界面的管理不是很方便,所以就有了开发一个优雅好用的跨平台GUI框架的念头,现在已经基本完成,还剩一些小细节和注释就可以开源出来,下面简单介绍一下
一,设计目标:
实现动态创建,删除菜单项(即通过封装好的函数实时操作菜单项),添加过渡动画,控制资源占用,无限制的菜单扩展,支持实时添加菜单项,便于移植到各种平台。
二,设计思路:
一提到无限级扩展,我第一个想到的是用链表,所以我定义了三个结构体,分别负责菜单,应用,按键。为了避免错误的关系处理导致GUI进入死循环,我将其封装成了函数,可以自动处理关系,并定义了一个 ROOT项,这样可以避免错误的操作并简化主程序中的操作。
对于菜单结构体,里面包含了菜单名称、父目录、子目录链表的首位、前级、后级、应用链表的首位,用一个图来展示:
然后就是设计过渡动画了,对于每个子目录项的选择,我使用了PID动画,对于页之间的过渡,我使用了虚化效果,在后面的Demo演示中会展现。
另外,如何实现跨平台呢?我这里是采用了逻辑和图形分离的方式,即提供一个GraphicsAPI,在GUI库中调用,开发者只需要根据需求改写GraphicsAPI就可以实现跨平台(理论上在Windows等操作系统上也可以用,只是没必要)。
三,命名:
这个GUI库我将其命名为SXGUI,SX的含义一个是我的网名缩写,另一个是 Simple.X的意思,代表让它的简单易用的初衷。
四,当前进度&Demo程序演示:
进度:
目前已经完成了GUI部分的开发,正在完善GraphicsAPI、降低改写难度以及图形库的兼容性优化(我用的平台是STM32F401RCT6,0.96寸OLED,开源出来的文件会自带我的OLED图形库和写好的GraphicsAPI)
Demo演示:
使用Keil5,优化等级 O3,未开启微库
SXGUI库Demo演示