现在我们了解了Flash字符嵌入的几种方法,也知道了怎么在IDE和ActionScript中使用嵌入字体。但是在开发项目中,通常会有很多swf文件(页面或模块),它们大都使用相同的字体。我们不得不在每个文件中重复嵌入字体。有没有办法打破单个swf的使用范围的限制呢?
方法一是使用运行时共享(runtime share)技术。首先用前文讲述的方法建立一个"MyArial"字体,选择Export for ActionScript。然后选择Export for runtime sharing(为运行时共享导出),填入完整文件路径。最后发布fontLibrary.swf文件。这样我们就得到了一个运行时字体库,下面我们再来看看如何在其他swf中使用。
新建一个fla文档,在File菜单下选择Open External Library(打开外部库)。在新打开的库面板中可以看到我们刚才建立的"MyArial",把它拖动到当前文件的库面板中。Flash自动为我们导入了这个字体,右键点开属性如下图所示:
Import for runtime sharing表示这个元件是外部导入的。现在和正常使用字体元件一样,创建一个动态文本框,选择"MyArial"字体,随便打入一些文字,发布文件。从生成的文件量上来分析可以得出字体矢量信息并没有被编译进来,而是动态地从fontLibrary.swf获取的。Flash Player自动为我们完成了这一过程。
方法二是利用ActionScript里的Font类来向系统动态的注册字体。首先用Flash中文嵌入助手生成类代码,贴进Flex编辑器,将其作为文档类编译生成fontLibrary.swf文件。
注意构造函数下的这句代码:
-
Font.registerFont(ClassName);
通过执行registerFont()方法,一旦fontLibrary.swf被加载(即实例化),我们就在系统中注册了名为"FontName"的字体。当然我们也可以在需要的时候再去向系统注册而不在构造函数中执行。
字体注册后,就等同于在客户端安装了这种字体,我们可以随意的使用。
相比第一种方法只能嵌入整个字体的限制(参见前文对于字体元件的解释),这种方法不仅解决了问题,而且更加灵活。也是目前使用汉字文字共享库的唯一办法,下面让我们来看一下实例。
建立FontLibrary.fla文件,在第一帧输入以下代码:
-
[Embed(systemFont="华文中宋", fontName="MyFont", unicodeRange="U+4e2d,U+6587,U+5b57,U+578b", mimeType="application/x-font")]
-
var MyClass : Class;
-
-
Font.registerFont(MyClass);
我们建立了一个"MyFont"字体,包含了“华文中宋”字体的四个中文字符矢量信息:“中文字型”,并向系统注册。执行编译生成了fontLibrary.swf文件。
然后另外建立要使用字体库的文件,在第一帧写下以下代码:
-
var loader:Loader = new Loader();
-
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
-
loader.load(new URLRequest("fontLibrary.swf"));
-
-
function completeHandler(event : Event):void {
-
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, completeHandler);
-
var fmt:TextFormat=new TextFormat("MyFont",68,0x336699); //使用MyFont字体
-
var txt : TextField = new TextField();
-
txt.autoSize=TextFieldAutoSize.LEFT;
-
txt.embedFonts=true;
-
txt.text="中文字型";
-
txt.setTextFormat(fmt);
-
addChild(txt);
-
}
以上代码先用loader加载fontLibrary.swf。当加载完毕以后,新建的文本框就可以使用我们的自定义字体"Myfont"了。