AS3 - 获取TextField的字体类对象

时间:2012-09-26 22:57:11

标签: actionscript-3 flash

在混合的Flash IDE / Flex项目中,我有一个TextField,我想要检索与该TextField关联的Font类对象。 TextField位于在CS4 IDE中创建的SWF中,并加载到Flex SWF中。

目前,如果满足以下条件,我的代码可以正常运行:

  1. 该字体将导出到子SWF的库中。
  2. TextField链接到导出的字体。
  3. 导出字体的名称在父SWF中进行了硬编码。
  4. 代码如下:

    fontClass = childSwf.loaderInfo.applicationDomain.getDefinition("CustomFont") as Class;
    

    我真正想做的是必须知道导出字体的名称。相反,我想从TextField动态获取字体的Class或Class name。

    更好的是能够在不需要导出的情况下获取内置字体的Class。

    FWIW,最终目标是获取任意TextField并检查它是否包含其嵌入字体无法使用Font :: hasGlyphs()显示的字符。但是,子SWF中的字体未注册显示在Font :: enumerateFonts()中。

1 个答案:

答案 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