转自: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以上才行。
相关推荐
在处理文本时,为了美观,有时会给文本选择一些特殊的字体,使得文本不那么单调,这就 会引发一个问题:由于每个用户的系统有差异,当对方机器上没有安装你指定的字体时,Flash Player会自动选择一个合适的字体,...
Word转PDF文件,如何在PDF中嵌入字体[收集].pdf
excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程excel嵌入chatGPT教程...
WPF_嵌入字体_EmbeddedFont
首先告诉大家如何看自己的pdf文档字体是否嵌入:在pdf格式的文件中,点“文件”-> “文档属性”-> “字体”,显示的就是你文档中用的所有字体了,每一个字体后面,如果注明了“embeded(已嵌入)”或“embeded subset...
嵌入WEB页面的文本编辑框 嵌入WEB页面的文本编辑框
想要制作一些很酷的头部效果而且摆脱网站安全字体并且不使用图片文件?那么就使用css3嵌入字体吧!
本程序为一个富文本编辑器,可以很方便的嵌入网页中,希望对大家有帮助。
那么就使用CSS3嵌入字体吧! 想要制作一些很酷的头部效果而且摆脱网站安全字体并且不使用图片文件?那么就使用CSS3嵌入字体吧! 上一篇:CSS3教程(6):创建网站多列 要使用一款字体,我们首先需要使用‘@font-face’...
在WPF 资源文件内嵌入个性化字体。
专用 asf /avi/ai/wpf 解码器 专用 asf /avi/ai/wpf 解码器 专用 asf /avi/ai/wpf 解码器 专用 asf /avi/ai/wpf 解码器 专用 asf /avi/ai/wpf 解码器 专用 asf /avi/ai/wpf 解码器 专用 asf /avi/ai/wpf 解码器 专用...
黑羽大虾flash as3教程 为什么放弃AS2.0选择AS3.0?如果只允许我说三个理由。那么AS3.0对XML的近乎完美的支持绝对是其中一个。 简单说说AS3.0中对于XML支持的不同吧: A.AS2.0对XML的支持勉勉强强,将就着可以用。而...
用MATLAB实现文本文档水印嵌入与提取.pdf
嵌入搜索引擎
支持对文本的剪切复制粘贴,居中、对齐、字体字号颜色行间距改变,以及插入图片、表格等功能
matlab开发-在图像中嵌入文本和图形。在图像中刻录或嵌入文本和图形。
网上搜到之前的嵌入Winform代码已经不可用了,自己搜索也没有找到,参考官方API文档自己弄了一个,基于LibreOffice 7.2.5,兼容性不错,绝大部分Office文档都可以浏览 且可以转换成PDF,自由嵌入自己的WinForm窗体,...
一个非常优秀的屏幕、文本和视频捕获与转换程序。 可以捕获windows屏幕、dos屏幕;rm电影、游戏画面;菜单、窗口、客户区窗口、最后一个激活的窗口或用鼠标定义的区域。...新版还能嵌入word、powerpoint和ie浏览器中。