Tworzenie i wyświetlanie tekstu

Flash Player 10 i nowsze wersje, Adobe AIR 1.5 i nowsze wersje

Klasy składające się na mechanizm Flash Text Engine umożliwiają tworzenie, formatowanie tekstu i sterowanie nim. Następujące klasy są podstawowymi elementami składowymi służącymi do tworzenia i wyświetlania tekstu w mechanizmie Flash Text Engine:

  • TextElement/GraphicElement/GroupElement — zawierają treść instancji TextBlock.

  • ElementFormat — określa atrybuty formatowania treści instancji TextBlock.

  • TextBlock — generator akapitów tekstu.

  • TextLine — wiersz tekstu utworzony z obiektu TextBlock.

Aby wyświetlić tekst, należy utworzyć obiekt TextElement na podstawie obiektu String, używając obiektu ElementFormat do określenia parametrów formatowania. Obiekt TextElement należy przypisać do właściwości content obiektu TextBlock. Wiersze tekstu do wyświetlania tworzy się, wywołując metodę TextBlock.createTextLine() . Metoda createTextLine() zwraca obiekt TextLine zawierający taką część ciągu, jaka zmieści się w podanej szerokości. Należy wywoływać metodę wielokrotnie, dopóki cały łańcuch nie zostanie podzielony na wiersze. Gdy nie ma już więcej wierszy do utworzenia, właściwość textLineCreationResult obiektu TextBlock otrzymuje wartość: TextLineCreationResult.COMPLETE . Aby wyświetlić wiersze, należy dodać je do listy wyświetlania (z odpowiednimi wartościami pozycji x i y ).

Poniższy przykładowy kod wykorzystuje te klasy FTE do wyświetlenia napisu "Hello World! This is Flash Text Engine!" z domyślnymi ustawieniami formatowania i czcionki. W tym prostym przykładzie tworzony jest tylko jeden wiersz tekstu.

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; 
        } 
    } 
}

Parametry metody createTextLine() określają wiersz, od którego ma się rozpocząć nowy wiersz, oraz szerokość wiersza w pikselach. Wiersz, od którego ma się rozpocząć nowy wiersz, to zazwyczaj poprzedni wiersz, jednak w przypadku pierwszego wiersza odpowiedni parametr ma wartość null .

Dodawanie obiektów GraphicElement i GroupElement

Istnieje możliwość przypisania obiektu GraphicElement do obiektu TextBlock w celu wyświetlenia obrazu lub elementu graficznego. Wystarczy utworzyć instancję klasy GraphicElement na podstawie grafiki lub obrazu i przypisać tę instancję do właściwości TextBlock.content . Wiersz tekstu należy utworzyć w zwykły sposób, wywołując metodę TextBlock.createTextline() . W poniższym przykładzie tworzone są dwa wiersze tekstu, jeden z obiektem GraphicElement i jeden z obiektem 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; 
        } 
    } 
}
Istnieje możliwość utworzenia obiektu GroupElement grupującego obiekty TextElement, GraphicElement i inne elementy GroupElement. Obiekt GroupElement można przypisać do właściwości content obiektu TextBlock. Parametr konstruktora GroupElement() jest obiektem Vector wskazującym na elementy tekstowe, graficzne i grupy składające się na daną grupę. Poniższy przykład grupuje dwa elementy graficzne i element tekstowy, a następnie przypisuje je do bloku tekstowego jako jeden obiekt.
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; 
        } 
    } 
}

Zastępowanie tekstu

Można zastąpić tekst w instancji klasy TextBlock, wywołując metodę TextElement.replaceText() w celu zastąpienia tekstu w obiekcie TextElement przypisanym do właściwości TextBlock.content .

W poniższym przykładzie użyto metody replaceText() do wstawienia tekstu na początku wiersza, dołączenia tekstu na końcu wiersza i zastąpienia tekstu pośrodku wiersza.
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); 
        } 
    } 
}

Metoda replaceText() zastępuje tekst określony przez parametry beginIndex i endIndex tekstem określonym przez parametr newText . Jeśli wartości parametrów beginIndex i endIndex są równe, metoda replaceText() wstawia określony tekst we wskazanym miejscu. W przeciwnym razie zastępuje nowym tekstem znaki określone przez indeksy beginIndex i endIndex .