1、SVG 和 XForms: 呈现定制内容 使用 SVG 1.2 新的基于 XML 的扩展机制 Antoine Quint (antoine.quint@fuchsia-)), SVG 顾问与研究科学家, Fuchsia Design 简介: 第一个可伸缩向量图形(Scalable Vector Graphics,SVG 1.0)规范奠基了 XML 表示二维交互式图像和动画的标准。从那以后,W3C SVG 工作组一直致力于改进它的特性,使 SVG 更容易在 Web 和桌面应用程序开发中使用。SVG 1.2 一个很有前途的特性是呈现定制内容(Rendering Custom Content,
2、 RCC)——它提供了清晰的以 XML 为中心的扩展机制,在一个 SVG 文档中混合与匹配不同的 XML 名称空间。本文在介绍 RCC 机制的同时将引导您创建一个简单的按钮部件。 在过去的两年中,SVG 团体已经研究出了新的方法,利用 SVG 的 XML 基础在单个 SVG 文档中混合与匹配多个名称空间。 在关注的主要焦点中,用户界面工作成为在 SVG 文档中内嵌使用定制 XML 标记的基本用例。 呈现定制内容(RCC)——在最新的 SVG 1.2 草案中推介的一项新技术——提供了一种新的框架,允许自定义 XML 语法作为格式良好的扩展无缝集成到 SVG 文档中。在本系列文章中的 基础知识一
3、文中曾经提到,由于提供了混合与匹配这两类标记的基础,RCC 在 SVG 和 XForm 的集成中起着重要的作用。本文中将介绍 RCC 的基础,探讨如何实现一个用户界面部件(按钮),并提供一个更丰富的 UI 应用程序的演示。
RCC 基础
在开始用 RCC 编写这个简单的按钮部件之前,我将回顾一下基本知识和新推出的 RCC 元素家族。
将 XML 绑定到图形
使用 RCC,您可以规定给出的外部名称空间元素在 SVG 文档中的行为。下面这些是最基本的 SVG 代码,在开始用 RCC 编程时您一定会用到:
清单 1. 设置 RCC 环境
4、ce="http://ns.example.org/MyCustomNamespace/">
5、该属性直接以 URI 作为属性值。仅仅是为了避免造成更大的混乱,这个属性与 XML 的 xmlns 属性并不完全相似——这里的名称空间永远是 SVG —— namespace 属性在这里只是表明所描述的定制元素属于哪个名称空间。从概念上讲,
6、呈现的定制 XML 标记的绑定,从而映射到 SVG 片段。正如我在第一篇“基础知识”文章中提到的那样,SVG 片段在 RCC 世界中实际上是一个影像树。我无法用言语表达影像树所带来的种种不可思议的神奇作用,但是我将在以后再讨论它,因为它对于理解这种特性非常重要。要在预设的影像树中链接自定义的元素,您需要使用新的
7、时每当遇到这些已知的元素就触发 RCC 绑定机制。绑定也可以发生在这些已知元素中的某一个被添加到树中的时候,比如通过 insertChild() DOM 调用增加元素。这使得整个绑定机制是 活动的,这是该过程与 XSLT 使用模板将 XML 元素绑定到另一个 XML 输出之间的一个重要区别,后者本质上是一次性的批处理操作。 影像树 现在绑定机制已经清楚了,非常重要的一点是要完全理解影像树在 RCC 上下文中的重要性和使用方法。我在以前的文章中曾经提到,影像树对于呈现定制元素的巨大好处是它保留了一个健康的、井井有条的文档树。使用 RCC 编写组件,比如用户界面部件,很可能涉及到一些巧妙的脚本
8、使用抽象标记的 SVG 表示。通过影像树,这些代码逻辑可以依靠那些不容易被外部代码访问的 SVG 子树——尽管在需要时仍然能够访问。除了前述为 RCC 支持而添加的元素之外,SVG 1.2 增加了由所有定制元素实现的 DOM 接口SVGShadowable 。使用这个接口,您可以通过调用诸如 myCustomElement.shadowTree 这样的调用获得对定制元素影像树的访问。 RCC 和 DOM 事件 因为总是能够通过 DOM 访问定制元素的影像树,在对组件编程时您可以使用 活动绑定。只要监听定制元素能够触发的合适 DOM 事件,您就会不断地得到报告定制元素正在做什么。RCC 绑定
9、机制提供了两个新的专用于绑定的事件:
· SVGBindBegin 对应绑定的起始阶段,即定制元素已经被解析但还没有建立和呈现为影像树的时候。
· SVGBindEnd 通知绑定阶段已经完成,即您的元素已经被绑定和呈现。
如果您希望定制元素仍然是活动的,您只能依靠 DOM 的突变事件,如 DOMAttrModified 用于检测属性的变化, DOMSubTreeModified则用于能够对其子树变化作出响应的定制容器。
模块性
我简要地提一下使用
10、xlink:href 属性指明您的库定义的位置。因此,您可以像下面这样定义和使用基于 RCC 的 XForms 实现扩展: 清单 2. 跨越多个文件的 RCC 扩展体系结构 XFormsImplementation.svg SomeFileUsingSVGandXFormsWithYourSpiffyR
11、CCImplementation.svg
通过这个简单而优雅的库结构,几乎任何人都能够创建一个 RCC 库放在网络上供其他人使用。这样就简化了使用 RCC 开发 SVG 应用程序,并促进社区推动的工作在不远的将来能够提供免费的库。另外值得一提的是,
12、不仅可以是老的 SVG 图形元素,还可以包括 RCC 定义的定制元素。因此又引入了 RCC,这种递归形式非常适合创建重用并以其他组件为基础的组件。把这些结合在一起就形成了一个可以使用的非常不错的框架。现在您可以准备做一些具体的工作了。
回页首
使用 RCC 编程:
13、和 RCC 机制设计的组件,您要做的第一件事可能就是在纸上勾勒出这种想法,并想象出标记应该是什么样子。这里要涉及的是一个简单的按钮,上面带有文本标签。简而言之,我要建立一个拥有几何与位置属性和文字标签的简单元素,把它作为一个子节点:
14、时如何做出正确的决策。我的
15、钮的不同实例时,就可以在文件中安全地使用 16、tensionDefs namespace="http://xmlns.fuchsia-
18、定义的开始,按照在根元素 19、色边界的内部填充浅灰色。它有固定的 height (高度)25 和 width (宽度) 0.... 0!?是的,矩形的宽度与 20、上都有一个 id 属性。这些 id 如何在生成的每个影像树中保持唯一性呢?RCC 通过局部作用域的 id 解决了这个问题。当讨论代码时,使用这些 id 的原因就清楚了。您可能还注意到另外一件奇怪的事——
36、以监听按钮的定制事件。打开 参考资料中 demos.zip 压缩包中的文件,您将看到: 图 2. 两个独立的按钮 在同一个压缩包中,您还会看到一个更高级的基于 RCC 的示例应用程序。这个应用程序是为了说明更高级的 RCC 定制元素的应用。我还有一个更强大的可以换皮肤的下压按钮和一个可设置风格的组合框,它们利用了前面定义的下压按钮,并强调了 RCC 的可重入性。尽管出于简洁起见,本文没有没有详细地讨论定制元素如何实现更换皮肤或者 CSS 样式,现在您完全可以看看这些文件并领会实现的技巧。图 3 所示的是该应用程序的截屏图片,模仿了 Windows XP 部件的观感,当,这里是
37、 100% 的 SVG 而没有任何过程性的 GDI 调用: 图 3. 可设置风格的组合框应用程序 本文详细探讨了 RCC 的内部工作机理,引导您创建了一个简单部件的实现,并提供了理解更复杂应用程序的基础知识。下一篇文章中,我将讨论与 SVG 有关的内容,探讨如何实现 XForms 和 SVG 的结合。在本系列的最后一部分中,我将介绍如何把已有的基于 RCC 的 UI 部件包装到一些更高级的 XForms 控件中,并用 XForms 重新改写可设置风格的组合框。下次再见! 参考资料 · 您可以参阅本文在 developerWorks 全球站点上的 英文原文. · 从
38、 这里下载本文的实例文档。 · 追根溯源——直接在 W3C 上阅读 XForms 1.0和 SVG 1.2规范。 · 关于 SVG 的背景知识,请参阅 developerWorks教程 “ 可伸缩向量图形介绍” (2002 年 2 月) 和 “ 交互式动态可伸缩向量图形”(2003 年 6 月)。 · 了解 XForms 的更多背景知识,请参阅 developerWorks教程“理解 XForms”(2004 年 1 月)。 · 利用 DOM Level 3 Events,创建一个定制类型的专用事件。 · 回顾另一个相关的 W3C 规
39、范 XML Events,该规范与 DOM Events 息息相关。 · 下载最新的 Adobe SVG Viewer 6 预发布版,看看这些例子,并尝试 RCC 和 SVG 1.2 的其他优势。 · 在 developerWorks 中国网站 XML 专区能找到更多的 XML 资料。 · 了解如何才能成为 IBM 认证的 XML 及相关技术的开发人员。 关于作者 Antoine Quint 是一名独立的 SVG 顾问和研究科学家,他以特约专家的身份参与到 W3C SVG Working Group 中。他还喜欢教学工作,喜欢在风景优美的地方出席会议,以及做一些外购工作。所有这些都是以 SVG 为导向的。在巴黎的家中,他与一只名叫 Stig Elmer 的猫生活在一起。Antoine 还写过一本非常延迟的书,那是他与老友 Robin Berjon 一起工作的成果。






