转自:http://bbs.9ria.com/forum-375-2.html
如果你的Flash使用了一种没有嵌入的字体,那你要小心,如果你的作品在其它没有安装这种字体的终端运行时,显示出的字体可能会很惨不忍睹,所以要使用嵌入字体,那么,该怎么嵌入字体呢?
下面的元数据标签网上一搜一把:
[Embed(source="xxx", fontName="xxx", mimeType="application/x-font")]
只要使用该元数据标签将一个字体文件(多为.ttf的文件)嵌入后即可直接使用TextFiled进行显示,看上去很简单,不过在下在具体的使用中发现了2个严重的问题,为了帮助大家不走弯路,特意啰嗦一下。
问题1:多数情况下我们只需要使用特定的字符即可,可是元数据标签提供的unicodeRange不能直接把需要的字符打进去,而是用该字符对应的unicode码(如:U+5927),那么我怎么获取每个字符的unicode码?
问题2:as3中有两种类型的文本呈现对象(fp10以后),一个是位于flash.text包的TextField,另一个是新的文本引擎FTE,位于flash.text.engine包的TextLine,按理说嵌入的字体应该两种文本都能支持,可是偏偏不是,看过帮助文档,原来新的引擎只支持一种称为压缩字体的cff格式的嵌入字体,而老的引擎呢只支持一般的字体格式,就是各用各的,那好办,新的引擎咱上网下个cff格式的字体不就行了,可是百度谷歌cff、cff下载和cff download后,傻了...
如果不弄明白这两个问题,我认为嵌入字体基本上等于没法用,现在我来解答第一个问题:其实要获取一个字符的unicode码很简单,直接上AS:
trace("U+"+"囧".charCodeAt(0).toString(16));
恭喜,你得到了“囧”的unicode码了,基于此我专门写了个简单的获取unicode码的swf,只需要输入文字后点击“获取脚本”就行了:
这个小工具的源码和swf文件在下载包中都有附带的。
下面解决第二个问题,请跟着在下一起嵌入几个字后分别用新老文本引擎把他们显示出来吧:
1.先弄一个ttf字体文件来,最好去下一个艺术点的,什么,cff的格式要不要下?不用,让这个哥继续它的传说吧;
2.打开unicodeRange获取器,输入:“这句话有嵌入字体的支持,”,点击“获取脚本”按钮,你会得到下面的脚本:
package { public class FontLibrary { [Embed(source="tff或其它字体文件的绝对或相对位置", fontName="该嵌入字体的名称", mimeType="application/x-font", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")] public var embed_font:Class; } }
3.新建一个AS项目,名称叫EmbedFontExample,需要注意的是SDK要选择4.0以上的,因为4.0以下的SDK不支持把嵌入的字体转换为CFF格式的字体,而4.0以上的SDK默认会将嵌入的字体转换为CFF格式的字体;
4.新建一个类FontLibrary,把之前得到的脚本粘贴到该类中;
5.将你下载的字体文件复制到和FontLibrary类的文件的同一目录下,更改以下元数据标签,我下载的是华文行楷,文件名为STXINGKA.TTF,所以我将元数据标签改为:
embedAsCFF="false"
[Embed(source="STXINGKA.TTF", fontName="hwxk", mimeType="application/x-font", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")]
6.如果你是用FlexIDE,你会得到一个程序入口类EmbedFontExample,给这个类添加脚本如下:
package { import flash.display.Sprite; import flash.text.*; import flash.text.engine.*; public class EmbedFontExample extends Sprite { public function EmbedFontExample() { //将嵌入字体类关联进本程序 new FontLibrary(); //老文本引擎 var textFormat:TextFormat = new TextFormat(); textFormat.font = "hwxk"; textFormat.size = 20; var textFiled:TextField = new TextField(); textFiled.embedFonts = true; textFiled.text = "这句话有嵌入字体的支持,这句话没有嵌入字体的支持。"; textFiled.setTextFormat(textFormat); textFiled.width = 200; textFiled.wordWrap = true; addChild(textFiled); //新文本引擎 var fontDescription:FontDescription = new FontDescription(); fontDescription.fontLookup = FontLookup.EMBEDDED_CFF; fontDescription.fontName = "hwxk"; var format:ElementFormat = new ElementFormat(fontDescription); format.fontSize = 20; var textElement:TextElement = new TextElement("这句话有嵌入字体的支持,这句话没有嵌入字体的支持。", format); var textBlock:TextBlock = new TextBlock(); textBlock.content = textElement; createLines(textBlock); } private function createLines(textBlock:TextBlock):void { var yPos:Number = 200; var textLine:TextLine = textBlock.createTextLine(null, 200); while(textLine) { addChild(textLine); yPos += textLine.height+2; textLine.y = yPos; textLine = textBlock.createTextLine(textLine, 200); } } } }
运行看看效果:
等等,怎么只出来了一个?老文本引擎怎么啥也没有啊(老文本引擎的x为0,新的为200,一上一下)?还记得我说过我去帮助里看过的东西么?老文本引擎不支持CFF类型的嵌入字体,新文本引擎只支持CFF类型的嵌入字体,而FlexSDK4.0以上的编译器默认会把嵌入的字体转换为CFF格式,那么怎么办呢?只需给编译器加一个不把字体转换为CFF类型的指令就行了,在unicodeRange获取器中勾选“嵌入为非CFF格式”后生成的脚本会多出该指令:
embedAsCFF="false"
好了,但是如果不把该字体转换为CFF格式,新的文本引擎又不能显示了,汗!那就添加两种字体类型吧,FontLibrary改变如下:
package { public class FontLibrary { [Embed(source="STXINGKA.TTF", fontName="hwxk", mimeType="application/x-font", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")] public var embed_font:Class; [Embed(source="STXINGKA.TTF", fontName="hwxk_noncff", mimeType="application/x-font", embedAsCFF="false", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")] public var embed_font_noncff:Class; } }
同时EmbedFontExample类也要改一下老文本引擎的textFormat对象的font属性:
textFormat.font = "hwxk_noncff";
好了再运行看看是不是行了:
现在我们看到,新老文本引擎对待嵌入字体还是有点不太一样的,除了cff格式外,老文本引擎如果要显示的字符没有嵌入他就不显示该字符了,而新文本引擎则会用设备默认的字体显示没有嵌入的字符,即老文本引擎的“没”和句号没有嵌入就不显示了,而新引擎则是用默认的字体代替。
进阶:
给字体添加一定的滤镜效果就能得到更好看的字体,比如加个发光和渐变滤镜,呵呵,以后Flash要显示个性字体不用再麻烦PS了,注意字体在swf中是用矢量保存的哦,可以无损的放大缩小。
关于FlexSDK4.0以下的嵌入cff格式用于新文本引擎的问题:
在FlexSDK4.0以下里有一个属性cff,可以这么用来将嵌入的字体转换为CFF压缩格式(FlexSDK4.0以下的嵌入字体默认是不会转换为CFF格式的,及新文本引擎不能显示嵌入字体),如:
[Embed(source="STXINGKA.TTF", fontName="hwxk", mimeType="application/x-font", cff="true", unicodeRange="U+6301, U+5165, U+8FD9, U+FF0C, U+5B57, U+53E5, U+4F53, U+8BDD, U+7684, U+6709, U+652F, U+5D4C")]
悲剧的是这样编译器会报错而无法通过编译,到现在在下也没能找到可以解决该问题的方法,所以大家如果要让新文本引擎显示嵌入字体还是得使用FlexSDK4.0以上才行。