flash嵌入外部字体(折中方案)

应用场景: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.

原文地址:https://www.cnblogs.com/fangzhaolee/p/2946098.html