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