引言
随着嵌入式技术的飞速发展,人们对系统界面的要求日益提高,其中一个需求就是期望嵌入式设备的界面也提供类似PC上软件的动态加载界面功能,用户可以根据自己的爱好来选择不同的主题界面,甚至自己来定制界面的布局、颜色等,图1就是某开源软件所提供的不同主题的界面。
图1 某嵌入式设备上不同的主题界面
当然,根据不同的平台,动态加载界面有着不同的实现方式,本文以嵌入式开发平台上较为常见的QT开发环境为例,引入了一种在QT嵌入式平台上实现动态界面、定制界面的实现方式。
1 主题界面文档化
虽然不同的主题界面外观差异很大,但是显示的元素(如菜单项等)却是相同的,所不同的是这些元素的布局、外观等。因此,按照一定的规则,将不同的主题界面存储为不同的XML文档,详细记录每个主题界面的元素布局、形状、色彩或行为等界面相关的信息。在程序启动时,或者主题界面切换时,系统读取不同的XML文件,绘制出不同的主题界面。以图2中的显示界面为例,其对应的XML文档如下所示,从中可以看出,该界面包含了字体、时钟、状态栏、图片等一系列控件,并且包含各自的属性。
- <WideTheme>
- <window name="mainmenu">
+ <fontdef name="menufont" face="Liberation Sans">
+ <fontdef name="clock" >
+ <clock name="clock" from="small">
+ <statetype name="titles">
+ <imagetype name=" logo">
+ <imagetype name=" horizon">
+ <imagetype name=" menu">
+ <statetype name=" watermarks">
</window>
</WideTheme>
以上文中出现的imagetype控件为例,它是用来存储、显示图片的控件,在XML文档当中,其包含了图片文件名、位置和缩放、颜色格式和大小等信息,如图3所示。
图2 XML文档及主题界面 图3 imagetype控件的属性和外观
<imagetype name=”movie”>
<filename>TV.png</filename>
<area>300,200,210,70</area>
<alpha>150</alpha>
<preserveaspect>true</preserveaspect >
<crop>x,y,w,h</crop>
<mask>mymaskfile.png</mask>
<reflection spacing="0" length="35"
scale="85" shear="24" axis="horizontal">
</reflection >
<grayscale>true</grayscale>
<filepattern cycle="reverse" high="30" low="0">
imagefile%1.png
</filepattern>
<delay>500</delay>
</imagetype>
专业的美工人员可以设计出风格统一、优美的外观界面,同时,通过填空的方式,将界面的所有显示元素的信息填充至XML文档中,以备程序进行加载调用。这些XML文档的格式需要事先进行规范和定义,包括元素的定义、属性和行为应该是事先规定好的,否则界面的设计与加载就无从谈起。通常来说,应该至少定义包括字体、基本控件、基本界面等数十种元素及其属性。
2 加载主题界面
在程序的启动阶段,通过加装相应的主题界面,即可实现显示不同的主题界面。图4是读取并加载界面元素的流程。从图中可以看出,首先以Map容器的方式创建“界面元素树”,然后以递归方式解析XML文档,每遇到一个界面元素就实例化并添加到元素树当中,同时继续解析该元素的属性,来设置界面元素的属性(外观)。如此循环进行,直到解析完整个文档为止。
图4 界面元素加载流程图
图5 解析XML文档生成元素树
整个过程的最终结果将是一个树,如图5所示。这棵树上的枝叶记录了界面对应的所有元素信息,包括时钟、logo和menu三个元素控件,同时每个元素又包含有自己的属性。如时钟控件的属性就包括其位置、大小、字体和对其方式等;menu控件的属性包括大小、布局、间隔和风格等。
3 切换主题界面
图6是某开源软件的主题切换模块。左侧显示了系统所支持的主题数,选择不同的主题,右侧会显示其相应的缩略图。当用户选择切换主题时,系统去读取新的主题XML文档,并重复新一轮的界面加载过程。通常在设计切换主题界面时,如果系统没有特殊要求,则会在更换主题XML文档之后强制重新启动应用,新的界面会被自动加载显示。
结语
本文讨论的QT平台上动态定制界面的主要技术,提高了嵌入式设备的人机交互友好性,使得UI设计与显示分离开,摆脱了传统嵌入式设备的呆板界面设计方式,可以更快速地提供专业、统一的设备界面,已在工程实践中证明了该方法的可行性,特别是随着消费类电子产品需求的日益发展,将会有越来越多的应用领域。然而,由于QT平台特殊性,其并没有提供如HTML+CSS方式的界面解析功能,因此需要开发人员自行进行界面解析,这在一定程度上限制了该功能的推广,也是本方案有待于提高之处。
图6 主题界面的切换