基础知识漫谈(2):从设计UI框架开始
说UI能延展出一丢丢的东西来,光java就有swing,swt/jface乃至javafx等等UI toolkit,在桌面上它们甚至都不是主流,在web端又有canvas、svg等等。
基于这些UI工具包\框架,又产生了大量通用的或者业务性的UI框架,比如Draw2d、GEF、easyUI乃至国内的EChart、白鹭等等。
这些框架的业务范围各异,一个程序员的时间和精力有限,你不可能全部都掌握,又不能预言出是哪一个将来会独步天下,甚至,连当前哪一个最流行,都够打一阵嘴炮。
那,我们应该学什么?
本章节谈谈,如果,我们只有一个GC(graphic creator\capability)的时候,如何设计一套UI框架出来,了解了这些,在学习新的UI框架的时候,会更加容易。同时,这里提到的分析思路也可以应用到其他类型框架中,辅助学习。
切记,1、复杂由简单构成;2、构成具备规律。
可想而知,再复杂的框架,划拉到底层的时候,也都是你早就应当掌握的基础知识。不同的框架需要的基础知识可能不一样,但是规律(思想)大多是接近的。
我们先来定义一下,什么是GC?
每一个使用过上面提及的UI toolkit的程序员,应该都注意到了,它们很多都有提供“绘制”功能。在SWT中,提供该能力的是org.eclipse.swt.graphics.GC,在H5 canvas中,则是CanvasRender(也就是canvas element#getContext(‘2d’)得到的对象)。
它们有什么共同点?
可以设置ARGB信息,可以调用来绘制图片、线段、形状,等等。
为了方便起见,这里统一称为GC,它是UI框架的基础。
来思考一个问题,一个下图所示的界面,如果用GC自行绘制的话,你要怎么做?
aaarticlea/png;base64,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" alt="" />
不用想太多,完整实现是不科学的,写到颓,颓到秃。来看下最常见的解决方案吧:
把该界面上的各个部件拆开来,相同特性的归为一类,每一类都提供一个绘制的方法,比如一个按钮,就需要GC绘制四条边、阴影线以及其中的文本。
然后,让遍历所有的部件,让文本的归文本,按钮的归按钮。
有没有突然感觉简单了?这就是所谓的UI框架干的事儿。
如何构建这个UI框架呢?本文采取的思路是:面向对象建模。
具备面向对象知识的你,应当能分析出以下结论:控件,控件的布局,以及各种事件的处理,这三个元素组成了一个基本的UI框架。
1、控件
按钮、文本框等可操作对象以及包裹它们的容器,这里称之为控件。
所以,我们需要创建出以下对象,继承关系以树形结构表示:
aaarticlea/png;base64,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" alt="" />
其中父子级只表达继承关系,Control和Composite它们的实体关系图,则可能是如下所示:
aaarticlea/png;base64,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" alt="" />
其中,Control提供两个方法:
paint(GC)负责调用GC,来绘制自身。
getBounds()负责提供当前控件的位置、大小信息,一般包括x,y,width,height。
Composite作为复合控件,它既具备Control的两个方法,用于正确的绘制自身,又具备一个children列表,里面全都装的是Control,当它的paint方法调用的时候,应当迭代自己的所有children,调用它们的paint。
具备此种结构之后,任何UI界面是不是都成为了某种单根结构?
根节点是一个Root Composite,叶子节点则是具体的某个Control。再联想之前的打印窗口,它的实体结构大概会是这样:
aaarticlea/png;base64,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" alt="" />
来活动活动思维吧,这是什么数据结构?各个控件的paint()方法调用顺序是怎样的?
2、布局
明明是有bounds的,为什么还需要“布局”呢?
其实啊,bounds(x,y,width,height)也可以视为一种布局,我称之为自由布局,这种布局其实并不好,结论太粗暴难以接受么?大概讲解一下:
你需要非常精确的控制x,y,width,height四个变量,设想你要制作一张两行四列的表格,每个单元格你都得控制它们的位置,bounds信息如下所示:
[0,0,100,20],[100,0,100,20],[200,0,100,20],[300,0,100,20],
[0,20,100,20],[100,40,100,20],[200,60,100,20],[300,80,100,20]
如此你可以推论出一个公式,设i为行号,j为列号,单个cell的bounds信息公式为[i*width,j*height,width,height],注意到问题没有,你需要自己维护一个嵌套循环,来为每一个单元格赋值。
控制相对位置需要花费大力气。明确一个事实,在该“自由布局”里,child的范围是有可能超出parent的边框的(因为bounds的x,y目前指代的是GC使用到的x,y,也就是整个画布的基准点),除非,你把每一个child的计算公式都改为[i*width+offsetX,j*height+offsetY,width,height],这里的offset代表parent的绝对位置。
很难控制缩放。比如你要对上述的表格进行缩放,则你需要修改bounds信息,确定缩放的策略,比如整体缩小一个zoom值,列出的公式大概会变成这个样子[i*width*zoom,j*height*zoom,width*zoom,height*zoom]
仅仅说明一个方式不好,并不能证明其他的方式好,很多人已经想到了,我们可以把上面的这些“公式”抽离出来,整理出可复用的代码。如果有其他的布局方案,也可以整理出对应的复用代码,在paint之前应用上去,不就好了么?
对,其实,这个可复用的方案\策略,也就是“布局”。
以伪码说明实现方式:
define Composite{
LayoutManager layoutManager;
/**
*绘制
*/
void paint(){
layout();
//dopaint
}
/**
*执行布局
*/
void layout(){
layoutManager.layout(this);
}
} define LayoutManager{
void layout(Composite parent){
int index=;
//遍历所有的children,获取它们的layoutData,修改它们的位置
foreach(Control child:parent.getChildren()){
//根据child的index以及布局配置计算出偏移量
offset=computeOffset(index);
//获取child的布局数据
LayoutData data=child.getLayoutData();
//使用布局数据修改child的bounds信息
data.computeBounds(child,index,offset);
index++;
}
}
}
从上面伪码我们可以看出,控件具备layoutData这个成员函数,容器(复合控件)具备layout这个成员函数.
layout用于规定该容器内部的布局类型(比如网格类型GridLayout),整体的布局规划(体现在上述代码中的offset对象,为下一个需要布局的child提供偏移量)。
layoutData负责具体的某一个child在整体中的排布。
由于封装在layout和layoutData中的都是算法(体现在computeXXX方法中),所以,我们可以灵活的规定、服用不同的组合方式,比如把一个控件布置在容器的整体居中位置。
完成了这些,你的UI框架就能用于展示各种视图了。
3、事件分发
仅仅用于展示自然是不够的,不然UI框架完全可以称之为视图框架,这个UI框架应当可以接收各种类型的键盘、鼠标输入。
以H5的canvas为例,我们知道canvas是可以添加鼠标\键盘监听的,你完成了控件和布局,点击按钮控件,响应事件的是按钮还是canvas?
自然是canvas,浏览器哪里知道你写了个“按钮”出来。
对于不熟悉MVC模式的同学可能会有些疑惑,一个“绘制”上去的假按钮,要如何响应事件呢?
我们再来看下这棵树:
aaarticlea/png;base64,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" alt="" />
推论如下:
1、根容器的bounds等同于canvas的位置大小。
2、如果canvas接收到了鼠标事件,鼠标一定位于某个根容器下某个控件位置上。
3、树遍历控件,即可快速找到事件发生的时候,鼠标处于哪个控件之上。
鉴于JS在某些浏览器上的执行效率(我不是说微信),我们还可以做更多的优化。这里抛砖引玉:
1、引入层(layer)的概念,对树结构再做一个横向划分,优先查找层数高的控件,也可以让某些层的控件不参与查找。
2、对控件本身设置可点击属性,毕竟if判断的速度要比计算(x,y)是否位于bounds范围内要快。
下一篇我来讲讲,如何制作游戏\动画框架,再以后应该不会谈UI相关的东西了,毕竟我也不是做这个的。
基础知识漫谈(2):从设计UI框架开始的更多相关文章
- 游戏UI框架设计(一) : 架构设计理论篇
游戏UI框架设计(一) ---架构设计理论篇 前几天(2017年2月)看到一篇文章,国内王健林.马云等大咖们看好的未来十大最有"钱途"产业中,排名第一的就是"泛娱乐&qu ...
- 小范笔记:ASP.NET Core API 基础知识与Axios前端提交数据
跟同事合作前后端分离项目,自己对 WebApi 的很多知识不够全,虽说不必要学全栈,可是也要了解基础知识,才能合理设计接口.API,方便与前端交接. 晚上回到宿舍后,对 WebApi 的知识查漏补缺, ...
- 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素
[源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...
- 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, VerticalAlignment
[源码下载] 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, Vertical ...
- 背水一战 Windows 10 (63) - 控件(WebView): 基础知识, 加载 html, http, https, ms-appx-web:///, embedded resource, ms-appdata:///, ms-local-stream://
[源码下载] 背水一战 Windows 10 (63) - 控件(WebView): 基础知识, 加载 html, http, https, ms-appx-web:///, embedded res ...
- SLAM第一篇:基础知识
无论在室内.野外.空中还是水下,SLAM是机器人进入未知环境遇到的第一个问题.本期给大家介绍SLAM的基础知识:传感器与视觉SLAM框架 近来年,智能机器人技术在世界范围内得到了大力发展.人们致力于把 ...
- 【数据库上】 第四讲 E-R模型基础知识
第四讲 E-R模型基础知识 一.数据库设计过程 数据库设计的关键阶段? 各个阶段设计的主要任务? 基础条件:清楚一个应用系统的功能需求与数据需求(直接与用户交互.数据流程图示例/UML类图等) 核心阶 ...
- UI设计初学者教程:色彩基础知识
编辑:千锋UI设计 初学设计都会先认识三原色,通常我们说的三原色指的是颜料三原色:红.黄.蓝:其实三原色还有色光三原色:红.绿.蓝.我们通常说的红黄蓝就是减色法三原色,而红绿蓝是加色法三原色.可能这么 ...
- 自己动手设计并实现一个linux嵌入式UI框架(设计)
看了"自己动手设计并实现一个linux嵌入式UI框架"显然没有尽兴,因为还没有看到庐山真面目,那我今天继续,先来说说,我用到了哪些知识背景.如:C语言基础知识,尤其是指针.函数指针 ...
随机推荐
- SQL谜题(加减符号替代)
问题:将以下字符串”.1.2.3.4.5.6.7.8.9 = 1“中的符号点(.)更改为符号加(+)或符号(-),有多少种方法?请用SQL解决此问题 计算过程: CREATE TABLE #(VAL ...
- nodejs持续学习--必须关注4网站
1.官网:https://nodejs.org/en/ 2.模块社区:www.npmjs.com(FQ) 3.github.com 4.全球技术问题讨论社区 http://stackoverflow. ...
- linux中redis的php扩展安装
PHP中的扩展一般都是在安装环境的时候就已经装好了的.但是有的一些扩展在后期想要加上去的话也是可以的.php支持后期安装扩展. 想要安装扩展就需要先去下载安装扩展所需要的扩展源码包.autoconf. ...
- NMAP分布式扫描工具dnmap
NMAP分布式扫描工具dnmap NMAP是一款知名的网络扫描工具.它提供丰富和强大的网络扫描功能.但很多时候,需要渗透测试人员从多个终端发起扫描任务,以快速扫描大型网络,或规避IP限制等安全策略 ...
- 商贸食品车销成功应用PDA抄单 现场开单 打印销售单安卓智能手持POS应用
中小超市配送食品,酒水饮料,业务员以往是挨家挨户抄每个超市需要哪些东西,晚上回公司再统计,打到软件里面,开单配货. 选用PDA后,人手一台,直接在超市里面抄好货物,通过网络传输到公司软件上面,加快了工 ...
- 【转】SSL协议、SET协议、HTTPS简介
一.SSL协议简介 SSL是Secure Socket Layer的缩写,中文名为安全套接层协议层.使用该协议后,您提交的所有数据会首先加密后,再提交到网易邮箱,从而可以有效防止黑客盗取您的用户名.密 ...
- MVC5项目中添加Wep API
一.查看MVC版本,决定你有没有必要看这篇文章 打开web.config,看到以下内容 <dependentAssembly> <assemblyIdentity name=&quo ...
- ContactsUtil 工具类 - 转载
import java.util.HashMap; import java.util.Map; //http://www.open-open.com/code/view/1432300986802 / ...
- 使用 Redis 实现排行榜功能
排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如“用户积分榜”.如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对 ...
- Xml 建议优先使用属性
要点:建议优先选用属性的方式记录数据,除非还需要包容层级式的数据. 优点: 1. 可以完全覆盖关系型数据库的数据格式设计,利于交换. 2. 占用空间小.相当于 JSON 格式,不再有大量重复的节点名后 ...