Styra text

Flash Player 10 och senare, Adobe AIR 1.5 och senare

Med FTE får du en ny uppsättning kontroller för textformatering som hanterar justering och mellanrum mellan tecken (kerning och spårning). Det finns även egenskaper som styr hur rader bryts och hur tabbstopp ställs in på rader.

Justera text

När du justerar text får alla rader i ett stycke samma längd genom att avståndet mellan ord och ibland även mellan bokstäver justeras. Resultatet är att texten justeras på båda sidorna medan mellanrummen mellan ord och bokstäver varierar. Textkolumner i tidningar och tidskrifter är ofta justerade.

Med egenskapen lineJustfication i klassen SpaceJustifier kan du reglera justeringen av rader i ett textblock. Klassen LineJustification definierar konstanter som du kan använda för att ange ett justeringsalternativ: ALL_BUT_LAST justerar alla textrader utom den sista, ALL_INCLUDING_LAST justerar alla textrader inklusive den sista och UNJUSTIFIED (standardvärdet) justerar inte texten.

Om du vill justera text ska du ställa in egenskapen lineJustification på en instans av klassen SpaceJustifier och tilldela instansen till egenskapen textJustifier i en TextBlock-instans. I exemplet nedan skapas ett stycke i vilket alla textrader utom den sista är justerade.

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

Ställ in egenskapen SpaceJustifier.letterspacingtrue om du vill variera mellanrummet mellan bokstäverna samt mellanrummet mellan orden. Om mellanrum mellan bokstäver aktiveras kan fula mellanrum mellan ord elimineras som ibland kan inträffa med enkel justering.

Justera östasiatisk text

Det finns flera saker som du måste överväga när östasiatisk text justeras. Texten kan skrivas uppifrån och ned och vissa tecken, som kallas kinsoku, kan inte uppträda i början eller slutet av en rad. Klassen JustificationStyle definierar följande konstanter som anger alternativ hur sådana tecken hanteras. Med PRIORITIZE_LEAST_ADJUSTMENT justeras texten genom att raden expanderas eller komprimeras beroende på vilket som ger bäst resultat. Med PUSH_IN_KINSOKU justeras texten genom att raden komprimeras om det finns kinsoku i slutet av den och raden expanderas om kinsoku inte finns eller om utrymmet är otillräckligt.

Med PUSH_OUT_ONLY justeras texten genom att raden expanderas. Om du vill skapa ett block vertikal asiatisk text ska du ställa in egenskapen TextBlock.lineRotationTextRotation.ROTATE_90 och egenskapen ElementFormat.textRotationTextRotation.AUTO som är standardvärdet. När egenskapen textRotation ställs in på AUTO, förblir glyferna i texten vertikala i stället för att vändas på sidan när raden roteras. Inställningen AUTO roterar endast breda glyfer och glyfer med full bredd 90 grader moturs så som anges av glyfens Unicode-egenskaper. I exemplet nedan visas ett vertikalt block med japansk text och texten justeras med alternativet 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 och spärra/knip

Kerning och spårning påverkar mellanrummet mellan närliggande teckenpar i ett textblock. Kerning styr hur teckenpar ”passas ihop”, t.ex. paren ”WA” och ”Va”. Kerning ställs in i objektet ElementFormat. Det är aktiverat som standard (Kerning.ON) och kan ställas in på OFF eller AUTO, i vilket fall kerning bara tillämpas mellan tecken som inte är Kanji, Hiragana eller Katakana.

Spårning lägger till eller tar bort ett visst antal pixlar mellan alla tecken i ett textblock och det ställs också in i objektet ElementFormat. Det fungerar med både inbäddade teckensnitt och enhetsteckensnitt. FTE har stöd för två spårningsegenskaper, trackingLeft som lägger till/tar bort pixlar från tecknets vänstra sida, och trackingRight som lägger till/tar bort från tecknets högra sida. Om kerning ska användas, läggs spårningsvärdet till eller dras av kerningvärdena för varje teckenpar.

Kerning- och spårningseffekter
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;

Radbrytning för figursatt text

Egenskapen breakOpportunity i objektet ElementFormat avgör vilka tecken som kan användas för brytning när figursatt text bryts upp i flera rader. Standardvärdet, BreakOpportunity.AUTO, använder Unicode standardegenskaper, t.ex. brytning mellan ord och bindestreck. Med BreakOpportunity.ALL kan vilket tecken som helst behandlas som en plats för eventuell radbrytning, vilket är praktiskt om du t.ex. vill skapa en effekt av text som slingrar sig längs en stig.

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

Tabbstopp

När du vill ange tabbstopp i ett textblock ska du definiera tabbstoppen genom att skapa instanser av klassen TabStop. Parametrarna för konstruktorn TabStop() anger hur text justeras med tabbstoppet. Parametrarna anger positionen för tabbstoppet och för decimaljusteringen, värdet som används för justering, uttryckt som en sträng. I vanliga fall är värdet en decimalpunkt, men det kan även vara ett komma, ett dollartecken, eller symbolen för yen eller euro till exempel. Koden nedan skapar ett tabbstopp kallat tab1.

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

När du har skapat tabbstoppen för textblocket ska du tilldela dem till egenskapen tabStops i en TextBlock-instans. Eftersom egenskapen tabStops kräver en vektor, ska du först skapa en vektor och sedan lägga till tabbstoppen. Med vektorn kan du tilldela en uppsättning tabbstopp till textblocket. Exemplet nedan skapar en Vector<TabStop>-instans och lägger till en uppsättning TabStop-objekt i den. Sedan tilldelas tabbstoppen till egenskapen tabStops i en TextBlock-instans.

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

Mer information om vektorer finns i Arbeta med arrayer.

Exemplet nedan visar effekten av de olika justeringsalternativen för tabbstopp.

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