1

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

目前,如果满足以下条件,我的代码可以工作:

  1. 字体在子 SWF 的库中导出。
  2. TextField 链接到导出的字体。
  3. 导出字体的名称在父 SWF 中是硬编码的。

代码如下:

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

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

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

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

4

1 回答 1

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列表中。否则它会获取默认字体类而不是您的自定义类。

或者,您可以简单地将一个变量添加到动画剪辑(其中放置文本字段)来保存字体类或字体类名称。

例如:如果holder是包含文本字段的影片剪辑,则使用

holder.fontClass = cl

代替

Font.registerFont

你可以简单地检索字体类

txt.parent.fontClass

如果是这样就不需要enumerateFonts这种方式。

于 2012-09-27T04:49:57.747 回答