Skip to main content
Participant
May 31, 2010
Question

about verticalScrollPosition

  • May 31, 2010
  • 1 reply
  • 1077 views

I'm curious about these situation:

package {
     import flash.display.DisplayObject;
     import flash.display.Sprite;
     import flash.events.MouseEvent;
     import flash.utils.getTimer;
     
     import flashx.textLayout.container.ContainerController;
     import flashx.textLayout.elements.*;

     public class TestTLF3 extends Sprite
     {
          private var _lineNum:int = 0;
          
          private var _textFolw:TextFlow = new TextFlow();
          private var _container:Sprite;

          public function TestTLF3()
          {
               var btn:Sprite = new Sprite();
               btn.graphics.beginFill(0xff0000)
               btn.graphics.drawRect(0, 0, 50, 20);
               addChild(btn);
               btn.x = 200;
               btn.addEventListener(MouseEvent.CLICK, onBtnClick);
          }
          
          private function onBtnClick(e:MouseEvent):void{
               addNextMsg();
          }
          
          private function addNextMsg():void{
               var p:ParagraphElement = new ParagraphElement();

               var span:SpanElement = new SpanElement();
               span.fontSize = 11;
               span.text = (++_lineNum).toString();
               trace(_lineNum);

               p.addChild(span);
               _textFolw.addChild(p);
               
               updateDisplay();
          }

          private function updateDisplay():void{
               
               if(_container!=null)
                    while(_container.numChildren>0)
                         _container.removeChildAt(0);
               if(_container!=null && _container.parent!=null)
                    _container.parent.removeChild(_container);
               _container = new Sprite();
               _container.x = 5;
               _container.y = 18;
               addChild(_container);
               
               var controller:ContainerController = new ContainerController(_container, 260, 75);
               
               _textFolw.flowComposer.removeAllControllers();
               _textFolw.flowComposer.addController(controller);
               _textFolw.flowComposer.updateAllControllers();
               
               
               
               
               var textHeight:int = Math.ceil(controller.getContentBounds().height);
               var vsp:Number = 0;
               if(textHeight < controller.compositionHeight){
                    vsp = 0;
               }else{
                    vsp = (textHeight - controller.compositionHeight);
               }
               
               trace("vsp(before)=" + vsp);
               controller.verticalScrollPosition = vsp;
               trace("vsp(after)=" + controller.verticalScrollPosition);
               
               trace(textHeight
                    + "-" + controller.verticalScrollPosition.toFixed(2)
                    + "-" + controller.compositionHeight.toFixed(2)
                    + "=" + (textHeight-controller.verticalScrollPosition-controller.compositionHeight).toFixed(2)
                    );
          }
          
     }
}

output:

[SWF] D:\works\TestTLF\bin-debug\TestTLF3.swf - 562,059 bytes after decompression

1

vsp(before)=0

vsp(after)=0

11-0.00-75.00=-64.00

2

vsp(before)=0

vsp(after)=0

24-0.00-75.00=-51.00

3

vsp(before)=0

vsp(after)=0

37-0.00-75.00=-38.00

4

vsp(before)=0

vsp(after)=0

50-0.00-75.00=-25.00

5

vsp(before)=0

vsp(after)=0

64-0.00-75.00=-11.00

6

vsp(before)=2

vsp(after)=1.3232421875

77-1.32-75.00=0.68

7

vsp(before)=15

vsp(after)=14.043782552083343

90-14.04-75.00=0.96

8

vsp(before)=27

vsp(after)=26.764322916666657

102-26.76-75.00=0.24

9

vsp(before)=40

vsp(after)=39.48486328125

115-39.48-75.00=0.52

10

vsp(before)=59

vsp(after)=54.12324218750001

134-54.12-75.00=4.88

11

vsp(before)=78

vsp(after)=67.3232421875

153-67.32-75.00=10.68

12

vsp(before)=97

vsp(after)=80.52324218749999

172-80.52-75.00=16.48

Although, visually, it seems correct, showed the last line.

But, why after I assign verticalScrollPosition to 97, it represent 80.52324218749999 on the 12th?

This topic has been closed for replies.

1 reply

Participant
May 31, 2010

I found the problem.

If I keep the Container & Controller, don't re-build them every time. The result will be more correctly.

package {
     import flash.display.Sprite;
     import flash.events.MouseEvent;
     
     import flashx.textLayout.container.ContainerController;
     import flashx.textLayout.elements.*;
     import flashx.textLayout.events.CompositionCompleteEvent;

     public class TestTLF4 extends Sprite
     {
          private var _lineNum:int = 0;
          
          private var _textFolw:TextFlow = new TextFlow();
          private var _container:Sprite;
          private var _controller:ContainerController;

          public function TestTLF4()
          {
               var btn:Sprite = new Sprite();
               btn.graphics.beginFill(0xff0000)
               btn.graphics.drawRect(0, 0, 50, 20);
               addChild(btn);
               btn.x = 200;
               btn.addEventListener(MouseEvent.CLICK, onBtnClick);
          }
          
          private function onBtnClick(e:MouseEvent):void{
               addNextMsg();
          }
          
          private function addNextMsg():void{
               var p:ParagraphElement = new ParagraphElement();

               var span:SpanElement = new SpanElement();
               span.fontSize = 11;
               span.text = (++_lineNum).toString();
               trace(_lineNum);

               p.addChild(span);
               _textFolw.addChild(p);
               
               updateDisplay();
          }

          private function updateDisplay():void{
               
               if(_container==null){
                    _container = new Sprite();
                    _container.x = 5;
                    _container.y = 18;
                    addChild(_container);
                    
                    _controller = new ContainerController(_container, 260, 75);

                    _textFolw.flowComposer.addController(_controller);
               }
               
               _textFolw.flowComposer.updateAllControllers();
               
               var textHeight:int = Math.ceil(_controller.getContentBounds().height);
               var vsp:Number = 0;
               if(textHeight < _controller.compositionHeight){
                    vsp = 0;
               }else{
                    vsp = (textHeight - _controller.compositionHeight);
               }
               
               trace("vsp(before)=" + vsp);
               _controller.verticalScrollPosition = vsp;
               trace("vsp(after)=" + _controller.verticalScrollPosition);
               
               trace(textHeight
                    + "-" + _controller.verticalScrollPosition.toFixed(2)
                    + "-" + _controller.compositionHeight.toFixed(2)
                    + "=" + (textHeight-_controller.verticalScrollPosition-_controller.compositionHeight).toFixed(2)
                    );
          }
          
     }
}

output:

[SWF] D:\works\TestTLF\bin-debug\TestTLF4.swf - 561,931 bytes after decompression

1

vsp(before)=0

vsp(after)=0

11-0.00-75.00=-64.00

2

vsp(before)=0

vsp(after)=0

24-0.00-75.00=-51.00

3

vsp(before)=0

vsp(after)=0

37-0.00-75.00=-38.00

4

vsp(before)=0

vsp(after)=0

50-0.00-75.00=-25.00

5

vsp(before)=0

vsp(after)=0

64-0.00-75.00=-11.00

6

vsp(before)=2

vsp(after)=1.3232421875

77-1.32-75.00=0.68

7

vsp(before)=15

vsp(after)=14.523242187500003

90-14.52-75.00=0.48

8

vsp(before)=28

vsp(after)=27.723242187500006

103-27.72-75.00=0.28

9

vsp(before)=41

vsp(after)=40.92324218750001

116-40.92-75.00=0.08

10

vsp(before)=55

vsp(after)=54.12324218750001

130-54.12-75.00=0.88

11

vsp(before)=68

vsp(after)=67.3232421875

143-67.32-75.00=0.68

12

vsp(before)=81

vsp(after)=80.52324218749999

156-80.52-75.00=0.48

It differ from "vsp(before)" with "vsp(after)", only in 1.0.