我可以在Flex中动态嵌入字体吗?

时间:2010-05-16 11:49:25

标签: flex

我想知道我是否可以在Flex中动态嵌入字体。我想为不同的用户嵌入不同的字体,所以我不想在同一个Flex文件中嵌入所有可能的字体。如果有可能,请发布示例代码。

1 个答案:

答案 0 :(得分:2)

您可以在Actionscript中执行此操作。我主要使用这个技巧来使用Flash IDE中编译器不支持的opentype字体,并创建可以懒惰加载的字体库(仅在需要时),但您也可以使用它来有选择地加载字体。如果您的服务器上有mxmlc编译器,您甚至可以生成fontlib.as文件并根据命令进行编译。

// fontlib.as
// font library file
package {
   import flash.display.Sprite;

   public class fontlib extends Sprite {
      [Embed(source = 'font/path/FontFile.otf', fontName = 'FontFile', unicodeRange = 'U+0020-U+007E,U+00AB,etc...')]
      public static var FontFile:Class;
      public static const FontFile_name:String = "FontFile";  // matches 'fontName' in embed

      public function fontlib() {
      }
   }
}

这可以这样编译:

mxmlc fontlib.as

您可以在您的应用程序中使用:

// Main.as
// document class
package {
   import flash.text.Font;
   import flash.display.Loader;
   import flash.events.Event;
   import flash.system.ApplicationDomain;
   import flash.text.StyleSheet;

   public var fontsLoader:Loader;
   public var fontFile:String = "";
   public var ss:StyleSheet;

   public function Main() {
      fontsLoader = new Loader();
      fontsLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onFontsLoadComplete);
   }

   private function _onFontsLoadComplete(e:Event):void {
      var fontlib:Class = e.target.applicationDomain.getDefinition('fontlib');

      Font.registerFont(fontlib.FontFile);  // registers font
      fontFile = fontlib.FontFile_name;     // name the font was loaded as

      // actually using the font looks like this:
      ss = new StyleSheet();
      ss.parseCSS("div { fontFamily: " + fontFile + "; }");
   }
}