Форматирование текста

Flash Player 10 и более поздних версий, Adobe AIR 1.5 и более поздних версий

Объект TextBlock является основой для создания строк текста. Содержимое объекта TextBlock задается с помощью объекта TextElement. Объект ElementFormat обрабатывает форматирование текста. Класс ElementFormat определяет такие свойства, как выравнивание базовой линии, кернинг, трекинг, поворот текста, а также размер, цвет и регистр шрифта. Он также включает класс FontDescription, который подробно описывается в главе Работа со шрифтами.

Использование объекта ElementFormat

Конструктор объекта ElementFormat принимает любой из многочисленных дополнительных параметров, включая FontDescription. Эти свойства можно задать и за пределами конструктора. В следующем примере демонстрируются отношения различных объектов в ходе определения и отображения простой текстовой строки.

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

Цвет и прозрачность (альфа) шрифта

Свойство color объекта ElementFormat задает цвет шрифта. Это значение является целым числом, представляющим RGB-компоненты цвета; например, 0xFF0000 для красного цвета, а 0x00FF00 — для зеленого. По умолчанию используется значение «черный» (0x000000).

Свойство alpha задает значение альфа-прозрачности для элемента (как для TextElement, так и для GraphicElement). Диапазон допустимых значений: от 0 (полностью прозрачный) до 1 (полностью непрозрачный, используется по умолчанию). Элементы, у которых свойство alpha имеет значение 0, являются невидимыми, но активными. Это значение умножается на унаследованные альфа-значения, в результате чего элемент становится более прозрачным.

var ef:ElementFormat = new ElementFormat(); 
ef.alpha = 0.8; 
ef.color = 0x999999; 

Выравнивание и смещение базовой линии

Доминантная базовая линия определяется по шрифту и размеру самого крупного текста в строке. Эти значения можно переопределить, задав свойства TextBlock.baselineFontDescription и TextBlock.baselineFontSize. Доминантную базовую линию можно выровнять по одной из нескольких базовых линий текста. К таким базовым линиям относятся линии верхних и нижних выносных элементов или идеографические верхняя, центральная и нижняя линии.

Текст с изображением линии верхних выносных элементов, базовой линии, линии нижних выносных элементов и высотой х
A.
Линия верхних выносных элементов

Б.
Базовая линия

В.
Линия нижних выносных элементов

Г.
Высота х

В объекте ElementFormat базовую линию и характеристики выравнивания определяют три свойства. Свойство alignmentBaseline задает основную базовую линию объекта TextElement или GraphicElement. Это линия, к которой «привязывается» элемент. Именно по этой линии выравнивается доминантная базовая линия всего текста.

Свойство dominantBaseline определяет, какая из нескольких базовых линий элемента должна использоваться для определения вертикальной позиции элемента в строке. По умолчанию используется значение TextBaseline.ROMAN, но доминантной базовой линией можно также назначить линию IDEOGRAPHIC_TOP или IDEOGRAPHIC_BOTTOM.

Свойство baselineShift перемещает базовую линию на заданное число пикселов по оси Y. В стандартном тексте (без поворота) положительное значение перемещает базовую линию вниз, а отрицательное — вверх.

Типографский регистр

Свойство TypographicCase объекта ElementFormat указывает регистр текста, например верхний, нижний регистр или капитель.

 
var ef_Upper:ElementFormat = new ElementFormat(); 
ef_Upper.typographicCase = TypographicCase.UPPERCASE; 
 
var ef_SmallCaps:ElementFormat = new ElementFormat(); 
ef_SmallCaps.typographicCase = TypographicCase.SMALL_CAPS; 

Поворот текста

Блок текста или глифы в сегменте текста можно поворачивать с шагом 90°. Класс TextRotation определяет следующие константы для настройки поворота текстового блока или глифа:

Константа

Значение

Описание

AUTO

auto

Задает поворот на 90 градусов против часовой стрелки. Обычно используется с вертикальным восточным текстом для поворота отдельных глифов.

ROTATE_0

rotate_0

Задает отсутствие поворота.

ROTATE_180

rotate_180

Задает поворот на 180 градусов.

ROTATE_270

rotate_270

Задает поворот на 270 градусов.

ROTATE_90

rotate_90

Задает поворот на 90 градусов по часовой стрелке.

Для поворота строк в текстовом блоке необходимо установить свойство TextBlock.lineRotation перед вызовом метода TextBlock.createTextLine() для создания строки текста.

Для поворота глифов в блоке или сегменте текста требуется установить свойство ElementFormat.textRotation на требуемое число градусов для поворота глифов. Глиф — это фигура, образующая символ, или часть символа, состоящего из нескольких глифов. Например, глифами являются буква «a» и точка над символом «i».

Поворот глифов применяется в некоторых восточных языках, в которых требуется сделать горизонтальные строки вертикальными, не поворачивая символы в строках. Дополнительные сведения о повороте восточного текста см. в разделе Выравнивание восточно-азиатского текста.

Ниже приводится пример поворота блока текста и содержащихся в нем глифов для восточных языков. В примере также используется японский шрифт.

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

Блокировка и клонирование ElementFormat

При назначении объекта ElementFormat любому типу ContentElement его свойство locked автоматически получает значение true. При попытке изменить заблокированный объект ElementFormat возвращается ошибка IllegalOperationError. Лучше всего дать полное определение такому объекту, прежде чем назначать его экземпляру TextElement.

Если требуется изменить существующий экземпляр ElementFormat, сначала нужно проверить значение свойства locked. Если оно имеет значение true, используйте метод clone() для создания незаблокированной копии объекта. Свойства такого незаблокированного объекта можно изменить, и после этого назначить его экземпляру TextElement. Новые строки, созданные из этого объекта, будут иметь новое форматирование. Предыдущие строки, созданные из этого же объекта с использованием старого формата, остаются без изменений.

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