2010-05-16 77 views
0

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

+0

那岂不是更容易掌握一些SWF是基于嵌入字体在平台上?说winxp.swf加载你的应用在windows xp上不存在的应用使用的字体,osx.swf加载osx缺失的字体等。当客户端加载应用时,为正确的平台加载正确的字体swf。 – 2010-05-16 11:54:36

回答

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 + "; }"); 
    } 
} 
相关问题