绪论 这篇文章将介绍可升级2D矢量图像API(Scalable 2D Vector Graphics API),他是J2ME的一个可选包。这些API很易于使用,他们能够用来渲染和转换体积小和伸缩性好的二维(2D)图像,这个可选包在Java社区进程(JCP)中以JSR-226研发。我将会给出API的总括,并且突出典型的用户案例,使用代码演示这些案例。总括 JSR-226将渲染和重放矢量2D图像引入到Java语言的移动应用中。由Nokia领导的专家组,是由移动行业的主要厂商组成,他们都很有兴趣将矢量多媒体内容引入到他们的设备中。在写这篇文章时,这个规范刚刚被核准,大家正在热切期待着一个参考实现。矢量图对移动研发者来说,有两大好处:占用空间小和伸缩性好。考虑下面这个简单的图像: 图1 一个简单的示例图像 使用GIF格式,这个图片的大小会达到7386字节。使用向量格式,大小仅仅为693字节,不到十分之一。这种减少是怎样发生的呢? 以光栅为基础的图像格式,像GIF,对组成图像的矩形区域中的每一个像素的色彩内容进行编码。而矢量图,仅仅包含决定像素应该怎样被着色的绘画指令。一个图像的向量表示法能够更大程度上进行压缩,这对资源受限的移动设备是个很大的有利因素。 伸缩性好是另外一个重要的长处。矢量图能够很清楚的进行变换,因为他们的绘画指令是和分辨率无关的。图2显示前一张图片进行等比例缩小、翻转和旋转后的图像。 图2 示例图片的变换 矢量图的度量单位是任意的和相对的,他们能够被一些常量因子乘或除,以变换图像从而适应特定设备的屏幕。通过对这个坐标系统使用简单的数学操作,您能够创造出无限的效果,包括翻转、旋转、拉伸和扭曲。使用矢量图像,应用程式研发者不再需要为图像和图标创建不同的集合,来支持不同的屏幕分辨率。 矢量图的简洁和伸缩性在动画领域大放异彩。以光栅为基础的动画,像网页中的GIF和MIDP游戏中的精灵,在动画的每一个帧中包含整个图片都很费力。和之相比,以矢量为基础的动画仅仅包含一些指令,而这些指令规定了当需要改变动画时的图像哪些元素应该怎样改变。假如矢量图的大小比他们相对应的光栅图小一个数量级,那么矢量动画的大小就比他们相对应的光栅动画小两个数量级,这使得他们成为在移动设备上变换和展示多媒体内容的理想选择。 当以私有的Macromedia Flash播放器为基础的矢量图和矢量动画变得流行时,可升级矢量图像(Scalable Vector Graphics,SVG)文档格式以开放的标准和免费的专利权,成为业界的另外一个选择。他由W3C标准化。SVG-Tiny提供了SVG全部功能的一个子集,适合在移动设备上使用。JSR-226采用SVG-Tiny的1.1版本作为J2ME矢量图像的官方文档格式。W3C称SVG-Tiny为一个“Profile”,但是为了避免和J2ME的Profile混淆,我称之为“格式”。 SVG-Tiny标准也能够支持动画。图像文档内部的指令能够自己修改图像元素的位置和属性,来回应时钟事件和用户输入。 为了更加复杂的交互,JSR-226引入了兼容microDOM的API,microDOM是SVG1.2完整的文档对象模型(DOM)的一个子集。 SVG是一种可扩展标记语言(XML)格式,他使用一个公共的Schema充分的注释和系统化。SVG-Tiny可能很小,但是他们仍然是SVG文档,仍然包含XML。下面是代表一个“brave world”图像的完整的SVG-Tiny文档: "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd"> viewbox="10 10 130 55" width="150.0" height="75.0"> width="100" height="22.75" stroke="#000000" stroke-width=".5"/> height="22.75" stroke="#000000" stroke-width=".5"/> stroke-width=".33" xml:space="preserve">Hello brave world. 这个文档声明了两个矩形和一些文字。第一个矩形绕他的中央旋转15度,这一系列的转换都包含在rect标记的转换属性中。第二个矩形在第一个之上绘制,然后文本在第二个矩形之上绘制。 实时未经修饰的文本不是个特别的简洁格式,这个文档仍旧比一个压缩的光栅图像小的多,并且易于人工导入。因为XML文本能够充分地压缩,所以SVG在应用程式的JAR文档中就占用相对较少的空间。JSR-226需要支持SVG文档的实现使用gzip格式压缩。后缀名.svgz表示gzip压缩的文档。Mobile 2D API JSR-226的一个主要的目的就是定义移动2D图像(Mobile 2D Graphics,M2G)API,这个API是一小组和SVG-Tiny格式功能结合很紧密的类。他没有被规定为普通的2D图像绘制工具箱,就像J2SE的Graphics2D类提供的那样。M2G API很清楚地定位于播放和在运行期操纵SVG内容。 M2G由高级类和低级类组成,高级类用来创建和渲染矢量图像,而低级类负责以DOM树的部分来操纵一个矢量图像的XML成分。矢量图像是ScalableImage的实例,您能够通过这个的静态createImage()方法获得他们。您使用ScalableGraphics的一个实例将ScalableImages绘制到一个MIDP图像上下文中。SVGImage是ScalableImage的一个子类,他提供事件处理和底层DOM文档访问之间的联系。 为了使渲染动画SVG内容的普通情况更加方便,这个API提供了SVGAnimator类。对MIDP应用程式,SVGAnimator创建和控制一个Canvas对象,这个对象自动处理屏幕更新,以回应动画事件和对这个图像的计划性的修改。SVGAnimator提供一个类似播放器接口来控制动画的播放。 这些类都定义在javax.miroedition.m2g和org.w3c.dom.svg包中,在表1中进行了总结,并且在JSR-226规范中也作了充分的注释。SVG DOM是在标准的org.w3c.dom和org.w3c.dom.events包中定义DOM类和接口的扩展。
[1] [2]
喜欢本文,那就收藏到: