GUI的主题与中心思想没有什么关系,纯粹是一种控制GUI外观的配置方案。几乎所有的视觉效果都由主题是控制的,一个设计良好的主题模块,可以通过配置文件模拟不同的系统。主题的设计可繁可简,能满足自己的需要就可以了。这里以我写得几个GUI,FTKCANTKWTK为例,介绍一下主题得设计。

主题的内容

一般来说每种控件都有一种或多种状态,常见的状态有正常状态、鼠标按下状态、鼠标OVER状态、只读状态,选中状态和禁用状态等。比如文本只用正常状态,按钮有正常状态、鼠标按下状态、鼠标OVER状态和禁用状态,而编辑器有正常状态、选中状态和只读状态。

UI设计的基本原则就是要给用户反馈,让用户清楚当前的状况。所以每种状态会需要有不同的视觉效果,视觉效果无非就是用颜色或图片来呈现。一般来说控件由背景和文字两部分组成,背景可以用图片,或者背景颜色和边框颜色来决定,文字由字体,大小,风格和颜色决定。

综上所述,一个简单主题配置文件由多组配置信息,每组配置信息描述一种控件在不同状态下的外观。

比如下面这段配置就是WTK里关于按钮的配置,WTK是我为TANGIDE专门开发的一个GUI。这里 有完整的配置文件。

        "button": {
"state-normal": {
"textColor": "Black",
"font": "10pt bold sans-serif",
"bgImage": "bgimage_button_normal.png"
},
"state-active": {
"textColor": "Black",
"font": "10pt bold sans-serif",
"bgImage": "bgimage_button_active.png"
},
"state-over": {
"textColor": "Black",
"font": "10pt bold sans-serif",
"bgImage": "bgimage_button_over.png"
},
"state-disable": {
"textColor": "Gray",
"font": "10pt bold sans-serif",
"bgImage": "bgimage_button_disable.png"
}
}

一种控件有时需要多组配置信息,比如按钮,正常的按钮用一种风格,对话框中的缺省按钮(按下回车建时自动触发的那个按钮)用另外一种风格。代码中可以提供一个函数,允许开发者指定当前控件用哪个配置。

一种控件可以没有配置信息,可能是它压根就没可见的界面,比如一些用于布局的控件。也可能它用缺省的配置信息就行了。

允许应用程序开发者改变单个控件的风格。主题只是定义每种控件的缺省风格,应用程序开发者可以定制任何单个控件,比如文本控件的字体,在不同界面变化是比较大的。

主题的形式

主题的其实不应该拘泥于形式,我最早见到的主题配置信息写在代码里的,它加载和切换都很快,在一个52M主频+512K内存的系统里是正确的选择。

直接硬编码在代码里通常不是好的选择。我在设计FTK时,选择了用XML文件保存主题配置信息。当时受GTK+影响很深,本来应该选择gtkrc类似的格式的。但是我不喜欢gtkrc的语法,XML解析起来容易很多,而且自己写过XML解析器。自然选择了用XML文件格式。

在学习JS后,我接触到JSON格式,JSON格式的伟大之处在于,它有机的把数据的存储状态和运行状态统一起来了。在JS里使用JSON就像呼吸一样自然,JSON.parse解析出来的数据结构,和直接在代码里定义的数据结构一样可以直接访问。所以在WTK里,选择了JSON数据格式。

要不要主题,是个问题

一个GUI系统可以不用主题吗? 当然!

但是情况要分别对待,一种情况是GUI设计得非常差,它只提供一种外观,没法通过配置信息改变它。另外一种情况是GUI设计的非常灵活,它完全不管视觉效果,所有视觉效果都由使用者自己决定。

在设计CANTK时,我研究了上百个APP,发现它们之间风格差别很大,根本没有什么主题能把它们得风格统一起来。所以在CANTK里我完全没有用主题,每个控件也没有提供缺省得外观,除非调用者指定得控件需要得配置数据,否则什么也看不到。

在使用时,如果每个控件都要指定相关得配置信息,使用起来一定非常麻烦,比如要手工去写下面得数据,一定非常让人抓狂。

{
"type": "ui-button",
"name": "ui-button",
"w": 200,
"h": 69,
"x": 167,
"y": 218,
"text": "ok",
"vTextAlign": "middle",
"hTextAlign": "center",
"enable": true,
"visible": true,
"xAttr": 0,
"yAttr": 0,
"widthAttr": 0,
"heightAttr": 0,
"uid": 11205,
"runtimeVisible": true,
"wMin": 50,
"hMin": 41,
"enableAutoScaleFontSize": true,
"xParam": 1,
"yParam": 1,
"widthParam": 1,
"heightParam": 1,
"isUIButton": true,
"isUIElement": true,
"hasChildren": true,
"style": {
"lineWidth": 2,
"lineColor": "Red",
"fillColor": "White",
"textColor": "#FEFFFF",
"fontSize": 19,
"fontFamily": "serif",
"textB": true,
"enableGradient": true
},
"events": {
"onClick": null,
"onUpdateTransform": null
},
"images": {
"display": 4,
"focused_bg": "drawapp8/images/common/buttons/red_button.png",
"active_bg": "drawapp8/images/common/buttons/red_button_active.png",
"normal_bg": "drawapp8/images/common/buttons/red_button.png",
"disable_bg": "drawapp8/images/common/buttons/red_button.png"
},
"deviceConfig": "{\"name\":\"Device-General\",\"bg\":\"drawapp8/images/device.png\",\"platform\":\"android\",\"version\":\"5\",\"lcdDensity\":\"hdpi\",\"width\":560,\"height\":798,\"screenX\":36,\"screenY\":80,\"screenW\":480,\"screenH\":720}"
}

上面的数据确实是CANTK需要的,创建任何一个控件都需上面类似的数据。但是这些数据是由开发工具TANGIDE来生成,开发者要做的只是拖动几下鼠标而已。

游戏引擎/GUI的设计与实现-主题的更多相关文章

  1. 游戏引擎/GUI的设计与实现-序

    几年前写<嵌入式GUI FTK设计与实现>,没写几篇就停止更新了.当时自己研究过MicroWindows, X Window, DirectFB, GTK+和Android的GUI,又写过 ...

  2. 游戏引擎/GUI的设计与实现-常见GUI架构

    以X Window为代表的客户/服务器架构. X Window通常是指X服务器及封装了通信协议的客户端库.服务器端主要负责输入事件的分发,窗口层次的管理,以及显示输出的处理,其它功能基本上都是在客户端 ...

  3. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  4. 刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

    游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式: ...

  5. 3D游戏引擎设计 实时计算机图形学的应用方法 第2版 pdf 带索引书签目录

    3D游戏引擎设计  实时计算机图形学的应用方法  第2版 目录 第1章 概述1.1 图形硬件和游戏发展史1.2 本书版本与软件发展史1.3 章节导读 第2章 图形系统2.1 基础知识2.1.1 坐标系 ...

  6. 开源战棋 SLG 游戏框架设计思考(一)简介和游戏引擎

    战棋 SLG 游戏 SLG(Simulation Game)游戏是模拟游戏的简称.战棋类的SLG有两种:一种是 War Game 中的兵棋推演分支,常见的游戏有战争艺术3(TOAW3 — The Op ...

  7. 游戏引擎网络开发者的 64 做与不做 | Part 1 | 客户端方面

    摘要:纵观过去 10 年的游戏领域,单机向网络发展已成为一个非常大的趋势.然而,为游戏添加网络支持的过程中往往存在着大量挑战,这里将为大家揭示游戏引擎网络开发者的 64 个做与不做. [编者按]时下, ...

  8. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  9. GJM : 各大开发游戏引擎

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. 2016年10月26日 星期三 --出埃及记 Exodus 19:10-11

    2016年10月26日 星期三 --出埃及记 Exodus 19:10-11 And the LORD said to Moses, "Go to the people and consec ...

  2. Infragistics UltraGrid的使用

    OL SDK:http://help.infragistics.com/ 资料参考:http://blog.csdn.net/andy_212/article/details/4019895 http ...

  3. Xcode关闭ARC

    开启了ARC则不能显示调用dealloc/retain/release等手动内存管理操作,所以很多情况下需要关闭. Xcode中有两种途径可以关闭ARC. 1.创建项目时将ARC选项的勾取消掉. 2. ...

  4. 判断List、Map、Set是否为空及效率比较

      //如果object为null,则设置为defaultValue ObjectUtils.defaultIfNull(object, defaultValue); //判断集合是否为null Li ...

  5. JAVA语言基础——类型转换

    1.自动类型转换 自动类型转换又称作隐式转换,可以将一个int变量转换为float类型. public class Conver { public static void main(String[] ...

  6. web应用中web.xml配置详解

    Web.xml常用元素 <web-app> <display-name></display-name>定义了WEB应用的名字 <description> ...

  7. 多线程&NSObject&NSThread&NSOperation&GCD

    1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...

  8. Bug避障算法简介

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.避障是指移动机器人根据采集的障碍物的状态信息,在行走过程中通过传感器感知到妨碍其通行的静态和动态物体时,按照一定的方 ...

  9. Web开发——Tomcat的配置

    1.选择Tomcat 1.Apache官网http://apache.org/ 2.Tomcat官网http://tomcat.apache.org/ 3.Tomcat下载地址http://tomca ...

  10. iOS - UICollectionViewController

    前言 NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView @available(iOS 6.0, *) pub ...