转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli@gmail.com>
记得X Window在设计初期就提出了七项基本指导原则,在后面X Window几十年的演变过程中,都以这些基本原则作为指导思想。其中给我印象比较深的一条就是:提供机制而不是策略。X Window一直都遵循这条原则,它只提供实现某些功能的机制,而把实现的策略留给ToolKit或其它辅助软件。为了让FTK在以后的演化过程中不至于 迷失方向,我们也给FTK定了三项基本原则:
第一:程序首先是给人读的,其次才是给机器读的。
程序首先是给人读的,其次才是给机器读的。这句话是很多程序员都认同的,加上FTK最初的目的就是作为《系统程序员成长计划》的综合练习项目,目标 是让《系统程序员成长计划》的读者通过阅读FTK的源代码,来学习如何把前面学到的知识应用到一个实际的项目中。所以把FTK代码的可读性放在第一位是理 所当然的。
GUI无疑是最复杂的基础软件之一,在我研究过的GUI中,像X Window、DirectFB、 GTK+和MicroWindows,它们都是非常复杂的软件系统。我写过不少关于它们内部实现的文章,但是我现在要非常惭愧的告诉你,这些GUI的实现 太复杂了,我其实没有完全搞明白过其中任何一个系统。分析一个GUI系统,对一个工作经验丰富的程序员来说尚且如此困难,对初学者的难度就可想而知了。不 过FTK则是希望成为人人可以读懂的GUI系统。如果你在阅读代码的过程遇到了难题,请不要犹豫,大胆的来和我们讨论吧,让我们一起想办法把它变得更加简 单。
为了提高FTK的可读性,我们采用了下列措施:
1.保持简单。
简单的东西才是容易理解的。从代码量来讲,FTK的代码量只有GTK+的十分之一,总共代码在两万行以内,90%的文件的都是少于600行代码 的,80%的模块对外的函数是少于10个的,单个函数基本上都是少于50行代码的。从设计时,FTK也尽量选择简单的模型,比如只支持单进程单线程方式运 行(其它线程可以通过idle来串行化对GUI 的访问),从而避免引入进程间通信机制和并发带来的复杂度,这一点我们在后面有更详细的描述。
2.一致的代码风格。
代码风格的一致性对代码可读性的帮助很大。FTK的文件名、函数名、变量名和类型名都遵循统一的命名风格,FTK中的命名风格和GTK+的命名风格 基本上是一致的。FTK所有代码的排版布局也保持高度一致,整体上的代码风格与《系统程序员成长计划》一书介绍的一致,如果你读过《系统程序员成长计 划》,再看 FTK的代码就像见到熟人一样。
3.避免复杂的算法。
GUI和图形算法相对是比较复杂的。出人意料的是FTK几乎没有使用任何复杂的算法,连画普通直线和圆弧的算法都没有,更不要说线性代数中那些矩阵 变换了。FTK中尽量使用水平线和垂直线来绘制基本的图形,而用图像来实现更复杂更美观的界面,这样就绕开了复杂的图形算法。不过,可以使用可选组件 cairo来绘制复杂的矢量图和做些高级的图形变换。
4.设计高内聚的模块。
高内聚简单的说就是一个模块(或函数)只完成单一的功能,单一的功能从逻辑上更容易理解,代码量也更少。要保持简单,设计高内聚的模块是必要条件, 把多个功能糅合在一起,自然不可能做得简单了。
5.编写内部实现文档。
隔行如隔山。对于对GUI一点概念都没有的初学者来说,再简单的GUI也是难读的。为了降低初学者阅读FTK的门槛,我们决定写《嵌入式GUI FTK设计与实现》系列文章了,也希望大家都参与进来讨论和完善。
保持简单但是不能太简单。
记得这句话是爱因斯坦说(Keep it simple but not too simple! )。它的道理是非常明显的,在完成需要的功能的前提下,实现越简单越好。反过来说,实现越简单越好,前提是要完成需要的功能。如果不能实现所需要的功能, 再简单又有什么用呢。我们要保持FTK实现上的简单性,但同时我们必须要实现GUI所需要的功能。
记得在开始FTK项目时,我和一位朋友讨论FTK的需求。他说,对于嵌入式GUI,他关心的是,能不能在几K到几十K的内存的系统上使用。我说,这 样的小系统,它的界面会很复杂吗,需要一个真正的GUI吗?他后来说不需要。为一个简单得根本不需要GUI的系统设计一个GUI是没有什么意义的,FTK 要保持简单,但是不能太简单。
GTK+ 太庞大,不适合在嵌入式系统中使用。而X Window和DirectFB虽然够轻量级,但它们没提供足够的功能,它们离开ToolKit单独使用非常困难。FTK要取其所长避其所短,设计得够简 单够小,才能在GTK+等传统GUI不能使用的地方使用,但是又必须要提供GUI常用的元素,对用户才有实用价值。
要够酷够时髦。
之前我也分析过一些其它嵌入式GUI系统,它们通常都是仿照Windows传统的界面风格来实现的。它们的实现确实够轻易级,通常可执行二进制大小 在 100K到500K之间,但给我的印象就是太土气了点,不能满足现代消费电子产品的需求(呵,真的不想通过扁别人来提高自己,欢迎对我的作法不满的朋友来 扁FTK)。所以在设计FTK时,我一直提醒自己,FTK一定要够酷够时髦。其中主要表现有:
1.支持主题
支持主题是现代GUI的基本特征了。众口难调,没有一个GUI会让所有人喜欢,但是有了主题机制,通过一些数据和图片文件来配置显示风格,可以给用 户多种不同的选择。 FTK的主题非常简单,在一个XML中设置各个控件的表现属性(不同状态的颜色和图片),然后提供相关的图片文件即可。
2.支持窗口动画
窗口动画也是现代GUI吸人眼球的特征之一,是制作各种比较炫的效果的基础。FTK实现了滚动和淡入效果,并提供了一种机制,让开发者实现任何自己 想要的效果。
3.支持透明/半透明效果
很多炫的效果离不开透明/半透明机制的支持。在FTK中,不管硬件平台的支持的多少颜色数和颜色格式,每个像素在内存中都由ARGB四个分量组成, 其中8bit的alpha通道用来实现透明/半透明效果。
4.支持XML界面描述
XML界面描述也是现代GUI的基本特征了,它的魅力在于分离用户界面和内部实现,让它们能够独立变化。而且借助一些界面构建工具,生成用户界面变 得更加容易。FTK实现了一个小巧的XML解析器,以非常轻量级的方式实现了对XML界面描述的支持。
5.支持脚本语言绑定
脚本语言的开发效率相对较高,部署也更加容易,越来越开发者的欢迎。呵,不懂一门脚本语言的程序员经常会被人鄙视的。FTK和其作者们自然不想被人 鄙视,所以支持脚本绑定是FTK的首要目标之一,目前已经支持LUA的绑定(还需要进一步完善)。
6.支持输入法(特别是手写)
GUI 少了对中日韩文字的支持,注定是要失败的。对中日韩文字的支持包括编码,字体显示和输入法三个主要部分。FTK采用UTF-8编码,可以表示 Unicode中的所有字符。FTK支持点阵(内置)和矢量(需要freetype)字体,所以显示中日韩文字不成问题。输入法相对复杂一点,FTK目前 已经支持中文拼音、中文五笔和手写三种最常用的输入方式了。
7.支持屏幕旋转
很多手持设备,其屏幕的长度和宽度不一样。而有的内容适合横着看,有的内容适合竖着看,通过重力感应器自动旋转屏幕,可以提高系统的易用性。支持这 个功能不难,只是优先级不高,FTK将会在今年支持这个功能。
8.支持手势识别和多点触摸
手势识别可以大大提高系统的易用性,随着触摸屏越来越流行,新一代GUI都支持手势识别了。多点触摸是手势识别的特例,需要硬件支持,从GUI的角 度来说,实现难度不大。FTK将在今年支持手势识别和多点触摸,有兴趣的朋友可以来帮助增加这个功能。
欢迎大家参与讨论、学习、开发、编写文档和在产品中使用,让我们一起把FTK做成最好的嵌入式GUI吧。