2009-08-12 10 views
0

チャットが追加されるたびに、私はずっとこの例のように、Flexコンテナを最後の位置までスクロールさせるにはどうすればよいですか?

http://demo.seanhess.net/oneshots/scrolling.swf

をチャットウィンドウを作成しています、私はそれが完全に最後のメッセージを表示したいです。 maxVerticalScrollPositionを使用してリストのスクロール位置を設定していますが、それは常に間違っています(例を参照)。それは1行ほどそれをundershoots。私はこれを通常のコンテナで試しましたが、同じことをします。 maxVerticalScrollPosition + 1を実行すると、動作が優先されますが、最後のメッセージが特に長い場合は、切り捨てられます(先頭のみが表示されます)。

実際のの底にスクロールするにはどうすればいいですか?

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"> 

    <mx:Script> 
     <![CDATA[ 
      protected function addChat():void 
      { 
       collection.addItem(new String(input.text)); 
       list.verticalScrollPosition = list.maxVerticalScrollPosition; 
       input.text = ""; 
      } 
     ]]> 
    </mx:Script> 

    <mx:Panel width="400" height="290"> 
     <mx:List id="list" width="100%" height="100%" variableRowHeight="true"> 
      <mx:dataProvider> 
       <mx:ArrayCollection id="collection"/> 
      </mx:dataProvider> 
      <mx:itemRenderer> 
       <mx:Component> 
        <mx:Text text="{data}"/> 
       </mx:Component> 
      </mx:itemRenderer> 
     </mx:List> 
     <mx:HBox width="100%"> 
      <mx:TextInput id="input" width="100%" enter="addChat()"/> 
      <mx:Button label="add" click="addChat()"/> 
     </mx:HBox> 
    </mx:Panel> 
</mx:Application> 

答えて

0

addChat()をaddChat()とaddChatScrollToEnd()の2つの関数に分けます。 addChat()内にチャットアイテムを追加し、次にスクロールラインを持つcallLater(addChatScrollToEnd)を追加します。

また、list.validateNow()を呼び出すこともできますが、パフォーマンス上の理由からは推奨されません。

+0

私は、自明ではないアプリケーションではパフォーマンスの問題なしにvalidateNow()を自由に使用します。巨大なループで起動している場合は、回避するよりも、このシナリオではvalidateNow()を推奨します。私はcallLater()よりも優先しています。なぜなら、あなたはコントロールしており、アクションが今行われていることを知っているからです。 –

0

これはうまくいくはずです。

関連する問題