Control del texto

Flash Player 10 y posterior, Adobe AIR 1.5 y posterior

FTE ofrece un nuevo conjunto de controles de formato del texto para controlar la justificación y el espaciado (ajuste y espaciado entre caracteres). También existen propiedades para controlar si hay lí­neas rotas y para establecer tabulaciones dentro de las líneas.

Justificación del texto

Si se justifica el texto, se proporciona la misma longitud a todas las lí­neas de un párrafo ajustando el espaciado entre las palabras y, a veces, entre las letras. El efecto consiste en alinear el texto a ambos lados, mientras que se varía el espaciado entre las palabras y las letras. Las columnas de texto de los periódicos y las revistas suelen estar justificadas.

La propiedad lineJustfication de la clase SpaceJustifier permite controlar la justificación de las líneas de un bloque de texto. La clase LineJustification define constantes que se pueden usar para especificar una opción de justificación: ALL_BUT_LAST justifica todas las lí­neas de texto excepto la última; ALL_INCLUDING_LAST justifica todo el texto, incluyendo la última línea; UNJUSTIFIED , que es el valor predeterminado, deja el texto sin justificar.

Para justificar texto, establezca la propiedad lineJustification en una instancia de la clase SpaceJustifier y asigne dicha instancia a la propiedad textJustifier de una instancia de TextBlock. En el ejemplo siguiente se crea un párrafo en el que todas las líneas de texto están justificadas, excepto la última.

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

Para modificar el espaciado entre las letras y entre las palabras, la propiedad SpaceJustifier.letterspacing se establece en true . Activando el espaciado entre las letras se puede reducir la aparición de antiestéticos espacios entre las palabras, lo que a veces ocurre con la justificación simple.

Justificación de texto asiático

La justificación de textos en idiomas de Extremo Oriente implica otras consideraciones. Se puede escribir de arriba a abajo y algunos caracteres, conocidos como kinsoku, no pueden aparecer al principio o al final de una línea. La clase JustificationStyle define las siguientes constantes, que especifican las opciones para gestionar estos caracteres. PRIORITIZE_LEAST_ADJUSTMENT basa la justificación en expandir o comprimir la lí­nea, dependiendo de qué opción ofrece el resultado más deseable. PUSH_IN_KINSOKU basa la justificación en la compresión kinsoku al final de la línea o su aumento si no hay kinsoku o si el espacio es insuficiente.

PUSH_OUT_ONLY basa la justificación en expandir la lí­nea. Para crear un bloque de texto asiático vertical, establezca la propiedad TextBlock.lineRotation en TextRotation.ROTATE_90 y la propiedad ElementFormat.textRotation en TextRotation.AUTO , que es el valor predeterminado. Si la propiedad textRotation se establece en AUTO , los pictogramas del texto se mantienen en vertical en lugar de girarse sobre un lado cuando se rota la línea. El valor AUTO rota 90 grados en sentido contrario al de las agujas del reloj solo los pictogramas de anchura completa y los anchos, según lo determinen las propiedades Unicode del pictograma. El ejemplo siguiente muestra un bloque vertical de texto en japonés y lo justifica utilizando la opción 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; 
            } 
        } 
    } 
}

Ajuste y espaciado entre caracteres

El ajuste y espaciado entre caracteres afectan a la distancia existente entre pares adyacentes de caracteres de un bloque de texto. Con el ajuste entre caracteres se controla cómo se "ajustan" entre sí­ los pares de caracteres como, por ejemplo, "WA" o "Va". El ajuste entre caracteres se establece en el objeto ElementFormat . Se encuentra activado de forma predeterminada ( Kerning.ON ) y se puede establecer en OFF o en AUTO, en cuyo caso el espaciado manual solo se aplica entre los caracteres si ninguno de ellos es Kanji, Hiragana o Katakana.

Con el espaciado entre caracteres se añade o retira un número determinado de pí­xeles entre todos los caracteres de un bloque de texto y también se establece en el objeto ElementFormat . Funciona tanto con fuentes de dispositivo como incorporadas. FTE admite dos propiedades de espaciado entre caracteres, trackingLeft , que añade o retira pí­xeles por el lado izquierdo de un carácter, y trackingRight , que los añade o retira por el lado derecho. Cuando se utiliza el ajuste entre caracteres, el valor de espaciado se añade o se resta de los valores de ajuste para cada par de caracteres.

Efectos del ajuste y espaciado entre caracteres
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;

Saltos de línea para texto ajustado

La propiedad breakOpportunity del objeto ElementFormat determina qué caracteres se pueden usar para realizar el salto de lí­nea cuando el texto ajustado ocupa varias lí­neas. La configuración predeterminada, BreakOpportunity.AUTO , utiliza propiedades estándar de Unicode como, por ejemplo, dividir las lí­neas entre palabras o cuando hay guiones. Con el uso de BreakOpportunity.ALL cualquier carácter se puede tratar como oportunidad de salto de línea, lo que resulta útil para crear efectos como texto distribuido a lo largo de un trazado.

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

Tabulaciones

Para establecer tabulaciones en un bloque de texto, dichas tabulaciones se definen creando instancias de la clase TabStop. Los parámetros pasados al constructor TabStop() especifican cómo se alinea el texto con respecto a la tabulación. Estos parámetros especifican la posición de la tabulación y, para la alineación decimal, el valor respecto al que realizarla, expresado como una cadena. Normalmente, este valor es un punto decimal, pero también podr­á ser una coma, un símbolo de dólar o el sí­mbolo del yen o el euro, por ejemplo. La siguiente línea de código crea una tabulación denominada tab1.

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

Una vez creadas las tabulaciones para un bloque de texto, se asignan a la propiedad tabStops de una instancia de TextBlock. Debido a que la propiedad tabStops requiere un vector, primero debe crearse un vector y después añadirle las tabulaciones. El vector permite asignarle un juego de tabulaciones al bloque de texto. En el siguiente ejemplo se crea una instancia de Vector<TabStop> y se añade un conjunto de objetos TabStop. A continuación se asignan las tabulaciones a la propiedad tabStops de una instancia de TextBlock.

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

Para obtener más información sobre los vectores, consulte Trabajo con conjuntos .

El ejemplo siguiente muestra los efectos que se obtienen con las distintas opciones de alineación de 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; 
            } 
        } 
    } 
}