我想知道我是否可以在Flex中动态嵌入字体。我想为不同的用户嵌入不同的字体,所以我不想在同一个Flex文件中嵌入所有可能的字体。如果有可能,请发布示例代码。
答案 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 + "; }");
}
}