About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • May

    7

    一般情况下,在 Flash 中我们使用最常见 TextField 对象(最传统的文本引擎)进行文字排版处理,TextField 允许开发者通过 CSS 样式设置文本的版式。在 CSS 样式说明中,可以查到通过 text-align 属性值设置为 justify (text-align: justify;)即可实现左右对齐,但实际上开发者们往往会发现这个属性值在应用到中文文字的排版中时,它往往是没有任何效果的(包括很多网页开发者其实也是一样的)。

    这是因为 text-align: justify;这个设置是通过对重置空格的大小实现的,所以这个属性和值只对英文文字的版式有效果,因为英文单词是通过空格来间隔的,而纯中文的中文字符排版时它们之间往往是没有任何空格字符的,所以它往往是没有效果的,除非在中文字符或标点字符里面混入一些空格,以便让 text-align: justify; 这个属性值发挥作用。

    从 FlashPlayer 10 开始提供了全新的文本引擎(FTE,其中 TLF 就是基于 FTE 的包装类),并且还提供了 JustificationStyle  类用于控制避头尾法则(所谓的避头尾法则,其实就是指一些特殊的字符是不能出现在行首或行尾的,最常见的像逗号,句号等不能出现行首的)。以下为 FTE 样例代码:

    import flash.text.engine.*;
    import flash.display.Sprite;

    var str:String = "地球虽然是圆的,可北极只有一个,当东半球从南向北夸过北极时继续前行时,就是西半球的从北向南了。如果一个人一直往北走,他最后只能走到北极,不可能走到南极去。一个简单而容易让人出错的问题。就如指南针到了地磁北极之后,它的指针N极应该是偏向下的,指向地面的。在北极的极点上,没有北面,任何一个方向都是南面;同样,南极的极点上没有南面,任何一个方向都是指向北面的。";
    var format:ElementFormat = new ElementFormat();
    format.fontSize = 12;
    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);

    function createLines(textBlock:TextBlock):void
    {
     var yPos = 20;
     var textLineWidth:int = 180;
     var textLine:TextLine = textBlock.createTextLine(null,textLineWidth);
     while (textLine)
     {
      addChild(textLine);
      textLine.x = 15;
      yPos +=  textLine.textHeight + 8;
      textLine.y = yPos;
      textLine = textBlock.createTextLine(textLine,textLineWidth);
     }
    }