2012-09-26 39 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