您缺少以下信息,因为在您创建和配置文本字段时文本测量工作正常,而无需将其添加到显示列表中。
诀窍是确保在完全配置 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;
}