http://blog.ityao.com/archives/552
最近工作需要,对TextLayout的API进行了学习研究,遇到一个问题就是如何让未知长度的内容能够自动全部显示出来呢。
于是对API进行了研究,做了两个例子.
原理很简单,就是通过判断最后textflow的最后一个字符有没有容器装着,如果没有,就扩大容器或者添加容器
txtFlow.flowComposer.findControllerIndexAtPosition(txtFlow.textLength-1)<0
1. 自动调整容器高度(也可以改成宽度),匹配文字内容
package
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.text.engine.TextLine;
import flashx.textLayout.compose.StandardFlowComposer;
import flashx.textLayout.compose.TextFlowLine;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.elements.FlowLeafElement;
import flashx.textLayout.elements.ParagraphElement;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.events.CompositionCompleteEvent;
public class AutoResizeContainer_example extends Sprite {
private var txtFlow:TextFlow;
private const poem:String = "Sonnet 18" +
"Shall I compare thee to a summer's day?" +
"Thou art more lovely and more temperate:" +
"Rough winds do shake the darling buds of May,\n" +
"And summer's lease hath all too short a date:\n" +
"Sometime too hot the eye of heaven shines,\n" +
"And often is his gold complexion dimmed,\n" +
"And every fair from fair sometime declines,\n" +
"By chance, or nature's changing course untrimmed:\n" +
"But thy eternal summer shall not fade,\n" +
"Nor lose possession of that fair thou ow'st,\n" +
"Nor shall death brag thou wand'rest in his shade,\n" +
"When in eternal lines to time thou grow'st,\n" +
"So long as men can breathe or eyes can see,\n" +
"So long lives this, and this gives life to thee.\n" +
"William Shakespeare\n";
public function AutoResizeContainer_example()
{
txtFlow = new TextFlow();
txtFlow = TextConverter.importToFlow( poem, TextConverter.PLAIN_TEXT_FORMAT );
txtFlow.flowComposer = new StandardFlowComposer();
letContainerFixContent();
}
private function letContainerFixContent():void{
var poemContainer:Sprite = new Sprite();
poemContainer.x = 30;
poemContainer.y = 30;
stage.addChild( poemContainer );
var controller:ContainerController = new ContainerController(poemContainer, 300, 100);
controller.verticalScrollPolicy = flashx.textLayout.container.ScrollPolicy.OFF;
txtFlow.flowComposer.addController( controller );
txtFlow.flowComposer.compose();
var times:int = 0;
while(txtFlow.flowComposer.findControllerIndexAtPosition(txtFlow.textLength-1)<0){
var newheight:int = controller.compositionHeight + 20;
controller.setCompositionSize(controller.compositionWidth,newheight);
txtFlow.flowComposer.compose();
trace(times++);
if(times>100){
break;
}
}
txtFlow.flowComposer.updateAllControllers();
}
}
}
2.自动生成多个固定大小的容器,来匹配文字内容
package
{
import flash.display.Graphics;
import flash.display.Sprite;
import flash.geom.Rectangle;
import flash.text.engine.TextLine;
import flashx.textLayout.compose.StandardFlowComposer;
import flashx.textLayout.compose.TextFlowLine;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.elements.FlowLeafElement;
import flashx.textLayout.elements.ParagraphElement;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.events.CompositionCompleteEvent;
public class AutoIncreamentContainer_example extends Sprite {
private var txtFlow:TextFlow;
private const poem:String = "Sonnet 18\n" +
"Shall I compare thee to a summer's day?\n" +
"Thou art more lovely and more temperate:\n" +
"Rough winds do shake the darling buds of May,\n" +
"And summer's lease hath all too short a date:\n" +
"Sometime too hot the eye of heaven shines,\n" +
"And often is his gold complexion dimmed,\n" +
"And every fair from fair sometime declines,\n" +
"By chance, or nature's changing course untrimmed:\n" +
"But thy eternal summer shall not fade,\n" +
"Nor lose possession of that fair thou ow'st,\n" +
"Nor shall death brag thou wand'rest in his shade,\n" +
"When in eternal lines to time thou grow'st,\n" +
"So long as men can breathe or eyes can see,\n" +
"So long lives this, and this gives life to thee.\n" +
"William Shakespeare\n";
public function AutoIncreamentContainer_example()
{
txtFlow = new TextFlow();
txtFlow = TextConverter.importToFlow( poem, TextConverter.PLAIN_TEXT_FORMAT );
txtFlow.flowComposer = new StandardFlowComposer();
txtFlow.addEventListener(CompositionCompleteEvent.COMPOSITION_COMPLETE, compositionCompleteHandler);
addContainer();
}
private var containerCount:int = 0;
private function addContainer():void{
trace("addContainer:"+containerCount+"\n");
var poemContainer:Sprite = new Sprite();
poemContainer.x = 30;
poemContainer.y = 30 + containerCount*110;
stage.addChild( poemContainer );
var controller:ContainerController = new ContainerController(poemContainer, 300, 100);
controller.verticalScrollPolicy = flashx.textLayout.container.ScrollPolicy.OFF;
containerCount ++;
txtFlow.flowComposer.addController( controller );
txtFlow.flowComposer.compose();
if(txtFlow.flowComposer.findControllerIndexAtPosition(txtFlow.textLength-1)<0){
trace("add container");
addContainer();
}else{
txtFlow.flowComposer.updateAllControllers();
}
}
private function compositionCompleteHandler(event:CompositionCompleteEvent):void {
trace("ControllerIndex:"+txtFlow.flowComposer.findControllerIndexAtPosition(txtFlow.textLength-1));
}
}
}