Flex TextArea自动调整大小行为 - 这可能吗?

时间:2009-07-24 18:01:17

标签: flex textarea autoresize

对于多行TextArea Flex组件,希望能够继续输入文本并使TextArea在垂直方向上自动调整大小,以便一次显示所有输入的文本。但是,TextArea希望在布局流程中向下推送任何组件。相反,希望TextArea在它们之上延伸。完成文本输入后,TextArea应缩小并重新绘制到其正常边界。

2 个答案:

答案 0 :(得分:0)

如果TextArea所在的容器使用'绝对'定位(如Canvas),这将起作用。只需测量TextArea上的textHeight,当它到达TextArea高度内的某个范围时,使高度更大。但是,你仍然需要修复z顺序,因为TextArea可能想要在后面其他组件。

答案 1 :(得分:0)

对TextArea类进行子类化并覆盖measure()方法,将测量的尺寸设置为文本区域文本的大小。您还可以添加事件侦听器,以使文本输入上的子类TextArea的大小和父级大小无效,或者重新布局父级。

这是我创建的一个简单类:

public class AutoAdjustTextArea extends TextArea{

/////////////////////////////////////////////////
//Constructor Method/////////////////////////////
/////////////////////////////////////////////////
    public function AutoAdjustTextArea():void{
        super.addEventListener(FlexEvent.ADD, this.invalidateSizeOnEvent, false, 0, true);
        super.addEventListener(Event.CHANGE, this.invalidateSizeOnEvent, false, 0, true);
        super.addEventListener(TextEvent.TEXT_INPUT, this.invalidateSizeOnEvent, false, 0, true);
        super.addEventListener(ResizeEvent.RESIZE, this.invalidateSizeOnEvent, false, 0, true);
    }


/////////////////////////////////////////////////
//Set Methods////////////////////////////////////
/////////////////////////////////////////////////
    override public function set text(value:String):void{
        super.text = value;
        this.invalidateSizeOnEvent();
    }


/////////////////////////////////////////////////
//Measure Methods////////////////////////////////
/////////////////////////////////////////////////
    override protected function measure():void{

    //Calls the super method
        super.measure();

    //Calls to ensure this is validated
        super.validateNow();
        super.textField.validateNow();

    //Grabs the min and max height values
        var minHeight:Number = super.minHeight;
        var maxHeight:Number = super.maxHeight;

    //Grabs the height of the text
        var textHeight:Number = super.textField.textHeight + 4;//+4 for the two pixel gutter on the top and bottom

    //Calculates the preferredHeight
        var preferredHeight:Number = textHeight;
        if(isNaN(minHeight) == false && preferredHeight < minHeight)
            preferredHeight = minHeight;
        else if(isNaN(maxHeight) == false && preferredHeight > maxHeight)
            preferredHeight = maxHeight;

    //Sets the measured dimensions
        super.measuredHeight = preferredHeight;
    }


/////////////////////////////////////////////////
//Event Listener Methods/////////////////////////
/////////////////////////////////////////////////
    private function invalidateSizeOnEvent(event:Event = null):void{
        super.invalidateProperties();
        super.invalidateSize();
        super.invalidateParentSizeAndDisplayList();
    }