读书人

关于flash施用嵌入字体的说明

发布时间: 2012-10-31 14:37:32 作者: rapoo

关于flash使用嵌入字体的说明

Flash字体嵌入方法总结—(1)基础篇

大家都知道在Flash中嵌入
上图是Flash CS4的文字相关界面。为一个动态文本框嵌入文件的基本方法是,在Character Embedding的弹出面板填入你所需要的字符。在上方的列表中是一些常用的字符范围。比如做Loading显示的,只要嵌入第四项Numerals,或许再多加一个“%”的符号就可以了。

在动态文本框中嵌入的这些字符在该
这种方法可以方便的嵌入整个字型,但是因为不能选择需要嵌入的字体,所以对于中文来说几乎形同鸡肋。

此外如果要使用字型的变体:斜体和黑体,都需要另外嵌入的。因为这些变体其实算是另一种字体。面板中"Faux"的意思是指用矢量引擎虚拟出来的字型,其实原字体并没有这些变体可供选择。如果字体包含了各种变体,那么这两个选项是不可用的。
关于flash施用嵌入字体的说明

对某些不规范的或者是笔划复杂的中文字体,矢量引擎处理比较容易出错。如文字中空心的部分会变成有填充的,有的甚至会造成关于flash施用嵌入字体的说明

Flash字体嵌入方法总结—(2)ActionScript基础篇
接着我的上一个转过来的帖子说
在上一篇使用字体元件的时候,我们接触到了TextField对象的embedFonts属性。在这里,我们进一步的探讨一下怎么在ActionScript中使用嵌入文本。

一旦我们在Flash IDE中嵌入了字体,swf文件中就包含了该字体的矢量信息。ActionScript也可以使用这些信息。继续上文的例子,我们添加如下
新建一个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 loaderoader = 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"了。

Flash字体嵌入方法总结—(4)进阶篇
前面已经把基本上嵌入字体的相关知识都梳理了一遍:

? ? * 如何在Flash IDE中嵌入字体
? ? * 如何在Flash IDE中使用嵌入的字体
? ? * 如何使用Flex SDK嵌入字体
? ? * ActionScript如何使用嵌入的字体
? ? * 运行时共享字体库的两种方法

下面讨论一下几种问题和可能性:

? ? * Font类只有registerFont()方法,而没有unregisterFont()。不知道如果向系统中多添加一些字体定义以后会不会有内存占用的问题。
? ? * 把整个中文字库完全嵌入所增加的文件量大约在5M-10M,现在的视频Intro也差不多要3M-5M。随着宽带的进一步发展,把中文字库完全嵌入也并非不可能。
? ? * 在文字内容可知的情况下,不管用哪种方法,我们都必须手动去生成字体库。当然如果是配合CMS后台的话,可以编写后台程序来批处理的生成AS文件。配合命令行调用编译器甚至可以直接生成包含字体的swf文件。关于这方面的讨论,可以看看这里或这里。
? ? * 进一步想,用户输入的字符用嵌入字体来渲染也并非不可能。关键是精简初始字库,然后逐步加载更完整的字库。比如我们可以先加载常用汉字"Font1"(1M-2M左右),然后再加载其余的汉字"Font2"。
? ?? ?那么如何调用正确的字体来实时显示呢?我们可以借助Font类实例的一个hasGlyphs()方法,来检测当前字体是否包含了某个字符的矢量信息(glyphs)。如果字符已经可以被渲染,则设置embedFonts,否则我们则用系统字体来显示。

读书人网 >Flash

热点推荐