TextField多行+换行获取文本高度

时间:2010-08-25 14:20:15

标签: flash actionscript-3 text

我有一个TextField,启用了多行和自动换行,并且有一个固定的宽度。我想计算其中文本的总高度。

我尝试使用TextField.textHeight,但这给了我一行的高度。由于包装,我不能轻易计算出与线高相乘的线数。 TextField.height只是给我固定的默认字段高度,100像素。

那怎么办呢?

3 个答案:

答案 0 :(得分:4)

代码中一定有错误,因为textHeight应该返回TextField高度,而不仅仅是一行高。

答案 1 :(得分:1)

确保包含wordWrap

这跟踪txt.textHeight = 135

var format:TextFormat = new TextFormat();
format.font = new Bauhaus ().fontName;

var txt:TextField = new TextField();
txt.embedFonts = true;
txt.multiline = true;
txt.defaultTextFormat = format;
txt.wordWrap = true;
txt.width = 100;
txt.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi metus diam, condimentum sagittis rutrum vitae, vehicula et velit.";
addChild(txt);

trace("txt.textHeight "+txt.textHeight);

答案 2 :(得分:0)

我通过查看Docstip找到了解决方案。

以下两种方法对我来说都非常适用于单行,多行自动换行(只是文本换行和\ n),以及多行无换行(只需\ n)。

短假设版本(不要使用此功能):

var totalLines = textField.bottomScrollV - textField.scrollV + textField.maxScrollV;
var metrics    = textField.getLineMetrics(0);
var gutter     = 2;
var actualHeight = (metrics.ascent + metrics.descent) * totalLines + (totalLines - 1) * metrics.leading + 2 * gutter;

更好的版本,其中行具有不同的指标(使用此):

var gutter  = 2;
var totalLines = textField.bottomScrollV - textField.scrollV + textField.maxScrollV;

var actualHeight = 0;
var prevLeading = 0;
for (var i = 0; i < totalLines; i += 1)
{
    var metrics = textField.getLineMetrics(i);
    actualHeight += metrics.ascent + metrics.descent + prevLeading;
    prevLeading = metrics.leading;
}
actualHeight += 2 * gutter;

对于带有内嵌图像的单行测试,其中textField高度为32,textHeight给出39,计算出的高度(上面的actualHeight)为34.对于高度为97.20的多行测试,textHeight为23.79,actualHeight是97.15。这个实际高度包括两侧的排水沟,但是如果有的话,它会去掉尾随的前端。