|
Flash Player 10 和更高版本,Adobe AIR 1.5 和更高版本 文本布局框架视图文本存储在模型后,视图就可以显示它。必须将流层次定义的模型中存储的文本转换为 Flash Player 可以显示的格式。文本布局框架提供了两种方法来创建流中的显示对象:一种是适合显示静态文本的简单方法,另一种是允许选择和编辑文本的较复杂方法。使用这两种方法,文本最终都会转换为 TextLine 类的实例,TextLine 类保存在 Flash Player 10 中的 flash.text.engine 包中。 利用 TextFlowTextLineFactory 显示内容此简单方法使用 TextFlowTextLineFactory 类,该类位于 flashx.textLayout.factory 包中。此方法不仅简单,比 FlowComposer 方法占用的内存也少。建议对不需要用户编辑、选择或滚动的静态文本使用此方法。 TextFlowTextLineFactory 类提供了一种名为 createTextLines() 的方法,该方法可以将文本从 TextFlow 实例转换为一系列准备好进行显示的 TextLine 实例。使用此方法只需完成四个步骤。首先,创建 TextFlowTextLineFactory 类的实例。接下来,创建一个作为文本定界框的矩形实例并对其指定 compositionBounds 属性。第三步,创建一个回调函数,它在 createTextLines() 方法创建每个 TextLine 实例后调用。该回调函数必须将 TextLine 实例添加到 Flash Player 显示列表中。第四步,调用 createTextLines() 方法,使用的两个参数为:您的回调函数的名称和 TextFlow 实例的名称。以下示例演示如何使用 TextFlowTextLineFactory 类显示字符串“Hello, World”: package {
import flash.display.Sprite;
import flash.text.engine.TextLine;
import flash.geom.Rectangle;
import flashx.textLayout.elements.ParagraphElement;
import flashx.textLayout.elements.SpanElement;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.factory.TextFlowTextLineFactory;
public class TextFlowTextLineFactoryExample extends Sprite
{
public function TextFlowTextLineFactoryExample()
{
// create the TextFlow and FlowElements
var myFlow:TextFlow = new TextFlow();
var para:ParagraphElement = new ParagraphElement();
var span:SpanElement = new SpanElement();
span.text = "Hello, World";
para.addChild(span);
myFlow.addChild(para);
// create an instance of the TextFlowTextLineFactory class
var factory:TextFlowTextLineFactory = new TextFlowTextLineFactory();
// create a bounding rectangle
factory.compositionBounds = new Rectangle(0,0,300,100);
// call createTextLines()
factory.createTextLines(callback, myFlow);
}
// create a callback function
private function callback(txLine:TextLine):void {
addChild(txLine);
}
}
}
使用流编写器显示内容如果您要加大对文本显示的控制程度(而不是由 TextFlowTextLineFactory 提供的控制程度),请使用流书写器。例如,通过使用流书写器,您的用户可以选择和编辑文本。流编写器是 flashx.textLayout.compose 包中 StandardFlowComposer 类的实例,该实例对象不仅管理将 TextFlow 转换为 TextLine 实例的操作,而且管理将这些 TextLine 实例放置到一个或多个容器中。 每个 TextFlow 实例都有一个可实现 IFlowComposer 接口的相应对象。可以通过 TextFlow.flowComposer 属性访问此 IFlowComposer 对象。可以通过此属性调用 IFlowComposer 接口定义的方法,这些方法允许您将文本与一个或多个容器关联并准备好要在容器内显示的文本。 注: 框架中当前只有一个类(即 StandardFlowComposer)实现了 IFlowComposer 接口。现在,TextFlow.flowComposer 属性或为 null,或指向 StandardFlowComposer 实例。以后会将同样能实现 IFlowComposer 的新类添加到框架中。
容器是 Sprite 类(该类是 DisplayObjectContainer 类的子类)的实例。这两个类都包含在 Flash Player 显示列表 API 中。如果您不熟悉 Flash Player 显示列表,可将 DisplayObjectContainer 视为具有 Flash Player 可呈现格式的对象的容器。 容器是定界矩形的更高级形式,与 TextLineFactory 类一起使用。与定界矩形类似,容器定义显示 TextLine 实例的区域。与定界矩形不同的是,容器有对应的“控件”对象,可用来控制一个容器或一组容器的滚动、链接、格式设置乃至事件处理。 此增强功能(例如高级格式设置、合成边界和滚动选项)存储在控制器对象中并由控制器对象管理。每个容器有一个对应的控制器对象,该对象是 flashx.textLayout.container 包中 ContainerController 类的实例。 在填充 TextFlow 并准备在屏幕上显示它时,创建一个控制器对象来管理容器并将其与流书写器关联。关联容器之后,编写文本以使文本能显示出来。相应地,容器有两种状态:编写和显示。编写是将文本流层次中的文本转换为 TextLine 实例并计算这些实例是否适合容器的过程。显示是更新 Flash Player 显示列表的过程。 例如,以下代码创建一个名为 myFlow 的 TextFlow 实例和一个用于显示该实例的控制器对象。创建控制器对象后,必须将它与 TextFlow 的 flowComposer 属性相关联。最后,调用 updateAllContainers() 方法来编写文本和更新显示列表。 // import necessary classes import flashx.textLayout.container.*; import flashx.textLayout.compose.*; import flashx.textLayout.elements.TextFlow; import flashx.textLayout.conversion.TextConverter; // first, create a TextFlow instance named myFlow var markup:XML = <TextFlow><p><span>Hello, World</span></p></TextFlow>; var myFlow:TextFlow = TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT); // second, create a controller // the first parameter, this, must point to a DisplayObjectContainer // the last two parameters set the initial size of the container in pixels var contr:ContainerController = new ContainerController(this, 600, 600); // third, associate it with the flowComposer property myFlow.flowComposer.addController(contr); // fourth, update the display list myFlow.flowComposer.updateAllContainers(); |
|