在Flex2或3中,运行时的共享库(Runtime shared library)很有用。可以将类放在外部共享中,也可以将图形、小动画以SWF的形式共享。以类的方式共享相对要简单些,就好像Flex3支持SDK缓存一样,甚至可以做到跨域共享。不过这个功能估计要等到 Flex3正式版本出来才看得清楚,现在Flex3 beta的Bug实在太多了。
相比之下,共享图形等资源是非常实用的。由于在Flex中无法直接访问RSL中的图形资源,也就是无法直接取出SWF库中的元件,尽管都已经通过连接方式导出,常见的做法(来自 Programming.Flex.2中的实例):
先在类中嵌入资源,这里都定义为静态属性,方便调用。
ActionScript" style="font-family:monospace;">package com.oreilly.programmingflex { public class Images { [Embed(source="image.jpg")] public static const IMAGE_A:Class; } }
使用:
<?xml version="1.0" encoding="utf-8"> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" > <mx:Script> <![CDATA[> import com.oreilly.programmingflex.Images; ]]> </mx:Script> <mx:VBox> <mx:Image source="{Images.IMAGE_A}" scaleContent="true" width="100" height="100" /> </mx:VBox> </mx:Application>
如果我们希望可以更灵活地操作资源,比如添加到任一容器中。毕竟Image是个比较大的控件。进入SDK里面,研究了Image类的代码,我找到了一个比较简单的方法:
var myClass:Class = Class(Images.IMAGE_A); var child:DisplayObject = new myClass(); </p> <p> var u:UIComponent = new UIComponent(); u.addChild(child);
SWF库中的元件都被视为DisplayObject类型,Flex中的容器都重写了addChild方法,只有扩展了IUIComponent的对象才可以添加到Flex容器中,这里借助UIComponent来显示。