使用Embed标签在AS3项目中嵌入字体
2013-07-12 11:02
120 查看
本站原创文章,转载请注明: 转载自zrong's Blog,原文 使用Embed标签在AS3项目中嵌入字体;
本站翻译文章会标明[译],转载要求同上,并请注明原作者文章地址;
本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
本站转载文章会标明[转],转载请注明原作者文章地址。
2011年9月10日更新:根据网友zszen的回复,找到这样几篇更详细的文章:Flash字体嵌入方法总结—(1)基础篇
Flash字体嵌入方法总结—(2)ActionScript基础篇
Flash字体嵌入方法总结—(3)ActionScript提高篇
Flash字体嵌入方法总结—(4)进阶篇
Flash中文字体嵌入助手 在线版 AIR版 源码
FontCreator – 好用的字体编辑工具
MainType – 同一公司出品的字体管理工具
source on github关于嵌入字体,其实Embed fonts这篇文章已经很详细的介绍了。但这篇文章有这样几个问题:它是针对Flex开发者的,纯AS开发者看起来未免不爽;
没有讲解怎么使用在Flash IDE中嵌入的字体;
嵌入字体就那么点东西,其实不值得花功夫读这一大篇鸟语(介是偷懒……)
那我就把要点总结下……
配合Flash IDE使用
我现在开始讨厌Flash IDE,因为它实在太慢,而且跳版本不兼容。但如果希望可视化的控制嵌入的字体中的文本,还必须使用Flash CS5。下面是Flash CS5嵌入字体的两张截图。这个界面很直观,但其实我们可以用更直观的方式(控制unicodeRange的方式,当然,这个“直观”只是对程序员来说),后面会讲到。
图中的“传统”和“TLF”分别对应你的字体是用于TextField还是用于FlashPlayer 10支持的FTE引擎。这两者是互斥的,不能选错。如果在输出属性面板中选择的目标是Flash Player 9,那么在这里是不能选择嵌入方式的。输出后的swf,使用下面的语法嵌入:?View Code ACTIONSCRIPT
[Embed(source="myFont.swf",fontFamily="04b_08"] public var myFont:Class; |
fontFamily就是双击嵌入的字体打开的的字体预览中显示的全名。例如,微软雅黑的fontFamily的值为
Microsoft YaHei。这里要注意的是,不要使用这种错误的语法来嵌入字体:?View Code ACTIONSCRIPT
[Embed(source="myFont.swf",symbol="MyFont"] public var myFont:Class; |
MyFont并不是一个Symbol,这种语法只能用于在Flash IDE中导出的MovieClip或者图像、声音等资源。
在纯AS3项目中嵌入字体
如果你和我一样讨厌Flash IDE的话,那不如直接在AS3代码中嵌入TTF字体好了,语法如下:?View Code ACTIONSCRIPT[Embed(source="04b_08__.ttf",fontName="04b_08",embedAsCFF="false",unicodeRange="U+0020,U+0041-005A,U+0020,U+0061-007A,U+0030-0039,U+002E,U+0020-002F,U+003A-0040,U+005B-0060,U+007B-007E,U+0020-002F,U+0030-0039,U+003A-0040,U+0041-005A,U+005B-0060,U+0061-007A,U+007B-007E")] public var Font04b08:Class; public var myFont:Class; |
04b_08的TTF字体中的英文、数字和标点符号,包含大小写。来看看这四个常用参数的作用吧:source 指定要嵌入的字体文件路径。还可以用
systemFont指定一个系统中安装的字体。这样的话就可以不需要
source参数了。
fontName 这个实际上就是
fontFamily的别名。
embedAsCFF 如果不提供这个参数,默认就是true。所以,如果系统你嵌入的字体用于TextField,一定要将其设置为false。
unicodeRange 要嵌入的文本的范围。见下表:
嵌入字体范围:大写字符 U+0020,U+0041-U+005A
小写字符 U+0020,U+0061-U+007A
数字 U+0030-U+0039,U+002E
标点符号 U+0020-U+002F,U+003A-U+0040,U+005B-U+0060,U+007B-U+007E
基本拉丁字符 U+0020-U+002F, U+0030-U+0039, U+003A-U+0040, U+0041-U+005A, U+005B-U+0060, U+0061-U+007A, U+007B-U+007E
当然,还有中文范围等等,详细的可以找到你本机的
FlexSDK/frameworks/flash-unicode-table.xml看看就明白了。还可以参考Setting character ranges。那么,怎样制作一个只有嵌入字体数据的swf文件呢?有两种方法:第一种,使用下面的范例代码。下面的代码嵌入了两个字体,使用的范围和上面的例子一样。有趣的是,如果你在嵌入字体的这个SWF文件中使用嵌入的字体(额……我知道有点拗口),你不需要注册这个字体。如果查看注册字体列表,你会发现它已经注册过了。运行下面的代码就知道了。?View Code ACTIONSCRIPT
package { import flash.display.Sprite; import flash.text.Font; public class fonts extends Sprite { [Embed(source="04b_08__.ttf",fontName="04b_08",embedAsCFF="false",unicodeRange="U+0020,U+0041-005A,U+0020,U+0061-007A,U+0030-0039,U+002E,U+0020-002F,U+003A-0040,U+005B-0060,U+007B-007E,U+0020-002F,U+0030-0039,U+003A-0040,U+0041-005A,U+005B-0060,U+0061-007A,U+007B-007E")] public var Font04b08:Class; [Embed(source="Frabk.ttf",fontFamily="Franklin Gothic Book",embedAsCFF="false",unicodeRange="U+0020,U+0041-005A,U+0020,U+0061-007A,U+0030-0039,U+002E,U+0020-002F,U+003A-0040,U+005B-0060,U+007B-007E,U+0020-002F,U+0030-0039,U+003A-0040,U+0041-005A,U+005B-0060,U+0061-007A,U+007B-007E")] public var FontFrabk:Class; public function fonts() { var __fontArr:Array= Font.enumerateFonts(false); //Font.registerFont(myFont); for each(var __font:Font in __fontArr) trace(__font.fontName, __font.fontType); } } } |
FlexSDK/bin文件夹下,是JAVA开发的命令行工具。具体用法和参数与Embed类似,看Using the fontswf utility就清楚了。
载入外部的字体文件
当然,你不应该载入ttf文件。应该先使用上面介绍的方法把字体做成swf文件,然后载入。使用Loader载入外部的swf文件后,需要获取到该swf中嵌入的字体的Class,然后使用Font.registerFont注册这个字体,注册成功后就可以使用了。获取swf中嵌入的字体的Class,也有两种方法:第一种,载入成功后,使用Loader.content获取到载入的swf的root,然后直接通过该swf中定义的public变量获取到类定义:?View Code ACTIONSCRIPT
var __font:* = _loader.content; trace('04b08:', __font.Font04b08); Font.registerFont(__font.Font04b08); Font.registerFont(__font.FontFrabk); |
ApplicationDomain.getDefinition获取嵌入的字体类,类的名称是“源文件类名_嵌入目标变量名称”:?View Code ACTIONSCRIPT
var __fontClass:Class = _loader.contentLoaderInfo.applicationDomain.getDefinition("fonts_Font04b08") as Class; trace('class:',__fontClass); Font.registerFont(__fontClass); |
?View Code ACTIONSCRIPT
var __loaderContext:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain); _loader.load(new URLRequest('fonts_local.swf'), __loaderContext); |
?View Code ACTIONSCRIPT
var __loaderContext:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain, SecurityDomain.currentDomain); _loader.load(new URLRequest('fonts_local.swf'), __loaderContext); |
相关文章推荐
- 使用Embed标签在AS3项目中嵌入字体(转自http://zengrong.net/post/1438.htm)
- 使用Embed标签在AS3项目中嵌入字体
- AS3中使用嵌入字体
- 在AS3中使用嵌入字体
- html嵌入标签embed的使用
- flash embed fonts–动态创建文本时嵌入字体_解决_rotation和_alpha不能使用的问题
- [ActionScript 3.0] 使用Embed在类中嵌入字体
- 实际项目中页面标签的使用
- 项目有字体特殊要求,而Xcode自带汉字字体不能满足,Xcode如何使用字体文件(下载的ttf)
- css 使用@font-face 嵌入自定义字体或字体图标方法笔记
- embed标签的使用(在网页中播放各种音频视频的插件的使用)
- flex embed标签的使用(一)
- flash embed fonts–动态创建文本时嵌入字体
- SVN之——使用 Eclipse 的 SVN 插件创建项目的主干/分支/标签
- finereport 嵌入到 java web 项目 中 及使用遇到的问题
- Flex/AIR 中 Embed 标签的使用(9 切片的缩放技术)
- 使用@font-face 属性 实现在网页中嵌入任意字体
- [Embed]标签可嵌入的文件类型
- Flex中如何通过设定headerStyleName样式在Accordion控件中使用嵌入字体的例子
- Extjs 利用panel html属性加入DIV实现如TextArea的效果,并且能正确使用html标签,实现如向textarea文本域嵌入按钮button或其他控件,,而且兼容firefox