2012-09-26 42 views
1

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

目前,我有代码,如果满足下列条件的作品:

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

代码如下:

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

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

更好的办法是在不需要导出的情况下获取内置字体的类。

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

回答

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

+0

感谢您的回答:)不幸的是,这给了我的字体(一个字符串)的名称,而不是字体的关联类对象。我试过在字体名称上调用getDefinition,并且崩溃。你知道一种使用这个String来获得类的方法吗? – Sean

+0

@Sean更新了答案,找到字体类 – Moorthy

+0

谢谢。看起来你和我做过的地方差不多。真正的问题是如何获得“CustomFont”而不知道它被称为“CustomFont”。 – Sean