1

Flash IDE と Flex が混在するプロジェクトで、TextField があり、その TextField に関連付けられている Font クラス オブジェクトを取得したいと考えています。TextField は、CS4 IDE で作成された SWF にあり、Flex 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 に答える