在混合的Flash IDE / Flex项目中,我有一个TextField,我想要检索与该TextField关联的Font类对象。 TextField位于在CS4 IDE中创建的SWF中,并加载到Flex SWF中。
目前,如果满足以下条件,我的代码可以正常运行:
代码如下:
fontClass = childSwf.loaderInfo.applicationDomain.getDefinition("CustomFont") as Class;
我真正想做的是不必须知道导出字体的名称。相反,我想从TextField动态获取字体的Class或Class name。
更好的是能够在不需要导出的情况下获取内置字体的Class。
FWIW,最终目标是获取任意TextField并检查它是否包含其嵌入字体无法使用Font :: hasGlyphs()显示的字符。但是,子SWF中的字体未注册显示在Font :: enumerateFonts()中。
答案 0 :(得分:1)
您可以使用getTextFormat
函数获取文本字段字体名称。考虑txt
是文本字段,然后是
var format:TextFormat = txt.getTextFormat();
trace(format.font);
经过一番研究,我找到了这个解决方案,它可以解决问题。
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.getQualifiedClassName;
import flash.text.Font;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLRequest;
var font:Font;
var txt:TextField;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
loader.load(new URLRequest("sub_fla.swf"));
function onLoaded(e:Event){
var cl:Class = e.currentTarget.applicationDomain.getDefinition("CustomFont") as Class;
Font.registerFont(cl);
trace(cl);
txt = new TextField();
this.addChild(txt);
txt.text = "Moorthy";
var format:TextFormat = new TextFormat();// = txt.getTextFormat();
font = new cl();
format.font = font.fontName;
txt.setTextFormat(format);
enumerateFonts();
}
function enumerateFonts(){
var embeddedFonts:Array = Font.enumerateFonts(false);
embeddedFonts.sortOn("fontName", Array.CASEINSENSITIVE);
trace("---->"+embeddedFonts.indexOf(txt.getTextFormat().font));
for(var i:int = 0;i<embeddedFonts.length;i++){
font = embeddedFonts[i];
trace("embeddedFonts["+i+"]:"+font.fontName+":"+font);
if(txt.getTextFormat().font == font.fontName){
trace("My font class is '"+getQualifiedClassName(font) +"'");
}
}
}
不要忘记注册字体以将其输入enumerateFonts
列表。否则,它将获取默认字体类而不是您的自定义类。
或者,您可以简单地将一个变量添加到movieclip(放置文本字段)以保存字体类或字体类名。
例如:如果holder
是包含文本字段的动画片段,则使用
holder.fontClass = cl
而不是
Font.registerFont
您可以通过
简单地检索字体类 txt.parent.fontClass
如果是这样的话,就不需要enumerateFonts
。