Опубликован: 23.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт
Лекция 11:

Компоненты: готовые и "самодельные"

Настройка параметров текста и цветов скинов

Во Flash MX есть независимый от типов компонентов набор свойств (в неоднозначных случаях будем их также называть свойствами скинов), вся совокупность которых полностью формирует цвет скина и параметры текста компонентов. (Здесь надо иметь в виду, что эти свойства не являются свойствами классов компонентов ; все они записаны в специальном объекте - или нескольких объектах - типа FStyleFormat.) Например, свойство " face " определяет цвет заливки основной части компонентов, свойство " background " - цвет подложки контрола, а свойство " textBold " - нужно ли использовать жирный шрифт в качестве основного шрифта для компонентов. Полный список свойств вы найдете в online-документации в описании свойств объекта FStyleFormat. Замечательное удобство состоит в том, что эти свойства можно изменить всем компонентам одновременно (можно, правда, сделать это и выборочно). Подчеркнем еще раз, что рассматриваемые свойства не зависят от типа компонента, они работают для всех компонентов Flash MX. Такая концепция позволяет довольно легко настроить цвет скина и параметры текста для него, не задумываясь над тем, какие именно компоненты используются в вашем ролике, а какие - нет. Сейчас мы опишем подробно, каким образом эти возможности реализованы и как правильно ими пользоваться.

Сначала рассмотрим настройку цвета. Визуальное представление компонента образовано множеством мелких элементов, которые в зависимости от текущих параметров компонента (в частности, его размеров, формы и текущего состояния) тем или иным образом размещаются на экране, растягиваются, меняют прозрачность и т.д. Все эти мелкие элементы мы будем называть элементами скина. Это название хорошо тем, что оно акцентирует внимание на важном факте: скин может быть перекрашен или вовсе изменен, хотя сам компонент останется тем же самым. Итак, чтобы поддерживать централизованное перекрашивание, каждый элемент скина регистрируется специальным образом (в стандартных компонентах это, разумеется, уже сделано). При регистрации указывается, на изменение какого именно свойства будет реагировать данный элемент. Регистрация производится с помощью вызова registerSkinElement в символах, группирующих элементы скинов. Объясним подробнее, что это за специальные символы.

Группирующие символы - это символы, которые объединяют в себе несколько элементов скинов по некоему признаку, чаще по состоянию компонента - скажем, кнопка нажата, отключена ( disabled ) и пр. В самом компоненте уже лежат не элементы скинов, а группирующие символы.

Например, в группирующем символе fsb_downArrow (он лежит в библиотеке в папке Flash UI Components / Component Skins / FScrollBar skins - только вытащите на сцену компонент ScrollBar или любой другой, его использующий, а не то этих папок в библиотеке не будет) вы увидите такой код:

var component = _parent _parent;
//...
component.registerSkinElement(arrow_mc, "arrow");
component.registerSkinElement(face_mc, "face");
component.registerSkinElement(shadow_mc, "shadow");
component.registerSkinElement(darkshadow_mc, "darkshadow");
component.registerSkinElement(highlight_mc, "highlight");
component.registerSkinElement(highlight3D_mc, "highlight3D");

Таким образом, например, экземпляр клипа fsb_downArrow_arrow, лежащий в группирующем символе fsb_downArrow и называющийся arrow_mc, регистрируется в содержащем его компоненте для реакции на свойство скина " arrow ". Отметим, что механизм регистрации элементов скина требует, чтобы сам компонент был унаследован от базового класса стандартных компонентов Flash MX - FUIComponent.

Итак, регистрации элементов скина вполне достаточно, чтобы они реагировали на попытки изменить их цвет (что можно сделать несколькими способами, о чем мы расскажем далее). А что нужно для того, чтобы текст внутри компонентов реагировал на сигналы об изменении его формата? Здесь кроме наследования компонента от FUIComponent нужно, чтобы текст выводился при помощи стандартного блока, являющегося составной частью всех стандартных компонентов, содержащих в себе текст. Этот блок называется FLabel. Когда компонент (наследник FUIComponent ) оповещают об изменении некоторого свойства формата (это всегда заканчивается вызовом метода setStyleProperty, о котором далее), он первым делом проверяет, не начинается ли имя свойства со слова text. Если да - он (внутри метода setStyleProperty ) отбрасывает от имени свойства этот начальный фрагмент и получается имя свойства объекта TextFormat (легко проверить, что между свойствами объектов FStyleFormat и TextFormat имеется такое соответствие). В результате метод setStyleProperty имеет возможность сформировать объект TextFormat, который затем будет применен к текстовому полю внутри FLabel. Если же имя свойства не начинается со слова text, то делается вывод, что передается информация о цвете элементов скина, зарегистрированных на это свойство.

Мы с вами рассмотрели, какие действия предпринимаются внутри компонента для того, чтобы он воспринимал сигналы об изменении формата. Подчеркнем, что вам это все нужно будет проделывать только в том случае, если вы пишете собственный компонент. А стандартные компоненты Flash MX уже готовы реагировать на ваши воздействия.

Перечислим теперь три различных (хотя и родственных) способа воздействия на формат скина.

Способ 1. Использование setStyleProperty.

У каждого компонента есть метод setStyleProperty (этот метод определен в базовом классе всех компонентов Flash MX - FUIComponent ). Синтаксис метода следующий:

setStyleProperty (property, value);

Например: myComboBox1.setStyleProperty ("face", "0xFF0000");

Способ 2. Использование собственных объектов FStyleFormat.

Во Flash MX есть класс FStyleFormat, назначение объектов которого - переопределять некоторые свойства скинов. Затем вы можете подписать на сообщения об изменении объекта класса FStyleFormat какие-то компоненты, которые будут реагировать на изменения свойств скинов в этих объектах.

Подписаться можно так:

fstyleFormatObject.addListener (someComponent);

А отменить подписку - так:

fstyleFormatObject.removeListener (someComponent);

Для того чтобы изменения свойства в объекте FStyleFormat отразились на всех подписанных компонентах, нужно вызывать applyChanges, которой передается либо имя свойства скина, которое нужно обновить, либо ничего, тогда обновляются все свойства:

fstyleFormatObject.applyChanges(propertyName)

или

fstyleFormatObject.applyChanges();

Пример.

fs = new FStyleFormat(); // создаем объект FStyleFormat
fs.addListener (cmb2);	// подписываем на этот объект существующий 
        						// комбобокс с именем cmb2
fs.face = 0xFF0000;	//меняем цвет основной части компонента
fs.applyChanges();	//инициируем изменение

Способ 3. Использование globalStyleFormat.

Во Flash MX существует предопределенный объект класса FStyleFormat, на который по умолчанию подписаны все компоненты (но от него можно отписаться).

Пример.

globalStyleFormat.removeListener(cmb1);
globalStyleFormat.face = 0x00FF00;
globalStyleFormat.textBold = true;
globalStyleFormat.applyChanges();

Как мы уже говорили, даже в последних двух случаях (когда компонент подписан на сообщения об изменении формата) после вызова applyChanges у компонентов все равно в конце концов вызываются именно методы setStyleProperty для соответствующих свойств.

Если вы хотите узнать больше о методе setStyleProperty и о классе FStyleFormat, вы можете посмотреть код, описывающий их (и ряд родственных им вещей) в клипе FUIComponent (вам нужен фрагмент начиная со строки 196 и до самого конца кода в первом кадре). Найти этот клип можно так: если вы вытащили на сцену хотя бы один компонент из панели Components, то в вашей библиотеке есть папка Flash UI Components. Внутри нее открываем папку Core Assets - Developer Only, а в ней - папку FUI Component Class Tree. В ней и лежит компонент FUIComponent, обеспечивающий базовую функциональность всех стандартных компонентов Flash MX.

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет