Formatting text
A TextBlock
object is a factory for creating lines of text. The content of a
TextBlock
is assigned via the TextElement
object. An ElementFormat
object
handles the formatting for the text. The ElementFormat class defines such
properties as baseline alignment, kerning, tracking, text rotation, and font
size, color, and case. It also includes a FontDescription
, which is covered in
detail in Working with fonts.
Using the ElementFormat object
The constructor for the ElementFormat
object takes any of a long list of
optional parameters, including a FontDescription
. You can also set these
properties outside the constructor. The following example shows the relationship
of the various objects in defining and displaying a simple text line:
package
{
import flash.display.Sprite;
import flash.text.*;
public class ElementFormatExample extends Sprite
{
private var tb:TextBlock = new TextBlock();
private var te:TextElement;
private var ef:ElementFormat;
private var fd:FontDescription = new FontDescription();
private var str:String;
private var tl:TextLine;
public function ElementFormatExample()
{
fd.fontName = "Garamond";
ef = new ElementFormat(fd);
ef.fontSize = 30;
ef.color = 0xFF0000;
str = "This is flash text";
te = new TextElement(str, ef);
tb.content = te;
tl = tb.createTextLine(null,600);
addChild(tl);
}
}
}
Font color and transparency (alpha)
The color
property of the ElementFormat
object sets the font color. The
value is an integer representing the RGB components of the color; for example,
0xFF0000 for red and 0x00FF00 for green. The default is black (0x000000).
The alpha
property sets the alpha transparency value for an element (both
TextElement
and GraphicElement
). Values can range from 0 (fully transparent)
to 1 (fully opaque, which is the default). Elements with an alpha
of 0 are
invisible, but still active. This value is multiplied by any inherited alpha
values, thus making the element more transparent.
var ef:ElementFormat = new ElementFormat();
ef.alpha = 0.8;
ef.color = 0x999999;
Baseline alignment and shift
The font and size of the largest text in a line determine its dominant baseline.
You can override these values by setting TextBlock.baselineFontDescription
and
TextBlock.baselineFontSize
. You can align the dominant baseline with one of
several baselines within the text. These baselines include the ascent line and
the descent line or the ideographic top, center, or bottom.
A. Ascent
B. Baseline
C. Descent
D. x-height
In the ElementFormat
object, three properties determine baseline and alignment
characteristics. The alignmentBaseline
property sets the main baseline of a
TextElement
or GraphicElement
. This baseline is the "snap-to" line for the
element, and it's to this position that the dominant baseline of all text
aligns.
The dominantBaseline
property specifies which of the various baselines of the
element to use, which determines the vertical position of the element on the
line. The default value is TextBaseline.ROMAN
, but it can also be set to have
the IDEOGRAPHIC_TOP
or IDEOGRAPHIC_BOTTOM
baselines be dominant.
The baselineShift
property moves the baseline by a set number of pixels on the
y-axis. In normal (non-rotated) text, a positive value moves the baseline down
and a negative value moves it up.
Typographic Case
The TypographicCase
property of ElementFormat
specifies text case, such as
uppercase, lowercase, or small caps.
var ef_Upper:ElementFormat = new ElementFormat();
ef_Upper.typographicCase = TypographicCase.UPPERCASE;
var ef_SmallCaps:ElementFormat = new ElementFormat();
ef_SmallCaps.typographicCase = TypographicCase.SMALL_CAPS;
Rotating text
You can rotate a block of text or the glyphs within a segment of text in increments of 90°. The TextRotation class defines the following constants for setting both text block and glyph rotation:
Constant | Value | Description |
---|---|---|
AUTO | "auto" | Specifies 90 degree counter-clockwise rotation. Typically used with vertical Asian text to rotate only glyphs that require rotation. |
ROTATE_0 | "rotate_0" | Specifies no rotation. |
ROTATE_180 | "rotate_180" | Specifies 180 degree rotation. |
ROTATE_270 | "rotate_270" | Specifies 270 degree rotation. |
ROTATE_90 | "rotate_90" | Specifies 90 degree clockwise rotation. |
To rotate the lines of text in a text block, set the TextBlock.lineRotation
property before calling the TextBlock.createTextLine()
method to create the
text line.
To rotate the glyphs within a block of text or a segment, set the
ElementFormat.textRotation
property to the number of degrees that you want the
glyphs to rotate. A glyph is the shape that makes up a character, or a part of a
character that consists of multiple glyphs. The letter "a" and the dot on an
"i", for example, are glyphs.
Rotating glyphs is relevant in some Asian languages in which you want to rotate the lines to vertical but not rotate the characters within the lines. For more information on rotating Asian text, see Justifying East Asian text.
Here is an example of rotating both a block of text and the glyphs within, as you would with Asian text. The example also uses a Japanese font:
package
{
import flash.display.Sprite;
import flash.text.*;
public class RotationExample extends Sprite
{
private var tb:TextBlock = new TextBlock();
private var te:TextElement;
private var ef:ElementFormat;
private var fd:FontDescription = new FontDescription();
private var str:String;
private var tl:TextLine;
public function RotationExample()
{
fd.fontName = "MS Mincho";
ef = new ElementFormat(fd);
ef.textRotation = TextRotation.AUTO;
str = "This is rotated Japanese text";
te = new TextElement(str, ef);
tb.lineRotation = TextRotation.ROTATE_90;
tb.content = te;
tl = tb.createTextLine(null,600);
addChild(tl);
}
}
}
Locking and cloning ElementFormat
When an ElementFormat
object is assigned to any type of ContentElement
, its
locked
property is automatically set to true
. Attempting to modify a locked
ElementFormat
object throws an IllegalOperationError
. The best practice is
to fully define such an object before assigning it to a TextElement
instance.
If you want to modify an existing ElementFormat
instance, first check its
locked
property. If it's true
, use the clone()
method to create an
unlocked copy of the object. The properties of this unlocked object can be
changed, and it can then be assigned to the TextElement
instance. Any new
lines created from it have the new formatting. Previous lines created from this
same object and using the old format are unchanged.
package
{
import flash.display.Sprite;
import flash.text.*;
public class ElementFormatCloneExample extends Sprite
{
private var tb:TextBlock = new TextBlock();
private var te:TextElement;
private var ef1:ElementFormat;
private var ef2:ElementFormat;
private var fd:FontDescription = new FontDescription();
public function ElementFormatCloneExample()
{
fd.fontName = "Garamond";
ef1 = new ElementFormat(fd);
ef1.fontSize = 24;
var str:String = "This is flash text";
te = new TextElement(str, ef);
tb.content = te;
var tx1:TextLine = tb.createTextLine(null,600);
addChild(tx1);
ef2 = (ef1.locked) ? ef1.clone() : ef1;
ef2.fontSize = 32;
tb.content.elementFormat = ef2;
var tx2:TextLine = tb.createTextLine(null,600);
addChild(tx2);
}
}
}