我有一个库MovieClip类,它只包含一个MovieClip中包含的动态文本字段。
我想实例化此MC,使用text填充textField,获取结果文本的宽度,如果宽度小于预定义的MIN_WIDTH值,则附加更多文本。
当宽度等于或大于我的MIN_WIDTH值时,将此MovieClip类添加到显示列表中。
我的问题是,有没有人知道在将textField添加到显示列表之前是否可以使用Textlinemetrics在textField中检索文本的长度?
答案 0 :(得分:2)
您缺少以下信息,因为文本测量在您创建和配置文本字段时工作正常,而无需将其添加到显示列表中。
诀窍是确保在完全配置TextField 后设置“text”属性。在给定所有先前配置的设置的情况下,设置“text”属性似乎最终确定了布局。
您遇到的问题可能是您正在设置“text”属性,然后更改其他设置,例如multiline或embedFonts。执行此操作时,getLineMetrics将不会返回正确的值。如果然后再设置“text”属性并再次检查getLineMetrics,则值将是正确的。请参阅此示例以及跟踪语句后的注释。
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并且它使用了一些未嵌入的其他默认字体,则文本可能根本不会显示。因此,请确保首先设置defaultTextFormat,配置其他属性,并在调用getLineMetrics之前设置“text”。
在这里,使用我创建的这个功能。它强制您首先配置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;
}
答案 1 :(得分:0)
当然 - 据我所知,无论文本字段是否在显示列表中,TextLineMetrics都能正常工作。你有没有试过这个并且无法让它发挥作用?如果是这样,请告诉我们您的代码 - 除非我遗漏了它应该正常工作。