控制文本

Flash Player 10 和更高版本,Adobe AIR 1.5 和更高版本

FTE 提供了一组新的文本格式控件,用以处理对齐和字符间距(字距调整和间距)。还有一些属性可用于控制各行断开方式以及在行中设置 Tab 停靠位。

对齐文本

通过调整单词之间(有的时候是字母之间)的间距,对齐文本能让段落中各行的长度相等。其效果是文本两端对齐,而单词和字母之间的间距发生变化。报刊杂志中的文本栏通常是对齐的。

SpaceJustifier 类中的 lineJustfication 属性可用于控制文本块中各行的对齐情况。LineJustification 类定义了可用于指定对齐选项的常量:ALL_BUT_LAST 对齐除文本最后一行之外的所有各行;ALL_INCLUDING_LAST 对齐所有文本,包括最后一行;UNJUSTIFIED 是默认值,保持文本的不对齐状态。

若要对齐文本,请将 lineJustification 属性设置为 SpaceJustifier 类的实例,并将该实例指派给 TextBlock 实例的 textJustifier 属性。下面的示例创建一个段落。在此段落中,除最后一行文本之外,所有各行均对齐。

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

若要更改字母以及单词之间的间距,请将 SpaceJustifier.letterspacing 属性设置为 true。应用字母间距调整功能可以减少单词间出现不美观间隙(简单对齐有时会出现这种情况)的几率。

对齐东亚文本

对齐东亚文字时,需要额外注意一些事项。东亚文字可能是从上至下书写,且某些字符(称为避头尾)不能出现在行首或行尾。JustificationStyle 类定义了以下常量,这些常量指定了用于处理这些字符的选项。PRIORITIZE_LEAST_ADJUSTMENT 通过扩展行或压缩行进行对齐,具体采用哪种方式取决于能否产生最理想的效果。PUSH_IN_KINSOKU 通过行尾压缩避头尾或扩展行(如果没有避头尾或该空间不足)进行对齐。

PUSH_OUT_ONLY 通过扩展行进行对齐。若要创建垂直的亚洲文本块,请将 TextBlock.lineRotation 属性设置为 TextRotation.ROTATE_90,并将 ElementFormat.textRotation 属性设置为 TextRotation.AUTO(默认值)。将 textRotation 属性设置为 AUTO 将使文本中的字型保持垂直,而不是在整行发生旋转的时候侧向旋转。根据字形的 Unicode 属性,AUTO 设置仅将全宽字形和宽字形逆时针旋转 90°。下面的示例显示垂直的日文文本块,并使用 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; 
            } 
        } 
    } 
}

字距调整和间距

字距调整和间距影响文本块中相邻两个字符之间的距离。字距调整控制字符对如何组合在一起,例如字符对“WA”或“Va”。字距调整在 ElementFormat 对象中设置。字距调整默认为启用 (Kerning.ON)。它可以设置为 OFF 或 AUTO,在此情形中,只有两个字符都不是日本汉字、平假名和片假名时,才在它们之间应用字距调整。

间距处理在文本块中的所有字符之间增加或减少一定数量的像素,并且也是在 ElementFormat 对象中进行设置。嵌入字体和设备字体均可使用间距处理。FTE 支持两种间距属性:trackingLeft,增加/减少字符左侧的像素;以及 trackingRight,增加/减少字符右侧的像素。如果使用间距,那么每个字符对的字距调整值将会加上或减去间距值。

字距调整和间距效果
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;

换行文本的换行符

ElementFormat 对象的 breakOpportunity 属性确定在换行文本分成多行时,哪些字符可用于断行。默认值 BreakOpportunity.AUTO 使用标准 Unicode 属性,例如在不同单词之间断行,以及在连字符的位置断行。如果使用 BreakOpportunity.ALL,那么在任何一个字符均可断行,这有助于制造某些效果(例如沿某个路径排列文本)。

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

Tab 停靠位

若要在文本块中设置 Tab 停靠位,请通过创建 TabStop 类的实例来定义 Tab 停靠位。TabStop() 构造函数的参数指定文本如何与 Tab 停靠位对齐。这些参数指定 Tab 停靠位的位置,以及对于十进制数对齐,指定要在哪个值对齐(表示为字符串)。通常,该值是小数点,但也可以是逗号、美元符号或日元或欧元符号等。下面的代码行创建一个名为 tab1 的 Tab 停靠位。

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

为一个文本块创建 Tab 停靠位之后,请将这些停靠位分配给 TextBlock 实例的 tabStops 属性。由于 tabStops 属性需要一个 Vector,首先创建一个 Vector,然后将 Tab 停靠位添加到此 Vector 中。此 Vector 允许您将一组 Tab 停靠位分配给文本块。下面的示例创建一个 Vector<TabStop> 实例,并将一组 TabStop 对象添加到其中。然后,代码将这些 Tab 停靠位分配给 TextBlock 实例的 tabStops 属性。

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

有关矢量的详细信息,请参阅使用数组

下面的示例演示每个 TabStop 对齐选项的效果。

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