利用TextLayout实现自动匹配内容的单个容器和多个容器自动匹配内容的两个例子

Silver 撰写  

最近工作需要,对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));
		}
	}
}

发表评论

你必须在 登录 后才能发表评论.