Flash Player 10 和更高版本,Adobe AIR 1.5 和更高版本

文本布局框架模型

文本布局框架模型的主要数据结构为文本流层次,它是在元素包中定义的。在该结构中,可以使用格式包为文本串指定样式和属性,也可以使用转换包控制在模型中如何导入和导出文本。

文本流层次

该模型使用层次树来表示文本。树中的每个节点都是元素包中定义的类的实例。例如,树的根节点始终是 TextFlow 类的实例。TextFlow 类表示整个文本素材。文章是文本的集合,可将其视为一个单元或流。一篇文章可能需要使用多个列或文本容器进行显示。

除了根节点,其余元素大致基于 XHTML 元素。例如,层次的根节点只能有两种类型的子节点:DivElement 类型和 ParagraphElement 类型。DivElements 和 ParagraphElements 类似于 XHTML <div/> 和 <p/> 元素。从定义上讲,DivElements 的范围比 XHTML <div/> 元素窄得多。DivElements 仅可包含 ParagraphElements 和 DivElements,而 XHTML <div/> 元素可以包含更多种类的元素,其中包括实际文本。幸运的是,系统将在导入过程中为您自动处理这个差别。作为 <div/> XHTML 元素的直接子代的文本在导入期间会转换为 ParagraphElement 以及包含该文本的子 SpanElement。

ParagraphElement 与 DivElement 类似,也将对无法直接包含文本或图形的元素进行分组。但是,ParagraphElement 可以包含四种类型的确实直接包含基本文本和图形的子元素:

  • SpanElement 类表示共享常见格式设置的文本串。

  • InlineGraphicElement 类表示视为文本行中单个字符的图形元素。

  • LinkElement 类表示超文本链接,与 XHTML <a/> 元素类似。链接可以包含一个或多个 SpanElements、InlineGraphicElement 或 TCYElements。

  • TCYElement 类表示与行的其余部分垂直对齐的短文本串。它们通常是垂直文本行中的小的水平文本串。例如,您将使用 TCYElement 来表示日文字符串中的水平数字串,该日文字符串中的其它部分沿垂直方向。TCYElement 可以包含一个或多个 SpanElement。

下图显示了框架模型的层次。了解该层次是使用该框架成功进行编程的重要基础。

TextFlow 层次

了解模型的结构在处理文本布局框架标记时也很有用。TLF 标记是作为文本布局框架一部分的文本的 XML 表示形式。虽然该框架也支持其它 XML 格式,但 TLF 标记是唯一专门基于 TextFlow 层次的结构。如果您使用此标记格式从 TextFlow 导出 XML,则导出 XML 时会保持此层次的完整性。

注: 文本流层次与从面向对象的编程 (OOP) 范例的继承层次不同。文本流层次中的所有类从名为 FlowElement 的类直接派生或间接派生。此继承层次独立于模型的文本流层次。

FlowElement 格式

格式包中包含一些接口和类,使用这些接口和类,您可以为文本流层次树中的任何 FlowElement 指定格式。可通过两种方式应用格式设置。您可以分别指定某特定格式,也可以利用特殊格式设置对象同时指定一组格式。

ITextLayoutFormat 接口包含可以应用于 FlowElement 的所有格式。有些格式应用于文本的某一完整容器或段落,但不会在逻辑上应用于各个字符。例如,字距调整和制表符这样的格式应用于全部段落,但不应用于各个字符。

使用“属性”为 FlowElement 分配格式

您可以通过属性分配对任何 FlowElement 设置格式。FlowElement 类实现 ITextLayoutFormat 接口,因此 FlowElement 类的任一子类也必须实现该接口。此要求意味着文本流层次中的任何元素都包含与 ITextLayoutFormat 接口定义的格式相对应的属性。

例如,以下代码显示如何为 ParagraphElement 实例指定单个格式:

var p:ParagraphElement = new ParagraphElement(); 
p.fontSize = 18; 
p.fontFamily = "Arial";

使用 TextLayoutFormat 类为 FlowElement 分配格式

您可以使用 TextLayoutFormat 类向 FlowElement 应用格式。可使用此类创建包含所需的所有格式设置值的特定格式设置对象。然后,将该对象指定给任何 FlowElement 对象的 format 属性。TextLayoutFormat 和 FlowElement 都实现 ITextLayoutFormat 类。这种安排确保两个类都包含同样的格式属性。

首先,创建 TextLayoutFormat 类的实例来存储格式设置信息。以后可以将该格式设置对象指定给任意一个 FlowElement 实例:

var fmt:TextLayoutFormat = new TextLayoutFormat(); 

然后,为 TextLayoutFormat 属性指定值,以反映要为文本设置的样式。TextLayoutFormat 类包含几十个属性,可对应常见的样式(例如,字体大小和边距)。

fmt.fontSize = 18; 
fmt.fontFamily = "Arial";

第三,将该 TextLayoutFormat 对象指定给 FlowElement 的格式属性:

var p:ParagraphElement = new ParagraphElement(); 
p.format = fmt;

在设置 format 属性的值后,可将 TextLayoutFormat 对象的当前状态应用到 FlowElement。如果稍后更改 TextLayoutFormat 对象,FlowElement 中不会反映这些更改,除非重新分配它。

如果在 FlowElement 上设置属性,然后应用格式,则 TextLayoutFormat 对象上的值将替换所有属性。如果未在 TextLayoutFormat 对象上设置属性,则 undefined 将替换这些属性。以下示例导致 p.textIndent 设置为 undefined
p.textIndent = 15; 
var fmt:TextLayoutFormat = new TextLayoutFormat(); 
fmt.fontSize = 18; // Note this does NOT set the value of the textIndent property 
p.format = fmt;

格式继承

格式继承与文本流层次一致。如果将 TextLayoutFormat 的实例指定给带有子代的 FlowElement 实例,框架将启动一个称为级联的过程。在级联过程中,框架递归检查从您的 FlowElement 继承的层次中的每个节点。然后,它确定是否将继承的值指定给各格式设置属性。在级联过程中应用下列规则:

  1. 属性值只从直接祖先(有时称为父代)继承。

  2. 仅当属性尚未设置值(即该值为 undefined)时,才继承属性值。。

  3. 一些属性在未定义时不继承值,除非将属性的值设置为“继承”或常量 flashx.textLayout.formats.FormatValue.INHERIT

例如,如果在 TextFlow 级别设置 fontSize 值,则该设置将应用于 TextFlow 中的所有元素。换句话说,这些值按照文本流层次向下级联。不过,您可以通过直接对给定元素指定新值来覆盖该元素中的值。举个反例,如果您在 TextFlow 级别设置 backgroundColor 值,TextFlow 的子项不继承该值。backgroundColor 属性不是级联期间从其父项继承的。通过将每一子项中的 backgroundColor 属性设置为 flashx.textLayout.formats.FormatValue.INHERIT,可以覆盖此行为。

格式继承和指定(直接指定及通过格式设置对象指定)的交叉可能导致意外的结果。对 FlowElement 指定 TextLayoutFormat 对象可覆盖以前设置的任何值。进行这种覆盖时不考虑以前的值如何设置。例如,如果直接使用 SpanElement 的 fontSize 属性指定 SpanElement 的 fontSize 值,随后创建一个 TextLayoutFormat 对象并将该对象指定给 SpanElement 的 format 属性,则 SpanElement 将采用 TextLayoutFormat 对象中的 fontSize 值。这非常重要,因为 TextLayoutFormat 对象的各个属性的默认值都是 undefined。如果您忘记设置 TextLayoutFormat 对象的 fontSize 属性,则可能会意外更改 SpanElement 的字体大小。下例显示的是此情况的示例,在该例中,通过指定 TextLayoutFormat 对象将 fontSize 属性设置为 undefined

var span:SpanElement = new SpanElement(); 
span.text = "Hello, World"; 
span.fontSize = 48; 
var ca:TextLayoutFormat = new TextLayoutFormat(); 
ca.fontFamily = "Helvetica"; 
span.format = ca;

指定 TextLayoutFormat 对象会将 fontSize 的值重置为 undefined,这意味着该值现在继承自祖先元素。要保持 fontSize 属性的值,请将 SpanElement 的现有 TextLayoutFormat 对象作为参数发送给 TextLayoutFormat 的构造函数:

var span:SpanElement = new SpanElement(); 
span.text = "Hello, World"; 
span.fontSize = 48; 
var fmt:TextLayoutFormat = new TextLayoutFormat(span.format); 
fmt.fontFamily = "Helvetica"; 
span.format = fmt;

导入和导出文本

使用转换包,可在文本布局框架中导入和导出文本。如果打算在运行时加载文本,请使用此包,而不是将文本编译到 SWF 文件中。您也可以使用此包来将存储在 TextFlow 实例中的文本导出到一个字符串或 XML 对象。

导入和导出过程都直接完成。可以调用 export() 方法或 importToFlow() 方法,这两个方法都属于 TextConverter 类。这两个方法都是静态方法,意味着您对 TextConverter 类调用这两个方法,而非对 TextConverter 类的实例调用它们。

转换包允许您选择文本存储位置,在这方面提供了极大的灵活性。例如,如果将文本存储在数据库中,您可以将文本导入该框架中供显示。然后,您可以使用编辑包更改文本并将更改后的文本导回到您的数据库。

导入文本

文本布局框架可以导入纯文本、简单 HTML 文本或文本布局标记格式的 XML。

要导入纯文本,请使用 importToFlow() 静态方法中的第二个参数指定该格式。在以下示例中,将纯文本指定为 importToFlow() 方法的第二个参数,并省略可选的第三个参数:

var text:String = "Hello World, this is plain text"; 
var tf:TextFlow = TextConverter.importToFlow(text, TextConverter.PLAIN_TEXT_FORMAT);

HTML 导入支持旨在匹配 TextField 类提供的简单 HTML 支持。例如,以下代码导入一段简单的 HTML 文本:

var hyperText:String = "<p><span>Hello, World</span></p>"; 
var tf:TextFlow = TextConverter.importToFlow(hyperText, TextConverter.HTML_FORMAT);

文本布局标记是文本布局框架中存储的文本的 XML 表示形式。XML 会对流层次的结构进行镜像,并为该框架支持的文本和格式设置提供最高的保真度。要导入文本布局标记格式的文本,可将 TextConverter.TEXT_LAYOUT_FORMAT 指定为 importToFlow() 方法的第二个参数,如以下示例所示:

var markup:XML = <TextFlow><p><span>Hello, World</span></p></TextFlow>; 
var tf:TextFlow = TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT);

导出文本

文本布局框架还可以将文本导出为以下四种格式之一:纯文本、HTML、FXG 或文本布局标记。要从现有 TextFlow 实例导出,可调用 TextConverter.export() 方法。

export() 方法包含三个必需参数和一个可选参数。第一个参数是您要从中导出的 TextFlow 实例。第二个参数是要应用于导出文本的三种格式(纯文本、FXG 或文本布局标记)之一。第三个参数用于指定导出文本的数据类型。可以选择 String 类型或 XML 类型。第四个参数即最后一个参数是可选的,用于指定 ImportExportConfiguration 类的实例。

以下示例导入纯文本格式的字符串,并将该字符串导出为文本布局标记格式的 XML 对象:

var ptext:String = "Hello, World"; 
var flow:TextFlow = TextConverter.importToFlow(ptext, TextConverter.PLAIN_TEXT_FORMAT); 
var out:XML = TextConverter.export(flow, TextConverter.TEXT_LAYOUT_FORMAT, 
                                ConversionType.XML_TYPE );

文本布局框架标记

文本布局框架标记使 TextFlow 中的文本具有高保真表示形式,因为标记语言不仅为每个 TextFlow 层次的基本元素提供标签,而且为可用于 TextLayoutFormat 类的所有格式设置属性提供属性。

下表包含可以在 TLF 标记中使用的标签。

元素

说明

子代

textflow

标记的根元素。

div、p

TextFlow

div

TextFlow 内的分割块。可以包含一组段落。

div、p

DivElement

p

段落。可以包含以下行中所列的任何元素。

a、tcy、span、img、tab、br

ParagraphElement

a

链接。

tcy、span、img、tab、br

LinkElement

tcy

水平文本串(通常用于垂直的 TextFlow 中)。

a、span、img、tab、br

TCYElement

span

段落内的文本串。

 

SpanElement

img

段落中的图像。

 

InlineGraphicElement

选项卡

制表符字符。

 

TabElement

br

分隔符。用于在段落内结束一行;文本在下一行中继续,仍位于同一段落中。

 

BreakElement

linkNormalFormat

定义用于处于正常状态的链接的格式属性。

 

TextLayoutFormat

linkActiveFormat

在链接上按下鼠标时,定义用于处于活动状态的链接的格式属性。

 

TextLayoutFormat

linkHoverFormat

当鼠标位于链接边界内时(滚过),定义用于处于悬停状态的链接的格式属性。

 

TextLayoutFormat

格式设置属性位于 TextLayoutFormat 类中,可作为 XML 属性直接指定给元素标签。例如,在以下文本布局框架标记中,整个 TextFlow 的 fontSize14。第二个段落是蓝色的,但最后的 SpanElement 除外。最后一个 SpanElement 是红色的,因为最后一个 SpanElement 中的颜色属性覆盖了层次结构中其父级的颜色属性。

<TextFlow xmlns="http://ns.adobe.com/textLayout/2008" fontSize="14"> 
    <p>This is an example of Text Layout Framework Markup.</p> 
    <p color="#0000ff"> 
        <span>This is the first span of the second paragraph.</span> 
        <span color="#ff0000">This is the second span of the second                                         paragraph.</span> 
    </p> 
</TextFlow>;

您也可以使用格式标签创建一个命名格式设置属性集,其行为类似于 TextLayoutFormat 类的实例。在以下示例中,将名为“English”的命名属性集应用到一段行内文本。

<TextFlow xmlns="http://ns.adobe.com/textLayout/2008" fontSize="14"> 
    <format id="English" locale="en" fontFamily="Minion Pro"/> 
    <p paragraphSpaceAfter="15"><span>This is supposed to use the default font</span></p> 
    <p paragraphSpaceAfter="15"><span format="English">This is supposed to be in Minion Pro via a named format</span></p> 
    <p><span fontFamily="Minion Pro">This is supposed to be in Minion Pro via a fontFamily attribute</span></p> 
</TextFlow>

如果同时使用命名集和通过直接指定元素标签来设置属性,则应用直接指定的值。