Send As SMS

2005-06-27

Learn Java2D

如果能够在无聊的时候,静下心来学习学习,总是会有收获的。可惜,年纪大了,心却还是没法静下来。最近,看了看 2D 方面的一些文档、代码,对2D有了一些基础的认识。

比较好的Java2D的教材:http://java.sun.com/docs/books/tutorial/2d/index.html

在2D中,主要的概念包括:
  • Stroke:用于绘制Shape的外形,包括线宽、样式等。
  • Paint:用于填充 Shape,Color,GradientColor、Texture等几种Paint形式。
  • Composite:用于定义多种形状覆盖时的行为
  • Transform:对基本形式进行变形的技术
  • Clip:定义对图形的剪裁
  • Font:也可以理解Font是一种图形形状的定义。
Java2D基本上是一种PureJava的2D图形实现,采用了Pipe技术,最终产生一个 raster 的图像,这个图像可以在普通的图形环境中显示。本质上,Java2D就是把逻辑世界上的一些图形对象映射到一个raster的光栅世界中,前者是人理解和 使用的语言,后者则是显示器的方式。从这个角度上来看,Java3D(OpenGL)等本质也是如此的。

后来,又察看了已下 SVG 的相关规范,SVG与Java2D在概念上基本一致,而且完全可以在Java2D的基础上进行(不知道batik实现是不是基于Java2D的)。但 SVG把Java2D的概念从Low level的API提升到了一个更高的层次,使用DOM(对象)来表示了一个2D的世界,因此,也可以通过脚本对对象的操作来实现交互、变化的2D世界, 而Java2D则紧紧是在API层次,这些图形的对象也是一个非常暂态的,是使用代码而不是数据来表示2D。

那么,SVG技术可以如何反过来应用到GUI程序中呢?这里仅仅是我的一些很初步的想法:
  1. 在Swing的L&F中,可以直接使用外部的XML来配置L&F,这个就是现在的Synth的基本概念。
  2. 可以使用SVG来定义render。这里包括样式和render两部分,后者的动态性更强,更为复杂,也提供更灵活的功能。完全可能将原来在Java中通过代码来完成的功能,通过SVG来进行render。
  3. 可以采用一些优化的技术,例如,优化的编译技术,可以自动的把SVG编译成为Java2D的调用,从而提高render的速度,并降低对象所 占用的开销,或者对一些render采用cache处理,可以预期在性能上可以满足用户需求。但是,可以通过外部的工具,来对这些SVG进行配置(尤其是 提供WYSIWYG的可视化效果,从而让美学专家来定义显示效果)
在样式方面,所有的GUI组件都可以借鉴Java2D的概念,例如,background,不仅仅可以是颜色,而且可以是Texture、 GridentColor等,同样显示也可以是透明的。单单如果能够让所有的按钮都能配上一个好的背景图案,我觉得UI的效果就会完全不同。

0 Comments:

张贴评论

<< Home