创建和显示文本

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

组成 Flash 文本引擎的类可用于创建文本、设置文本格式以及控制文本。下面的类是通过 Flash 文本引擎创建和显示文本时所用的基本构造块:

  • TextElement/GraphicElement/GroupElement:包含 TextBlock 实例的内容

  • ElementFormat:指定 TextBlock 实例内容的格式设置属性

  • TextBlock:用于构建文本段落的工厂

  • TextLine:依据 TextBlock 创建的文本行

要显示文本,可从字符串创建一个 TextElement 对象,使用 ElementFormat 对象指定格式设置特征。将 TextElement 分配给 TextBlock 对象的 content 属性。通过调用 TextBlock.createTextLine() 方法创建将要显示的文本行。createTextLine() 方法返回一个 TextLine 对象,该对象包含的字符串长度与将适合的指定宽度相同。重复调用此方法,直到整个字符串格式设置为行。当没有更多的行要创建时,TextBlock 对象的 textLineCreationResult 属性将分配值:TextLineCreationResult.COMPLETE。要显示行,请将它们添加到显示列表(xy 的位置值要适当)。

例如,以下代码使用这些 FTE 类显示“Hello World!This is Flash Text Engine!”,显示时使用默认的格式和字体值。在此简单示例中,仅创建了一行文本。

package 
{ 
    import flash.text.engine.*; 
    import flash.display.Sprite; 
     
    public class HelloWorldExample extends Sprite 
    { 
        public function HelloWorldExample() 
        { 
            var str = "Hello World! This is Flash Text Engine!"; 
            var format:ElementFormat = new ElementFormat(); 
            var textElement:TextElement = new TextElement(str, format); 
            var textBlock:TextBlock = new TextBlock(); 
            textBlock.content = textElement; 
             
            var textLine1:TextLine = textBlock.createTextLine(null, 300); 
            addChild(textLine1); 
            textLine1.x = 30; 
            textLine1.y = 30; 
        } 
    } 
}

createTextLine() 的参数指定新行从哪一行开始,以及新行的宽度(单位为像素)。新行通常从前一行开始,但如果新行是第一行,则为 null

添加 GraphicElement 和 GroupElement 对象

可以将 GraphicElement 对象分配给 TextBlock 对象以显示图像或图形元素。直接从图形或图像创建一个 GraphicElement 类的实例,然后将该实例分配给 TextBlock.content 属性。按照常规的方法调用 TextBlock.createTextline() 来创建文本行。下面的示例创建两个文本行,一个用 GraphicElement 对象创建,另一个用 TextElement 对象创建。
package 
{ 
    import flash.text.engine.*; 
    import flash.display.Sprite; 
    import flash.display.Shape; 
    import flash.display.Graphics; 
 
    public class GraphicElementExample extends Sprite 
    { 
        public function GraphicElementExample() 
        { 
            var str:String = "Beware of Dog!"; 
     
            var triangle:Shape = new Shape(); 
            triangle.graphics.beginFill(0xFF0000, 1); 
            triangle.graphics.lineStyle(3); 
            triangle.graphics.moveTo(30, 0); 
            triangle.graphics.lineTo(60, 50); 
            triangle.graphics.lineTo(0, 50); 
            triangle.graphics.lineTo(30, 0); 
            triangle.graphics.endFill(); 
     
            var format:ElementFormat = new ElementFormat(); 
            format.fontSize = 20; 
             
            var graphicElement:GraphicElement = new GraphicElement(triangle, triangle.width, triangle.height, format); 
            var textBlock:TextBlock = new TextBlock(); 
            textBlock.content = graphicElement; 
            var textLine1:TextLine = textBlock.createTextLine(null, triangle.width); 
            textLine1.x = 50; 
            textLine1.y = 110; 
            addChild(textLine1); 
     
            var textElement:TextElement = new TextElement(str, format); 
            textBlock.content = textElement; 
            var textLine2 = textBlock.createTextLine(null, 300); 
            addChild(textLine2); 
            textLine2.x = textLine1.x - 30; 
            textLine2.y = textLine1.y + 15; 
        } 
    } 
}
您可以创建 GroupElement 对象,以创建一组 TextElement 对象、GraphicElement 对象和其他 GroupElement 对象。GroupElement 可以分配给 TextBlock 对象的 content 属性。GroupElement() 构造函数的参数是一个 Vector,它指向构成组的文本、图形以及组元素。下面的示例将两个图形元素和一个文本元素组成一组,然后将它们作为一个单元分配给某个文本块。
package 
{ 
    import flash.text.engine.*; 
    import flash.display.Sprite; 
    import flash.display.Shape; 
    import flash.display.Graphics; 
     
    public class GroupElementExample extends Sprite 
    { 
        public function GroupElementExample() 
        { 
            var str:String = "Beware of Alligators!"; 
 
            var triangle1:Shape = new Shape(); 
            triangle1.graphics.beginFill(0xFF0000, 1); 
            triangle1.graphics.lineStyle(3); 
            triangle1.graphics.moveTo(30, 0); 
            triangle1.graphics.lineTo(60, 50); 
            triangle1.graphics.lineTo(0, 50); 
            triangle1.graphics.lineTo(30, 0); 
            triangle1.graphics.endFill(); 
             
            var triangle2:Shape = new Shape(); 
            triangle2.graphics.beginFill(0xFF0000, 1); 
            triangle2.graphics.lineStyle(3); 
            triangle2.graphics.moveTo(30, 0); 
            triangle2.graphics.lineTo(60, 50); 
            triangle2.graphics.lineTo(0, 50); 
            triangle2.graphics.lineTo(30, 0); 
            triangle2.graphics.endFill(); 
             
            var format:ElementFormat = new ElementFormat(); 
            format.fontSize = 20; 
            var graphicElement1:GraphicElement = new GraphicElement(triangle1, triangle1.width, triangle1.height, format); 
            var textElement:TextElement = new TextElement(str, format); 
            var graphicElement2:GraphicElement = new GraphicElement(triangle2, triangle2.width, triangle2.height, format); 
            var groupVector:Vector.<ContentElement> = new Vector.<ContentElement>(); 
            groupVector.push(graphicElement1, textElement, graphicElement2); 
            var groupElement = new GroupElement(groupVector); 
            var textBlock:TextBlock = new TextBlock(); 
            textBlock.content = groupElement; 
            var textLine:TextLine = textBlock.createTextLine(null, 800); 
            addChild(textLine); 
            textLine.x = 100; 
            textLine.y = 200; 
        } 
    } 
}

替换文本

您可以调用 TextElement.replaceText() 来替换您分配给 TextBlock.content 属性的 TextElement 中的文本,从而替换 TextBlock 实例中的文本。

以下示例首先使用 replaceText() 在行首插入文本,然后在行尾追加文本,最后在行的中间位置替换文本。
package 
{ 
    import flash.text.engine.*; 
    import flash.display.Sprite; 
 
    public class ReplaceTextExample extends Sprite 
    { 
        public function ReplaceTextExample() 
        { 
     
            var str:String = "Lorem ipsum dolor sit amet"; 
            var fontDescription:FontDescription = new FontDescription("Arial"); 
            var format:ElementFormat = new ElementFormat(fontDescription); 
            format.fontSize = 14; 
            var textElement:TextElement = new TextElement(str, format); 
            var textBlock:TextBlock = new TextBlock(); 
            textBlock.content = textElement; 
            createLine(textBlock, 10); 
            textElement.replaceText(0, 0, "A text fragment: ");  
            createLine(textBlock, 30);  
            textElement.replaceText(43, 43, "...");   
            createLine(textBlock, 50);     
            textElement.replaceText(23, 28, "(ipsum)"); 
            createLine(textBlock, 70); 
        } 
             
        function createLine(textBlock:TextBlock, y:Number):void { 
            var textLine:TextLine = textBlock.createTextLine(null, 300); 
            textLine.x = 10; 
            textLine.y = y; 
            addChild(textLine); 
        } 
    } 
}

replaceText() 方法将 beginIndexendIndex 参数指定的文本替换为 newText 参数指定的文本。如果 beginIndexendIndex 参数的值相同,replaceText() 将在相应的位置插入指定的文本。否则,将用新文本替换 beginIndexendIndex 所指定的字符。