flash嵌入外部字体(折中方案)
2013-03-06 14:45 fangzhao.lee 阅读(633) 评论(0) 编辑 收藏 举报应用场景:SWF被嵌入网页,在flash舞台上需要即时添加文字,而设备字体被放大到一定size后,出现无法修正的锯齿.
如果把字体文件直接嵌入flash主文件,SWF的体积就变得异常恐怖了.希望结果是这样:flash主文件尺寸很小,可异步加载外部字体库(不介意它的体积).
事实上,当外部字体载入之前,我使用设备字体,当然,在使用过于过大或过小的字号时,文本的锯齿会秋毫毕现.一旦字体库加载完成,立即转换成使用嵌入字体.
具体做法如下:
1.自定义字体类.
1 [Embed(source="/assets/ZhengHei.ttf", embedAsCFF="false", fontFamily="ZhengHei", mimeType="application/x-font")] 2 public class ZhengHei extends Font 3 { 4 public function ZhengHei() 5 { 6 super(); 7 } 8 }
2.创建一个注册该字体的主应用文件.
1 public class FontZhengHei extends Sprite 2 { 3 public function FontZhengHei() 4 { 5 Font.registerFont(ZhengHei); 6 } 7 } 8
3.将注册字体的主文件编译成swf.
4.在需要动态加载外部字体库的应用文件中使用Loader载入编译好的字体swf文件.
当然,如果字体库文件与应用程序不在同一个域,在远程服务器上需要部署crossdomain策略文件.
1 protected function loadFontLib(fontLibUrl:String):void 2 { 3 var loader:Loader = new Loader(); 4 var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain); 5 context.securityDomain = SecurityDomain.currentDomain; 6 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onFontLibLoaded); 7 loader.load(new URLRequest(fontLibUrl), context); 8 } 9 10 private function onFontLibLoaded(e:Event):void 11 { 12 dispatchEvent(new Event("loadEmbedFontComplete")); 13 }
当程序派发"loadEmbedFontComplete"事件时,我们就可以使用名为"ZhengHei"的嵌入字体了:
1 var format:TextFormat = new TextFormat(); 2 format.font = "ZhengHei"; 3 format.size = 20; 4 format.color = 0x000000; 5 6 var textDisplay:TextField = new TextField(); 7 textDisplay.wordWrap = true; 8 textDisplay.antiAliasType = AntiAliasType.ADVANCED; 9 textDisplay.mouseEnabled = false; 10 textDisplay.selectable = false; 11 textDisplay.embedFonts = true; 12 textDisplay.defaultTextFormat = format; 13
在字体库载入完成之前,可以暂时使用设备字体,比如"宋体",在那种情形下,TextField的embedFonts属性必须设置为false.