在做聊天室群聊窗口文字消息添加的时候,发现一个奇怪的问题,滚动条总是不能到达底部。上网搜了搜,终于发现了问题的所在。
当为一个容器添加一个child的时候,很容易想到的做法是:
vbox.verticalScrollPosition = vbox.maxVerticalScrollPositon;
但是,这是不完全正确的。这种做法是在childAdd事件触发的时候来设置verticalScrollPosition,但是使用这种方法,得到的效果总是滚动条离最下方有一段距离。其实,当childAdd事件触发的时候,像vbox这些container并没有开始重新改变自己的尺寸。此时返回的maxVerticalScrollPosition不是最新的,而是上一次的。这时候需要使用callLater方法,就可以得到准确的maxVerticalScrollPosition。
下面是一个例子:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.Button;
import mx.events.ChildExistenceChangedEvent;
private function addAButton(): void
{
var newButton:Button = new Button();
newButton.label = "new button" ;
vbox2.addChild(newButton);
}
private function onAdd(event:Event):void{
callLater(focusNewRow);
}
private function childAddHandler(event:ChildExistenceChangedEvent): void
{
callLater(focusNewRow);
}
public function focusNewRow():void {
vbox2.verticalScrollPosition = vbox2.maxVerticalScrollPosition;
};
]]>
</mx:Script>
<mx:Text width="400" fontWeight="bold" text="Scroll in A Container Use Case: Click on the Button to continue adding children to the container and watch the scrollbar. It will always scroll to the bottom of the container." />
<mx:VBox id="vbox2" borderThickness="2" borderStyle="solid" height="120" width="240"
childAdd="childAddHandler(event)" added="onAdd(event)">
<mx:Button label="hello"/>
</mx:VBox>
<mx:Button label="click me to add a button" click="addAButton()" />
</mx:Application>
除了在一个container里自动滚动,还有一个问题就是如何在一个TextArea里随着文字的动态变化,将滚动条自动定位到TextArea的底部。很容易想到的就是在TextArea的“change”事件中设置verticalScrollPosition。但是,这样依旧行不通,你需要使用valueCommit事件。当TextArea得尺寸发生变化时,这个事件比change事件触发的要晚。示例代码如下:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.ado