【问题标题】:AS3 TextLineMetrics get text width BEFORE object is on DisplaylistAS3 TextLineMetrics 在对象位于显示列表之前获取文本宽度
【发布时间】:2012-02-18 01:49:24
【问题描述】:

我有一个库 MovieClip 类,它仅由包含在 MovieClip 中的动态文本字段组成。

我想实例化这个 MC,用文本填充 textField,获取结果文本的宽度,如果宽度小于预定义的 MIN_WIDTH 值,则追加更多文本。

当宽度等于或大于我的 MIN_WIDTH 值时,将此 MovieClip 类添加到显示列表中。

我的问题是,在将 textField 添加到显示列表之前,是否有可能使用 Textlinemetrics 检索 textField 中的文本长度?

【问题讨论】:

    标签: actionscript-3 dynamic-data textfield


    【解决方案1】:

    您缺少以下信息,因为在您创建和配置文本字段时文本测量工作正常,而无需将其添加到显示列表中。

    诀窍是确保在完全配置 TextField 之后将“text”属性设置为 LAST。鉴于之前配置的所有设置,设置“text”属性似乎完成了布局。

    您遇到的问题可能是您正在设置“文本”属性,然后更改其他设置,例如多行或 embedFonts。当您这样做时,getLineMetrics 将不会返回正确的值。如果您随后设置“文本”属性并再次检查 getLineMetrics,则这些值将是正确的。请参阅此示例和跟踪语句后的 cmets。

    var tf:TextField = new TextField();
    tf.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
    tf.embedFonts = true;
    tf.text = "Hello"; //set text last
    trace( tf.getLineMetrics(0).height ); //Traces 22.55 (correct)
    
    var tf2:TextField = new TextField();
    tf2.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
    tf2.text = "Hello"; //set text first
    tf2.embedFonts = true; //modify a property after setting text seems to make the TextField "dirty"
    trace( tf2.getLineMetrics(0).height ); //Traces 1.15 (incorrect)
    
    var tf3:TextField = new TextField();
    tf3.defaultTextFormat = new TextFormat( "Arial Black", 16, 0, false );
    tf3.text = "Hello";
    tf3.embedFonts = true; //modifying a property after setting the text seems to make the TextField "dirty"
    tf3.text = "Hello"; //setting the text again seems to fix the problem
    trace( tf3.getLineMetrics(0).height ); //Traces 22.15 (correct)
    

    这里的教训是您配置 TextField 的顺序很重要。这被证明是正确的,例如,对于 defaultTextFormat 属性,您必须在设置文本之前设置该属性,否则您设置的新文本将不会选择 defaultTextFormat。在这种情况下,如果您打开了 embedFonts 并且它使用了一些其他未嵌入的默认字体,则文本可能根本不会显示。因此,请确保在调用 getLineMetrics 之前先设置 defaultTextFormat,配置其他属性,最后设置“文本”。

    在这里,使用我创建的这个函数。它强制你先配置TextField的重要属性(text、type、multiline、selectable、embedFonts),后面的参数就是TextFormat构造函数的参数,顺序相同。它确保您的属性以正确的顺序设置,文本最后分配,它将您的 TextField 创建减少到一个语句:

    public static function CreateTextField( text:String = "", type:String = null, multiline:Boolean = false, selectable:Boolean = true, embedFonts:Boolean = false, font:String=null, size:Object=null, color:Object=null, bold:Object=null, italic:Object=null, underline:Object=null, url:String=null, target:String=null, align:String=null, leftMargin:Object=null, rightMargin:Object=null, indent:Object=null, leading:Object=null ):TextField
    {
        var tf:TextField = new TextField();
        tf.defaultTextFormat = new TextFormat( font, size, color, bold, italic, underline, url, target, align, leftMargin, rightMargin, indent, leading );
        tf.embedFonts = embedFonts;
        tf.multiline = multiline;
        tf.selectable = selectable;
        tf.type = type;
        tf.text = text; //setting text last ensures the text line metrics returns correct values
        return tf;
    }
    

    【讨论】:

    • 当我将您的代码复制并粘贴到主时间线中的 Flash CS4 中时,我没有得到相同的数字。我得到 0,1.15,0..
    • 那么你的字体没有嵌入。您必须在库中嵌入 Arial Black。如果它的使用计数为零,那么您必须检查“export for actionscript”以确保实际嵌入了字体。如果不嵌入字体,您将看到 0 而不是 22.55。
    【解决方案2】:

    当然 - 据我所知,无论文本字段是否在显示列表中,TextLineMetrics 都有效。您是否尝试过此操作并且无法使其正常工作?如果是这样,请告诉我们您的代码 - 除非我遗漏了什么,否则它应该可以工作。

    【讨论】:

    • 它肯定可以工作,但你缺少一些东西;看我的回答。我自己也遇到了这个问题(这让我想到了这个问题),并看到我设置的一个非常简单的示例有效,而原始示例却没有。两者之间的唯一区别是某些语句的顺序,所以我意识到如果在设置“text”属性后设置其他属性,例如“embedFonts”,getLineMetrics 将返回不正确的值。因此,您只需在配置其他属性后,最后设置“文本”属性,然后 getLineMetrics 将返回正确的值。
    猜你喜欢
    • 2012-10-22
    • 2020-04-05
    • 2013-10-15
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多