FTE
gives you a new set of text formatting controls to handle justification
and character spacing (kerning and tracking). There are also properties
for controlling that way lines are broken and for setting tab stops
within lines.
Justifying text
Justifying
text makes all lines in a paragraph the same length by adjusting
the spacing between words and sometimes between letters. The effect
is to align the text on both sides, while the spacing between words
and letters varies. Columns of text in newspapers and magazines
are frequently justified.
The
lineJustfication
property in the SpaceJustifier
class allows you to control the justification of lines in a block
of text. The LineJustification class defines constants that you
can use to specify a justification option:
ALL_BUT_LAST
justifies
all but the last line of text;
ALL_INCLUDING_LAST
justifies
all text, including the last line;
UNJUSTIFIED
,
which is the default, leaves the text unjustified.
To justify text, set the
lineJustification
property
to an instance of the SpaceJustifier class and assign that instance
to the
textJustifier
property of a TextBlock instance.
The following example creates a paragraph in which all but the last
line of text is justified.
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);
}
}
}
}
To
vary spacing between letters as well as between words, set the
SpaceJustifier.letterspacing
property
to
true
. Turning on letterspacing can reduce the
occurrences of unsightly gaps between words, which can sometimes
occur with simple justification.
Justifying East Asian text
Justifying East Asian
text entails additional considerations. It can be written from top
to bottom and some characters, known as kinsoku, cannot appear at
the beginning or end of a line. The JustificationStyle class defines
the following constants, which specify the options for handling
these characters.
PRIORITIZE_LEAST_ADJUSTMENT
bases
justification on either expanding or compressing the line, depending
on which one produces the most desirable result.
PUSH_IN_KINSOKU
bases
justification on compressing kinsoku at the end of the line, or
expanding it if no kinsoku occurs, or if that space is insufficient.
PUSH_OUT_ONLY
bases justification on expanding
the line. To create a block of vertical Asian text, set the
TextBlock.lineRotation
property
to
TextRotation.ROTATE_90
and set the
ElementFormat.textRotation
property
to
TextRotation.AUTO
, which is the default. Setting
the
textRotation
property to
AUTO
causes
the glyphs in the text to remain vertical instead of turning on
their side when the line is rotated. The
AUTO
setting
rotates 90° counter-clockwise for full width and wide glyphs only,
as determined by the Unicode properties of the glyph. The following example
displays a vertical block of Japanese text and justifies it using
the
PUSH_IN_KINSOKU
option.
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 and tracking
Kerning
and tracking affect the distance between adjacent pairs of characters
in a text block. Kerning controls how character pairs “fit” together,
such as the pairs “WA” or “Va”. Kerning is set in the
ElementFormat
object.
It is enabled by default (
Kerning.ON
), and can
be set to OFF or AUTO, in which case kerning is only applied between
characters if neither is Kanji, Hiragana, or Katakana.
Tracking
adds or subtracts a set number of pixels between all characters
in a text block, and is also set in the
ElementFormat
object.
It works with both embedded and device fonts. FTE supports two tracking
properties,
trackingLeft
, which adds/subtracts
pixels from the left side of a character, and
trackingRight
,
which adds/subtracts from the right side. If kerning is being used,
the tracking value is added to or subtracted from kerning values
for each character pair.
-
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;
Line breaks for wrapped text
The
breakOpportunity
property
of the
ElementFormat
object determines which characters
can be used for breaking when wrapping text is broken into multiple
lines. The default,
BreakOpportunity.AUTO
, uses
standard Unicode properties, such as breaking between words and
on hyphens. Using
BreakOpportunity.ALL
allows any
character to be treated as a line break opportunity, which is useful
for creating effects like text along a path.
var ef:ElementFormat = new ElementFormat();
ef.breakOpportunity = BreakOpportunity.ALL;
Tab stops
To set
tab stops in a text block, define the tab stops by creating instances
of the TabStop class. The parameters to the
TabStop()
constructor
specify how the text aligns with the tab stop. These parameters
specify the position of the tab stop, and for decimal alignment,
the value on which to align, expressed as a string. Typically, this
value is a decimal point but it could also be a comma, a dollar sign,
or the symbol for the Yen or the Euro, for example. The following
line of code creates a tab stop called tab1.
var tab1:TabStop = new TabStop(TabAlignment.DECIMAL, 50, ".");
Once you've created the tab stops for a text block, assign them
to the
tabStops
property of a TextBlock instance.
Because the
tabStops
property requires a Vector,
though, first create a Vector and add the tab stops to it. The Vector
allows you to assign a set of tab stops to the text block. The following
example creates a
Vector<TabStop>
instance
and adds a set of TabStop objects to it. Then it assigns the tab
stops to the
tabStops
property of a TextBlock instance.
var tabStops:Vector.<TabStop> = new Vector.<TabStop>();
tabStops.push(tab1, tab2, tab3, tab4);
textBlock.tabStops = tabStops
For more information on Vectors, see
Working with arrays
.
The following example shows the effect of each of the TabStop
alignment options.
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;
}
}
}
}
|
|
|