是否有Flex的多行文本解决方法

时间:2009-08-31 18:44:48

标签: flex actionscript-3

是否有在Flex 3中显示多行文字的解决方法?到目前为止我尝试过的两个控件是mx:Text和mx:TextArea。每个控件都有自己的错误。供参考:mx:文本错误 - http://bugs.adobe.com/jira/browse/SDK-9819 mx:TextArea错误 - http://bugs.adobe.com/jira/browse/SDK-12616。基本上,如果您没有指定高度并且文本换行到下一行,则两个控件都不会正确处理滚动(高度由Flex动态确定,基于换行)。有没有人有可能有用的解决方法?

感谢。

更新:我过去尝试过的方法之一就是手动计算mx:Text元素的高度。我可以通过使用以下内容来完成此操作:

var textItem:Text = new Text();
var len:int = value.length;
var lines:int = int(len/115) + 1;
var height:int = lines * 20;
textItem.height = height;

虽然这似乎解决了mx:Text中的问题,但是有一个大错误。计算在很大程度上依赖于font-size,letter-spacing和textItem的宽度。我可以使用这个方法,继续我的项目。但是,对此进行维护是不可避免的,对于这样的代码,它将是一个巨大的PITA。

2 个答案:

答案 0 :(得分:7)

我自己必须处理这几次。我发现获得<mx:Text>动态高度大小的最佳方法是将高度留在文本之外,然后在封闭的VBox,HBox等上指定百分比高度100%。如下所示应该如下为你工作:

<mx:VBox width="100%" height="100%">
    <mx:Text text="Your really long text goes here." width="100%"/>
</mx:VBox>

由于这本身就是一个黑客攻击,你的语言可能会有所不同。

修改

如果要扩展上面的示例以便更轻松地维护代码,则应查看TextLineMetrics类。这将允许您测量文本的宽度和高度,同时考虑字体,大小等。可以找到TextLineMetrics的文档here。要使用上面的示例,您需要执行以下操作:

var textItem:Text = new Text();
var metrics:TextLineMetrics = textItem.measureText( value );
var len:int = metrics.width;
var lines:int = int(len/textItem.width) + 1;
var height:int = lines * metrics.height;
textItem.height = height;

答案 1 :(得分:1)

我使用了一个可变高度的文本区域类,对我来说效果非常好:

package
{
    import mx.controls.TextArea;

    /**
     * TextArea that xpands to the height of the content contained
     * within. 
     * @author joel
     * 
     */ 
    public class VariableHeightTextArea extends TextArea
    {
        public function VariableHeightTextArea()
        {
            super();
        }

        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
        {
            super.updateDisplayList(unscaledWidth, unscaledHeight);
            if(this.height != int(this.textField.measuredHeight) + 5 )
            {
                this.height = this.textField.measuredHeight + 5;
            }           
        }
    }
}