Sterowanie tekstem

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

Mechanizm FTE udostępnia nowy zestaw elementów sterujących formatowaniem do obsługi wyrównania i odstępów między znakami (kerningu i światła). Istnieją także właściwości służące do sterowania sposobem podziałów wierszy i ustawiania znaczników tabulacji w wierszach.

Wyrównywanie tekstu

Justowanie tekstu powoduje, że wszystkie wiersze w akapicie mają te samą długość, poprzez dopasowanie odstępów między wyrazami, a niekiedy także między literami. W efekcie tekst jest wyrównany po obu stronach, ale odstępy między wyrazami i literami nie są stałe. Justowanie często stosuje się do tekstu w publikacjach prasowych.

Właściwość lineJustfication klasy SpaceJustifier umożliwia sterowaniem justowaniem wierszy w bloku tekstu. Klasa LineJustification definiuje stałe, których można używać do określania opcji justowania: ALL_BUT_LAST powoduje justowanie wszystkich wierszy tekstu oprócz ostatniej; ALL_INCLUDING_LAST powoduje justowanie całego tekstu, łącznie z ostatnim wierszem; UNJUSTIFIED , czyli opcja domyślna, pozostawia tekst bez justowania.

Aby wyjustować tekst, należy przypisać właściwości lineJustification instancję klasy SpaceJustifier i przypisać tą instancję do właściwości textJustifier instancji klasy TextBlock. Poniższy przykład ilustruje tworzenie akapitu, w którym wyjustowane są wszystkie wiersze oprócz ostatniego.

package 
{ 
    import flash.text.engine.*; 
    import flash.display.Sprite; 
 
    public class JustifyExample extends Sprite 
    {         
        public function JustifyExample() 
        { 
            var str:String = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " + 
            "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut " + 
            "enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " + 
            "aliquip ex ea commodo consequat."; 
             
            var format:ElementFormat = new ElementFormat(); 
            var textElement:TextElement=new TextElement(str,format); 
            var spaceJustifier:SpaceJustifier=new SpaceJustifier("en",LineJustification.ALL_BUT_LAST); 
             
            var textBlock:TextBlock = new TextBlock(); 
            textBlock.content=textElement; 
            textBlock.textJustifier=spaceJustifier; 
            createLines(textBlock); 
        } 
 
        private function createLines(textBlock:TextBlock):void { 
            var yPos=20; 
            var textLine:TextLine=textBlock.createTextLine(null,150); 
         
            while (textLine) { 
                addChild(textLine); 
                textLine.x=15; 
                yPos+=textLine.textHeight+2; 
                textLine.y=yPos; 
                textLine=textBlock.createTextLine(textLine,150); 
            } 
        } 
    } 
}

Aby zróżnicować zarówno odstępy między literami, jak i między wyrazami, należy przypisać właściwości SpaceJustifier.letterspacing wartość true . Włączenie odstępów między literami może ograniczyć liczbę rażąco dużych odstępów między wyrazami, które niekiedy pojawiają się przy prostym justowaniu.

Justowanie tekstu w językach wschodnioazjatyckich

Justowanie tekstu w językach wschodnioazjatyckich wymaga uwzględnienia dodatkowych uwarunkowań. Tekst może być pisany od góry do dołu, a niektóre znaki, tzw. kinsoku, nie mogą występować na początku lub na końcu wiersza. Klasa JustificationStyle definiuje następujące stałe, które określają opcje obsługi tego rodzaju znaków. PRIORITIZE_LEAST_ADJUSTMENT powoduje, że justowanie jest realizowane przez rozszerzenie albo zwężenie linii, w zależności od tego, które z tych rozwiązań przyniesie bardziej pożądany wynik. PUSH_IN_KINSOKU powoduje, że justowanie jest realizowane przez zwężenie znaku kinsoku na końcu wiersza lub rozszerzenie wiersza, jeśli znak kinsoku nie występuje lub uzyskany odstęp jest niewystarczający.

PUSH_OUT_ONLY powoduje, że justowanie jest realizowane tylko przez rozszerzenie wiersza. Aby utworzyć blok tekstu w języku azjatyckim zapisany pionowo, należy przypisać właściwości TextBlock.lineRotation wartość TextRotation.ROTATE_90 i przypisać właściwości ElementFormat.textRotation wartość domyślną TextRotation.AUTO . Przypisanie właściwości textRotation wartości AUTO powoduje, że glify w tekście pozostają ustawione pionowo, a nie obracają się wraz z wierszem. Ustawienie AUTO powoduje, że o 90 stopni w kierunku przeciwnym do ruchu wskazówek zegara obracane są tylko glify o pełnej szerokości i szerokie, zgodnie z definicją glifu w standardzie Unicode. Poniższy przykład ilustruje wyświetlenie pionowego bloku tekstu japońskiego i wyjustowanie go według opcji PUSH_IN_KINSOKU .
package 
{ 
    import flash.text.engine.*; 
    import flash.display.Stage; 
    import flash.display.Sprite; 
    import flash.system.Capabilities; 
     
    public class EastAsianJustifyExample extends Sprite 
    { 
        public function EastAsianJustifyExample() 
        { 
            var Japanese_txt:String = String.fromCharCode( 
            0x5185, 0x95A3, 0x5E9C, 0x304C, 0x300C, 0x653F, 0x5E9C, 0x30A4, 
            0x30F3, 0x30BF, 0x30FC, 0x30CD, 0x30C3, 0x30C8, 0x30C6, 0x30EC, 
            0x30D3, 0x300D, 0x306E, 0x52D5, 0x753B, 0x914D, 0x4FE1, 0x5411, 
            0x3051, 0x306B, 0x30A2, 0x30C9, 0x30D3, 0x30B7, 0x30B9, 0x30C6, 
            0x30E0, 0x30BA, 0x793E, 0x306E) 
            var textBlock:TextBlock = new TextBlock(); 
            var font:FontDescription = new FontDescription(); 
            var format:ElementFormat = new ElementFormat(); 
            format.fontSize = 12; 
            format.color = 0xCC0000; 
            format.textRotation = TextRotation.AUTO; 
            textBlock.baselineZero = TextBaseline.IDEOGRAPHIC_CENTER; 
            var eastAsianJustifier:EastAsianJustifier = new EastAsianJustifier("ja", LineJustification.ALL_BUT_LAST); 
            eastAsianJustifier.justificationStyle = JustificationStyle.PUSH_IN_KINSOKU; 
            textBlock.textJustifier = eastAsianJustifier; 
            textBlock.lineRotation = TextRotation.ROTATE_90; 
            var linePosition:Number = this.stage.stageWidth - 75; 
            if (Capabilities.os.search("Mac OS") > -1) 
                // set fontName: Kozuka Mincho Pro R 
                font.fontName = String.fromCharCode(0x5C0F, 0x585A, 0x660E, 0x671D) + " Pro R";                      
            else 
                font.fontName = "Kozuka Mincho Pro R"; 
            textBlock.content = new TextElement(Japanese_txt, format); 
            var previousLine:TextLine = null; 
             
            while (true) 
            { 
                var textLine:TextLine = textBlock.createTextLine(previousLine, 200); 
                if (textLine == null) 
                    break; 
                textLine.y = 20; 
                textLine.x = linePosition; 
                linePosition -= 25; 
                addChild(textLine);                 
                previousLine = textLine; 
            } 
        } 
    } 
}

Kerning i światło

Ustawienia kerningu i światła wpływają na odległość między znakami tworzącymi pary w bloku tekstu. Kerning steruje wzajemnym „dopasowaniem” znaków w parach, np. „WA” lub „Va”. Ustawienia kerningu określa się w obiekcie ElementFormat . Domyślnie kerning jest włączony ( Kerning.ON ) i można go wyłączyć (OFF) lub wybrać ustawienie AUTO, przy którym kerning jest stosowany tylko wówczas, gdy żaden ze znaków w parze nie jest znakiem Kanji, Hiragana, ani Katakana.

Ustawienie światła powoduje dodanie lub odjęcie ustalonej liczby pikseli między wszystkimi znakami w bloku tekstowym. Również to ustawienie określa się w obiekcie ElementFormat . Działa ono zarówno w odniesieniu do czcionek osadzonych, jak i do czcionek urządzenia. Mechanizm FTE udostępnia dwie właściwości sterujące światłem: trackingLeft , która określa liczbę pikseli dodawanych/odejmowanych z lewej strony znaku, oraz trackingRight , która określa liczbę pikseli dodawanych/odejmowanych z prawej strony. Jeśli używany jest kerning, wartość światła jest dodawana do lub odejmowana od wartości kerningu dla każdej pary znaków.

Efekty kerningu i światła
A.
Kerning.OFF

B.
TrackingRight=5, Kerning.OFF

C.
TrackingRight=-5, Kerning.OFF

D.
Kerning.ON

E.
TrackingRight=-5, Kerning.ON

F.
TrackingRight=-5, Kerning.ON

 
var ef1:ElementFormat = new ElementFormat(); 
ef1.kerning = Kerning.OFF; 
 
var ef2:ElementFormat = new ElementFormat(); 
ef2.kerning = Kerning.ON; 
ef2.trackingLeft = 0.8; 
ef2.trackingRight = 0.8; 
 
var ef3:ElementFormat = new ElementFormat(); 
ef3.trackingRight = -0.2;

Podziały wierszy przy zawijaniu tekstu

Właściwość breakOpportunity obiektu ElementFormat określa, które znaki mogą stanowić miejsce podziału tekstu między wiele wierszy. Domyślne ustawienie, BreakOpportunity.AUTO , powoduje stosowanie standardowych zasad standardu Unicode, takich jak dzielenie między wyrazami i w miejscach łączników. Ustawienie BreakOpportunity.ALL dopuszcza podziały wiersza na każdym znaku, co bywa użyteczne przy tworzeniu takich efektów, jak pisanie tekstu wzdłuż ścieżki.

var ef:ElementFormat = new ElementFormat(); 
ef.breakOpportunity = BreakOpportunity.ALL; 

Znaczniki tabulacji

Aby ustawić znaczniki tabulacji w bloku tekstowym, należy utworzyć instancje klasy TabStop. Parametry konstruktora TabStop() określają sposób wyrównania tekstu do znacznika tabulacji. Parametry te określają położenie znacznika tabulacji, a w przypadku wyrównania do separatora dziesiętnego, wartość tego separatora wyrażoną jako ciąg. Zwykle ta wartość jest kropką dziesiętną, może być jednak również przecinkiem, znakiem dolara, jena lub euro itd. Poniższy wiersz kodu tworzy znacznik tabulacji o nazwie tab1.

var tab1:TabStop = new TabStop(TabAlignment.DECIMAL, 50, ".");

Po utworzeniu znaczników tabulacji dla bloku tekstowego, należy je przypisać do właściwości tabStops instancji klasy TextBlock. Ponieważ jednak właściwości tabStops należy przypisać obiekt typu Vector, konieczne jest uprzednie utworzenie obiektu Vector i dodanie do niego znaczników tabulacji. Obiekt Vector umożliwia przypisanie zestawu znaczników tabulacji do bloku tekstowego. W poniższym przykładzie tworzona jest instancja Vector<TabStop> , a następnie jest do niej dodawany zestaw obiektów TabStop. Następnie znaczniki tabulacji są przypisywane do właściwości tabStops instancji klasy TextBlock.

var tabStops:Vector.<TabStop> = new Vector.<TabStop>(); 
tabStops.push(tab1, tab2, tab3, tab4); 
textBlock.tabStops = tabStops

Więcej informacji o obiektach Vector zawiera sekcja Praca z tablicami .

Poniższy przykład ilustruje działanie poszczególnych opcji wyrównania znaczników tabulacji.

package { 
     
    import flash.text.engine.*; 
    import flash.display.Sprite; 
     
    public class TabStopExample extends Sprite 
    { 
        public function TabStopExample() 
        { 
            var format:ElementFormat = new ElementFormat(); 
            format.fontDescription = new FontDescription("Arial"); 
            format.fontSize = 16; 
     
            var tabStops:Vector.<TabStop> = new Vector.<TabStop>();     
            tabStops.push( 
                new TabStop(TabAlignment.START, 20), 
                new TabStop(TabAlignment.CENTER, 140), 
                new TabStop(TabAlignment.DECIMAL, 260, "."), 
                new TabStop(TabAlignment.END, 380)); 
            var textBlock:TextBlock = new TextBlock(); 
            textBlock.content = new TextElement( 
                "\tt1\tt2\tt3\tt4\n" +         
                "\tThis line aligns on 1st tab\n" +         
                "\t\t\t\tThis is the end\n" + 
                "\tThe following fragment centers on the 2nd tab:\t\t\n" + 
                "\t\tit's on me\t\t\n" + 
                "\tThe following amounts align on the decimal point:\n" + 
                "\t\t\t45.00\t\n" + 
                "\t\t\t75,320.00\t\n" + 
                "\t\t\t6,950.00\t\n" + 
                "\t\t\t7.01\t\n", format); 
     
            textBlock.tabStops = tabStops; 
            var yPosition:Number = 60; 
            var previousTextLine:TextLine = null; 
            var textLine:TextLine; 
            var i:int; 
            for (i = 0; i < 10; i++) { 
                textLine = textBlock.createTextLine(previousTextLine, 1000, 0); 
                textLine.x = 20; 
                textLine.y = yPosition; 
                addChild(textLine);      
                yPosition += 25; 
                previousTextLine = textLine; 
            } 
        } 
    } 
}