【问题标题】:AS3 - Get font Class object for a TextFieldAS3 - 获取 TextField 的字体类对象
【发布时间】:2012-09-26 22:57:11
【问题描述】:

在一个混合的 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() 中。

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案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。

    【讨论】:

    • 感谢您的回答 :) 不幸的是,这给了我字体的名称(字符串)而不是字体的关联 Class 对象。我试过在字体名称上调用 getDefinition 并且它崩溃了。你知道用这个 String 来获取 Class 的方法吗?
    • 谢谢。看起来你到了和我差不多的地方。真正的问题是如何在不知道它被称为“CustomFont”的情况下获得“CustomFont”。
    • 借助enumerateFonts函数和您的文本字段,您可以在不知道的情况下获得CustomFont。
    • 子 SWF 中的字体未注册以显示在 Font::enumerateFonts() 中。
    • 事实上,正是出于这个原因,您的部分解决方案是在 getDefinition() 之后立即调用 registerFont()。
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多