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

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