
- •Оглавление
- •Вступление
- •Глава 1. Язык сценариев. ActionScript: начальные сведения
- •Проект 1: Прыгающий мяч (программная анимация)
- •1.1. Среда разработки ActionScript: настройка и приемы работы
- •1.1.1. Различие между стандартной и профессиональной версиями Flash
- •1.1.2. Панель Actions
- •1.1.3. Режим упрощенного ввода кода. Панель Behaviors
- •1.1.4. Как упростить создание кода на панели Actions
- •1.1.5. Типы сценариев
- •1.1.6. Централизация кода
- •1.1.7. Инструменты работы с кодом
- •1.1.8. Настройки стиля кода
- •1.1.9. Сохранение ActionScript-кода
- •1.1.10. Функция trace() и панель Output
- •1.1.11. Справочная информация
- •1.2. Синтаксис ActionScript
- •1.2.1. Пробельные символы
- •1.2.2. Завершение предложений
- •1.2.3. Чувствительность к регистру
- •1.2.4. Зарезервированные слова ActionScript
- •1.2.5. Принципы присвоения имен
- •1.2.6. Комментарии
- •1.3. Основные понятия
- •1.3.2. ActionScript как скриптовый язык Flash-плейера
- •1.3.3. Интерпретатор ActionScript. Flash-ассемблер
- •1.3.4. Символы и экземпляры символов
- •1.3.5. Переменные
- •1.3.6. Функции
- •1.3.7. Условные предложения
- •1.3.8. Циклы
- •1.3.9. Массивы
- •1.3.10. Объектная модель ActionScript
- •1.3.11. Свойства _root, _parent, Leveln и ключевое слово this
- •1.3.12. Области видимости кода
- •1.3.1. ЕСМА-262 как основа ActionScript
- •Глава 2. Типы данных
- •2.3. Математические функции и константы. Объект Math
- •2.3.1. Особенности реализации математических функций
- •2.3.2. Возведение в степень и вычисление квадратного корня
- •2.3.3. Экспонента и натуральный логарифм
- •2.3.5. Случайные числа
- •2.3.6. Округление до целого числа
- •2.3.7. Сравнение пары чисел
- •2.3.8. Тригонометрические функции
- •2.3.9. Математические константы
- •2.4. Строки (тип string)
- •2.4.1. Создание строк
- •2.4.2. Элементарные операции со строками
- •2.4.3. Класс String
- •2.4.4. Определение длины строки. Свойство lengths
- •2.4.5. Соединение строк. Метод concat()
- •2.4.6. Выделение символа строки по индексу. Метод charAt()
- •2.4.7. Поиск в строке. Методы indexOf() и lastIndexOff()
- •2.4.8. Извлечение подстроки. Методы substring(), substr(), slice()
- •2.4.9. Преобразование строк в массивы. Метод split()
- •2.4.12. Преобразование строк в идентификаторы. Функция eval()
- •2.4.13. Текстовые поля
- •2.5. Кодировка символов. Уникод во Flash
- •2.5.1. Немного истории
- •2.5.2. Поддержка уникода Flash-плейером
- •2.5.3. Поддержка уникода средой разработки
- •2.5.4. Добавление символов уникода
- •2.6. Логические величины (тип boolean)
- •2.6.1. Класс Boolean
- •2.7. Тип undefined
- •2.8. Тип null
- •2.9. Объекты (тип object)
- •2.9.1. Атрибуты свойств
- •2.9.2. Изменение атрибутов свойств. Функция ASSetPropFlags()
- •2.10. Клипы (тип movieclip)
- •2.11. Преобразование типов данных
- •2.11.1. Правила преобразования типов
- •2.11.2. Автоматическое преобразование типов
- •2.12. Строгая типизация в ActionScript
- •Проект 2: Калькулятор
- •2.1. Определение типа объекта данных
- •2.2. Числа (тип number)
- •2.2.1. Виды чисел в ActionScript
- •2.2.2. Особенности представления чисел
- •2.2.3. Операции с числами
- •2.2.4. Класс Number — методы и свойства
- •2.2.5. Преобразование строк в числа. Функции parseInt() и parseFloat()
- •Глава 3. Переменные
- •3.1. Создание переменных
- •3.2. Особенности типизации переменных
- •3.3. Локальные переменные функций
- •3.4. Глобальные переменные
- •3.5. Особенности операции присваивания
- •3.6. Есть ли переменные в ActionScript?
- •3.7. Удаление переменных
- •Проект 3: Пружинный маятник
- •Глава 4. Функции
- •4.1. Создание функций
- •4.2. Вызов функций
- •4.3. Предложение return
- •4.4. Рекурсия
- •4.5. Особенности цепочки областей видимости функций
- •4.6. Объект arguments
- •4.6.1. Формальные параметры и объект arguments
- •4.6.2. Свойства объекта arguments
- •4.7. Особенности передачи в функции составных объектов данных
- •4.8. Функции как объекты
- •4.8.1. Класс Function
- •4.8.2. Свойство prototype
- •4.8.3. Методы вызова функции
- •4.9. Функции на стадии выполнения. Объект активации
- •Проект 4: Крестики-нолики
- •Глава 5. Операторы
- •5.1. Виды операторов
- •5.2. Иерархия операций
- •5.3. Сочетательность операций
- •5.4. Арифметические операторы
- •5.5. Операторы присваивания
- •5.5.1. Оператор =
- •5.5.2. Операторы присваивания с модификацией
- •5.5.3. Инкрементирование и декрементирование
- •5.6. Операторы равенства и сравнения
- •5.6.1. Операторы равенства
- •5.6.2. Операторы сравнения
- •5.7. Логические операторы
- •5.8. Условный оператор (?:)
- •5.9. Служебные операторы
- •5.9.1. Инициализаторы литералов
- •5.9.2. Оператор группирования
- •5.9.3. Операторы доступа к свойствам
- •5.9.4. Оператор вызова функции
- •5.9.5. Оператор new
- •5.9.6. Оператор super
- •5.9.7. Оператор delete
- •5.9.8. Оператор typeof
- •5.9.9. Оператор instanceof
- •5.9.10. Оператор void
- •5.9.11. Оператор «запятая»
- •5.10. Поразрядные операторы
- •5.10.1. Логические поразрядные операторы
- •5.10.2. Операторы поразрядного сдвига
- •Проект 5: 3D-конструктор
- •Глава 6. Предложения
- •6.1. Блок предложений
- •6.2. Предложения var и function
- •6.3. Предложения выражений и пустые предложения
- •6.4. Предложение return
- •6.5. Предложение with
- •6.6. Условные предложения
- •6.6.1. Предложение if
- •6.6.2. Предложение switch
- •6.7. Циклы
- •6.7.1. Циклы с предусловием (while и do—while)
- •6.7.2. Цикл с параметром (for)
- •6.7.4. Предложения break и continue
- •6.7.5. Ограничение на время выполнения кода
- •6.7.6. Циклы события onEnterFrame и временной диаграммы
- •6.7.7. Циклический вызов функций. Функция setInterval()
- •Проект 6: Тетрис
- •Глава 7. Массивы (класс Array)
- •7.1. Создание массивов
- •7.2. Извлечение и переопределение элементов массива
- •7.3. Длина массива. Свойство length
- •7.4. Добавление элементов в массив
- •7.5. Удаление элементов массива
- •7.6. Слияние массивов
- •7.7. Выделение фрагмента массива
- •7.8. Инверсия массива
- •7.9. Сортировка массива
- •7.10. Преобразование массива в строку
- •7.11. Многомерные массивы
- •7.13. Особенности реализации массивов в ActionScript
- •Проект 7: Пиксельное табло
- •Глава 8. События
- •8.1. Модель событий Генератор—Листенеры
- •8.1.1. Обработчики событий
- •8.1.2. Листенеры
- •8.2. Событийные методы
- •8.3. Модель событий Flash 5
- •8.4. Обновление экрана при событиях
- •Проект 8: Создаем события сами
- •Глава 9. Объектно-ориентированное программирование
- •9.2.1. Объекты
- •9.2.2. Свойства
- •9.2.3. Методы
- •9.2.4. Классы
- •9.2.5. Наследование
- •9.2.6. Создание надклассов и подклассов
- •9.2.7. Концепция создания надклассов Flash 6
- •9.2.8. Оператор super
- •9.2.9. Свойства и методы конструктора класса
- •9.2.10. Определение принадлежности объекта к классу
- •9.2.11. Цепочка областей видимости. Объект Global
- •9.3. Класс Object
- •9.3.1. Создание объектов класса Object
- •9.3.2. Метод registerClass(). Выделение экземпляров клипа в класс
- •9.3.3. Метод addProperty(). Свойства типа getter/setter
- •9.3.4. Методы watch() и unwatch(). События изменений свойств
- •9.3.5. Прочие методы класса Object
- •9.4.1. Создание классов
- •9.4.2. Задание наследуемых свойств и методов класса
- •9.4.3. Конструктор класса. Инициализация собственных свойств и методов объектов
- •9.4.4. Особенности задания методов в AciionScript2.0
- •9.4.5. Статичные члены класса
- •9.4.7. Динамические классы
- •9.4.8. Наследование
- •9.4.9. Интерфейсы
- •9.4.10. Свойства типа getter/setter
- •9.4.11. Выделение экземпляров символа в подкласс
- •9.4.12. Особенности контроля на этапе компиляции
- •9.4.13. Особенности импорта внешних классов
- •9.4.14. Пакеты
- •9.4.15. Встроенные классы. Директива intrinsic
- •Проект 9: Модель идеального газа
- •Глава 10. Клипы
- •10.1. Глобальные функции и свойства
- •10.2. Отличия клипов от объектов
- •10.2.1. Свойства клипов
- •10.3. Клипы как носители кода
- •10.3.1. Последовательность выполнения кода
- •10.3.2. Особенности использования свойств и методов класса MovieClip
- •10.4. Особенности основной временной диаграммы _root
- •10.5. Создание экземпляров клипов
- •10.5.1. Метод duplicateMovieClip()
- •10.5.3. Метод createEmptyMovieClip(). Создание пустого клипа
- •10.6. Виртуальные слои клипов
- •10.6.1. Изменение глубины клипа. Метод swapDepths()
- •10.7. Импорт внешних фильмов и изображений
- •10.7.2. Импорт внешних фильмов при помощи функций loadMovie() и loadMovieNum()
- •10.7.3. Импорт изображений
- •10.7.4. Импорт фильмов и изображений при помощи класса MovieClipLoader
- •10.7.5. Создание предзагрузчиков
- •10.7.6. Кэширование swf-фильмов
- •10.7.7. Изменение глубины основной временной диаграммы
- •10.7.8. Доступ из одного фильма к объектам другого
- •10.7.9. Обобщенные библиотеки
- •10.8. Имена экземпляров клипов
- •10.9. Ссылки на клипы
- •10.9.1. Свойство _lockroot
- •10.9.2. Определение пути к клипу
- •10.9.3. Инструмент Insert Target Path
- •10.10. Система координат клипов
- •10.10.1. Свойство _x и _y
- •10.10.2. Пересчет координат из одной системы в другую
- •10.10.3. Масштаб осей
- •10.10.4. Размер клипа
- •10.10.5. Границы клипа
- •10.10.6. Поворот системы координат
- •10.11. Прозрачность и видимость клипа
- •10.11.1. Свойство _alpha
- •10.11.2. Свойство _visible
- •10.12. Перемещаемые клипы. Метод startDrag()
- •10.12.1. Свойство _droptarget
- •10.13. Коллизии клипов. Метод hitTest()
- •10.13.1. Определение пересечения двух клипов
- •10.13.2. Определение принадлежности точки к клипу
- •10.13.3. Определение коллизии клипов с использованием поточечного перебора
- •10.14. Управление временной диаграммой
- •10.14.1. Начало и остановка проигрывания клипа
- •10.14.2. Переход на новый кадр
- •10.14.3. Определение номера проигрываемого кадра
- •10.15. Программные маски
- •10.16. Удаление экземпляров клипов и фильмов
- •10.16.1. Удаление экземпляров. Метод removeMovieClip()
- •10.16.2. Выгрузка содержимого экземпляров. Метод unloadMovie()
- •10.16.3. Выгрузка фильмов
- •10.17. События
- •10.17.1. Создание обработчиков событий в стиле Flash 5
- •10.17.2. Событие смены кадров (onEnterFrame)
- •10.17.3. Событие загрузки клипа (onLoad)
- •10.17.4. Событие выгрузки клипа (onUnload)
- •10.17.5. Событие поступления данных (onData)
- •10.17.6. События мыши (onMouseDown, onMouseUp, onMouseMove)
- •10.17.7. События клавиатуры (onKeyDown, onKeyUp)
- •10.17.8. «Кнопочные» события
- •10.17.9. События фокуса (onSetFocus, onKillFocus)
- •10.18. Программное рисование
- •10.18.1. Рисование прямыми отрезками
- •10.18.2. Рисование фрагментами парабол
- •10.18.3. Однородная заливка
- •10.18.4. Градиентная заливка
- •10.18.5. Удаление программной графики
- •10.19. Управление цветом клипов. Класс Color
- •10.19.1. Цветовые модели
- •10.19.2. Задание формулы цвета
- •10.19.3. Задание цвета клипа. Метод setRGB()
- •10.19.4. Цветовые трансформации. Метод setTransform()
- •Проект 10: Рисование 3D-объектов
- •Глава 11. Кнопки
- •11.1. Создание кнопок
- •11.2. Сходства и различия кнопок и клипов
- •11.3. События кнопок
- •11.3.1. Особенности событий кнопок
- •11.3.2. События кнопок в стиле Flash 5
- •11.4. Режим элемента меню
- •11.5. Вид указателя мыши
- •11.6. Отключение кнопок
- •11.7. Управление кнопками при помощи клавиатуры
- •11.7.1. Динамическое наведение фокуса
- •11.7.2. Свойство _focusrect
- •11.7.3. События onSetFocus и onKillFocus
- •11.7.4. Задание маршрута клавиатурного обхода
- •11.7.5. Особенности клавиатурного обхода и программного фокуса в случае клипов
- •11.8. Клипы как кнопки
- •Проект 11: Факел
- •Глава 12. Работа с мышью и клавиатурой
- •12.1. Работа с мышью
- •12.1.1. Определение координат указателя мыши
- •12.1.2. События мыши
- •12.1.3. Скрытие указателя мыши
- •12.1.4. Правая клавиша мыши
- •12.1.5. Определение выхода указателя мыши за пределы окна плейера
- •12.2. Контекстное меню
- •12.2.1. Настройка контекстного меню. Класс ContextMenu
- •12.2.2. Введение в контекстное меню собственных команд
- •12.3. Работа с клавиатурой
- •12.3.1. Особенности событий клавиатуры
- •12.3.2. События onKeyDown и onKeyUp
- •12.3.3. Определение кода нажатой клавиши. Метод getCode()
- •12.3.4. Определение кода введенного символа. Метод getAscii()
- •12.3.5. Проверка нажатия клавиши. Метод isDown()
- •12.3.6. Проверка активности специальных режимов. Метод isToggled()
- •Проект 12: Эластики
- •Глава 13. Работа с текстом
- •13.1. Создание текстовых полей
- •13.1.1. Создание текстовых полей при помощи инструмента Text
- •13.1.2. Переменная поля
- •13.1.3. Динамическое создание текстовых полей
- •13.2. Удаление текстовых полей
- •13.3. Текстовые поля как визуальные объекты
- •13.4. Задание и извлечение текста поля
- •13.5. Настройка текстового поля
- •13.5.1. Управление размером поля
- •13.5.2. Рамка и задний фон
- •13.5.3. Поля однострочные и многострочные
- •13.5.4. Ограничение на количество символов
- •13.5.5. Поле паролей
- •13.5.6. Ограничение на вводимые символы
- •13.5.7. Выделение текста поля
- •13.6. Настройка стиля текста. Класс TextFormat
- •13.6.1. Задание гарнитуры
- •13.6.2. Размер шрифта
- •13.6.3. Цвет шрифта
- •13.6.4. Начертание шрифта
- •13.6.5. Выключка
- •13.6.6. Подчеркнутый шрифт
- •13.6.7. Гиперссылки
- •13.6.8. Форматирование текста
- •13.6.9. Определение размерных параметров текста
- •13.7. Работа со шрифтами
- •13.7.1. Шрифты системные и встроенные
- •13.7.2. Ненаправленные гарнитуры
- •13.7.3. Особенности встраивания шрифтов
- •13.7.4. Встраивание в фильм целого шрифта
- •13.7.5. Встраивание глифов отдельных символов и последовательностей символов
- •13.7.6. Проблема читабельности при отображении мелкого текста
- •13.8. Событие onChanged
- •13.9. Прокрутка текстовых полей
- •13.10. Работа с фокусом
- •13.11. Форматирование текста при помощи HTML
- •13.11.5. Тег <FONT> ... </FONT>
- •13.11.10. Тег <TEXTFORMAT> ... <TEXTFORMAT>
- •13.11.11. Тег <SPAN> ... </SPAN>
- •13.11.13. Автоматическое удаление пробелов. Свойство condenseWhite
- •13.12. Форматирование текста с использованием каскадных таблиц стиля (CSS)
- •13.12.1. Основные положения технологии CSS
- •13.12.2. Создание объекта таблиц стиля
- •13.12.3. Применение объекта стиля к текстовому полю
- •13.12.4. Элементы CSS, поддерживаемые Flash-плейером
- •13.13. Работа с выделением. Объект Selection
- •13.13.1. Управление фокусом поля. Методы getFocus() и setFocus()
- •13.13.2. Событие изменения фокуса (onSetFocus)
- •13.13.4. Определение и задание положения курсора ввода
- •13.13.5. Динамическое задание выделения. Метод setSelection()
- •13.13.6. Динамическая замена выделенного текста. Метод replaceSel()
- •13.14. Работа со статичным текстом. Объект TextSnapshot
- •13.14.1. Создание объектов класса TextSnapshot
- •13.14.2. Считывание текста статичных полей
- •13.14.3. Поиск строки в статичном тексте
- •13.14.4. Программное выделение статичного текста
- •13.14.5. Определение ближайшего к точке символа статичного текста
- •13.15. Копирование текста в буфер обмена
- •13.16. Поддержка многоязычности. Панель Strings
- •Проект 13: Текстовые эффекты
- •Глава 14. Время и дата
- •14.1. Основные понятия теории измерения времени
- •14.2. Компьютерное время
- •14.3. Класс Date
- •14.3.1. Создание объектов класса Date
- •14.3.2. Методы класса Date
- •14.4. Определение времени, прошедшего с начала проигрывания фильма
- •Проект 14: Программные часы
- •Глава 15. Работа со звуком
- •15.1. Основные понятия теории цифрового звука
- •15.1.1. Частота дискретизации
- •15.1.2. Разрядность выборок
- •15.1.3. Количество каналов
- •15.1.4. Алгоритмы компрессии
- •15.1.5. Форматы хранения
- •15.2. Событийный (event) и потоковый (stream) звук
- •15.3. Операции со звуком без использования программирования
- •15.4. Создание объектов класса Sound
- •15.5. Динамическое присоединение звука. Метод attachSound()
- •15.6. Импортирование внешних МР3-файлов
- •15.6.1. Метод loadSound()
- •15.6.2. Отслеживание окончания загрузки. Событие onLoad
- •15.6.3. Создание предзагрузчиков для импортируемых звуков
- •15.7. Управление воспроизведением звуков
- •15.7.1. Запуск воспроизведения. Метод start()
- •15.7.3. Событие onSoundComplete
- •15.8. Свойства position и duration
- •15.9. Управление параметрами воспроизведения
- •15.9.1. Громкость звука
- •15.9.2. Баланс
- •15.9.3. Детальное управление стереозвучанием. Метод setTransform()
- •15.10. Чтение ID3-тегов МР3-звуков
- •Проект 15: МР3-плейер
- •Глава 16. Взаимодействие с локальным окружением
- •16.1. Взаимодействие с импортированными фильмами
- •16.2. Взаимодействие с плейером
- •16.2.1. Определение версии и типа плейера
- •16.2.2. Режимы масштабирования
- •16.2.3. Типы выравнивания
- •16.2.4. Определение размеров фильма и величины окна плейера
- •16.2.5. Событие onResize
- •16.2.6. Цвет фона
- •16.2.7. Качество отображения
- •16.2.8. Панель небезопасных настроек плейера
- •16.3. Дополнительные возможности автономного плейера
- •16.3.1. Проекторы
- •16.3.2. Функция fscommandf()
- •16.4. Взаимодействие между фильмами, проигрываемыми разными плейерами
- •16.4.1. Создание кода отправки данных
- •16.4.2. Создание кода получения данных
- •16.4.3. Пример использования класса LocalConnection
- •16.5. Взаимодействие с браузером
- •16.5.1. Теги <EMBED> и <OBJECT>
- •16.5.2. Передача данных из HTML-окружения при загрузке фильма
- •16.5.3. Решение проблемы кнопок навигации браузера
- •16.5.4. Передача команд браузеру. Функция getURL()
- •16.5.5. Взаимодействие с JavaScript при помощи функции fscommand()
- •16.5.6. Управление SWF-фильмом посредством JavaScript
- •16.5.7. Определение наличия в системе Flash-плейера нужной версии
- •16.6. Взаимодействие со средой разработки
- •16.6.1. Настройка панели Actions
- •16.6.2. Объект CustomActions
- •16.6.3. Взаимодействие с JSFL
- •16.7. Взаимодействие со средствами чтения с экрана
- •16.8. Получение информации об использующемся аппаратном и программном обеспечении
- •16.9. Сохранение данных на диске
- •16.9.1. Создание объектов SharedObject
- •16.9.2. Чтение данных из объектов SharedObject
- •16.9.3. Удаление sol-файлов
- •16.9.4. Серверные объекты SharedObject
- •16.9.5. Решение проблемы выделения цветом посещенных ссылок
- •16.10. Взаимодействие с принтером
- •16.10.1. Функции печати
- •16.10.2. Класс PrintJob
- •Проект 16: Создаем свой инструмент
- •Глава 17. Обмен текстовыми данными с сервером
- •17.1. Принципы сетевой безопасности Flash MX 2004
- •17.1.1. Правила определения идентичности доменов
- •17.1.2. Требование идентичности протоколов
- •17.1.3. Снятие ограничений на доступ к содержимому фильма
- •17.1.4. Снятие ограничений на доступ к внешним данным
- •17.1.5. Преодоление ограничений для сокетов
- •17.1.6. Создание приложений, отвечающих принципам безопасности
- •17.2. Загрузка текстовых данных с сервера
- •17.2.1. Создание файла сданными
- •17.2.2. Функция loadVariables()
- •17.2.3. Класс LoadVars
- •17.3. Взаимодействие с серверным скриптом
- •17.3.1. Запрос с выводом результата в браузере
- •17.3.2. Запрос с отправкой результата в фильм
- •17.3.3. Задание заголовков запроса
- •17.4. Работа с сокетами
- •17.4.1. Класс XMLSocket
- •17.4.2. Создание сокета-сервера
- •17.5. Работа с XML
- •17.5.1. Введение в ХМL
- •17.5.2. Объектная модель XML. DOM
- •17.5.3. Преобразование XML-текста в дерево объектов DOM
- •17.5.4. Обход дерева DOM
- •17.5.5. Создание и модификация XML-документа
- •17.5.6. Обмен XML-данными с сервером
- •Проект 17: Создаем сетевую игру
- •Дополнительные главы
- •Глава 18. Обмен с сервером сложными данными
- •Глава 19. Компоненты
- •Глава 20. Полезные мелочи
щим» CSS. Именно поэтому в данном обзоре мы изучили элементы каскадных таблиц, которые пока не могут распознаваться анализатором Flash-плейера.
13.12.2. Создание объекта таблиц стиля
В ActionScript за CSS-разметку отвечает класс StyleSheet. С учетом тесной связи данного класса и текстовых полей разработчики поместили конструктор StyleSheets() в свойство конструктора TextField. Поэтому синтаксис создания объекта таблиц стиля довольно необычен:
var styles:TextField.StyleSheet=new TextField.StyieSheet();
Формально TextField — это пакет, к которому относится класс StyleSheet. Кстати, данный класс — это единственный предопределенный класс в ActionScript, вложенный в пакет.
После того как объект класса StyleSheet будет создан, ему необходимо передать набор CSSправил, которые он должен хранить. Сделать это можно 3 способами.
Первый способ — создание таблицы стилей непосредственно в коде ActionScript в виде строки. Например, напишем правило, которое будет делать гиперссылки красными, курсивными и подчеркнутыми:
var css_rules:String="A {color:#FF0000; text-size:12px; font-style:italic; text-decoration:underline}";
Затем строка, содержащая таблицу стилей, должна быть передана методу parseCSS() заполняемого объекта класса StyleSheet. Данный метод проводит синтаксический разбор кода CSS. Если правила, хранящиеся в строке, не содержат синтаксических ошибок или не поддерживаемых плейером элементов, то метод parseCSS() возвращает true. Если же по какой-то причине анализ кода CSS осуществить не получилось, будет возвращено false. Посмотрим, удастся ли плейеру «понять» созданный нами стиль для гиперссылок:
trace(styles.parseCSS(css_rulesM)); // Выводит: true
Синтаксический разбор текста с CSS-кодом прошел успешно. Значит, ошибок мы не сделали.
Для того чтобы понять, во что превращаются таблицы стилей после их разбора методом parseCSS(), исследуем внутреннюю структуру объекта styles. Для этого снимем с его свойств защиту от перечисления и просмотрим их при помощи цикла for—in:
ASSetPropFlags(styles, null, null, 1); for (var i in styles) {
trace(i); |
// Выводит: _styles _css __proto__ __constructor__ |
} |
|
Итак, у объекта таблиц стиля имеются 2 недокументированных свойства: _styles и _css. Несложно проверить, что данным свойствам соответствуют объекты класса Object. Перечисляя их свойства, обнаруживаем, что они содержат объекты с одинаковым именем — А. Очевидно, что в данных объектах должно храниться описание стиля для текста, помешенного в тег <А>. Проверим это предположение. Для начала исследуем структуру объекта А объекта _css:
ASSetPropFlags(styles["_css"]["А"], null, null, 1}; for (var i in styles["_css"]["A"]) {
trace(i); // Выводит: color textSize fontStyle textDecoration
}
Оказывается, объект стиля свойства _css хранит такие же свойства, какие были прописаны в соответствующем CSS-правиле. Правда, с учетом правил задания идентификаторов ActionScript, из составных имен свойств удаляется тире (например, font-style дает fontStyle), Если же теперь прове-
рить, что представляет собой объект А объекта styles, то окажется, что это банальный объект класса TextFormat, свойства которого установлены исходя из указанных в CSS-правиле характеристик. У класса StyleSheet имеются инструменты, позволяющие взаимодействовать с внутренней структурой объекта таблиц стиля. Проверить, для каких тегов были созданы стили, можно, использовав метод getStyleNames(). Данный метод возвращает массив, содержащий имена всех стилей, хранимых данным объектом класса StyleSheet. Например:
var styles:TextField.StyleSheet = new TextField.StyleSheet(); var css_rules:String = "A {color;#0000FF} В {color:#00FF00)"; styles.parseCSS(css_rules);
trace(styles.getStyleNames());
Исследовать, какие характеристики присущи определенному стилю, позволяет метод getStyle(«name»), где «name» — строка с именем стиля. Этот метод возвращает соответствующий стилю объект из тех, которые хранит свойство _css объекта класса StyleSheet. Например:
var styles:TextField.StyleSheet = new TextField.StyleSheet();
var css rules:String = "A {color:#0000FF; text-size:12px; font-style:italic}"; styles.parseCSS(css_rules);
var st_obj:Object = styles.getStyle{"A"); for (var i in st_obj) {
trace(i+" = "+st_obj[i]); // Выводит: fontStyle = italic
// textSize = 12px color = #0000FF
}
На практике метод getStyle() применяется, если нужно передать стиль от одного объекта класса StyleSheet другому. Как это делается, мы покажем немного ниже.
Зачем мы так основательно исследуем, каким образом объекты класса StyleSheet хранят стили? Очень просто. Информация про особенности работы анализатора CSS Flash-плейера в фирменной документации не приводится. Поэтому не ясно, в каком случае интерпретация кола CSS пройдет гладко, а в каком возникнет сбой. Зная же, как сохраняются результаты работы анализатора, мы можем экспериментально выяснить все интересующие нас особенности. Так, несложно убедиться в том, что:
•сбой возникает лишь при самом грубом нарушении синтаксиса (например, если для задания описания в CSS-правиле применяются не фигурные, а квадратные скобки). Если же ошибка небольшая, то CSS-код интерпретируется до того фрагмента, в котором она допущена. Объект стиля при этом будет содержать свойства, описанные до фрагмента с ошибкой;
•свойства, прописанные в CSS-правиле, не анализируются на предмет того, поддерживаются ли они плейером. Они просто копируются в объект стиля. Единственная операция, которая над ними проводится, — это удаление из составных имен тире;
•значения свойств объекта стиля всегда имеют строковое представление. Следовательно, они представляют собой просто подстроки, вырезанные из строки с CSS-правилом;
•селектор в CSS-правиле может быть любым. Это означает, что должна существовать возможность разметки XML-документов.
Как видите, анализатор CSS Flash-плейера довольно примитивен. Можно предполагать, что большинство возможностей CSS, которые мы рассмотрели в первой части данного раздела, им не поддерживаются. Впрочем, это мы проверим немного ниже.
Вторым способом сохранить в объекте StyleSheet стили является использование метода setStyle(). Его синтаксис:
setStyle ("name", style_obj).
Здесь:
• name — имя стиля в форме строки. Соответствует селектору при задании CSS-правила в традиционном виде;
• style_obj — объект с парами свойство — значение, описывающими характеристики стиля. Свойства имеют такие же имена, как и при создании обычного CSS-правила. Единственное (так как в идентификаторы свойств не может входить тире), оно из составных имен удаляется, а первая буква второго корня в них переводится в верхний регистр (например, text-decоration и textDecoration). Значения свойств задаются по тем же принципам, что и в «настоящем» CSS, но только в форме строк (строго). Иначе было бы невозможно присвоить свойству значение вроде
12рх.
Алгоритм метода setStyle() довольно примитивен. Он просто создает для объекта _css новое свойство с именем «name» и присваивает ему копию объекта, переданного программистом в качестве второго параметра, Это означает, что никакой проверки на корректность заполнения объекта style_obj не проводится.
Метод setStyle() позволяет одновременно создать только один стиль. Поэтому, если стилей нужно инициализировать несколько, лучше это сделать одним из альтернативных методов.
Пример использования метода setStyle():
// Создаем стиль, который будет задаваться тегом <new_style> var styles:TextField.StyleSheet = new TextField.StyleSheet();
var st_obj:Object={textSize:'12px', textDecoration:"underline", color:'#FF0000', 'marginLeft:45'};
styles.setStyle("new_style", st_obj); delete_styles;
Если вы создаете сайт или другой сложный сетевой проект, имеет смысл вынести таблицу стилей во внешний css-файл. При этом вы сможете изменять характеристики отображения текста, не производя перекомпиляции фильма. Кроме того, одну таблицу стилей смогут применять как swf-, так HTML - составляющие сайта, что сделает его предельно единообразным.
Чтобы подгрузить таблицу стилей, нужно использовать метод load(url), где url — строка с абсолютным или относительным путем к ess-файлу. По умолчанию файл с таблицей стилей должен располагаться на том же домене, что и swf-фильм. Данное ограничение вытекает из новой модели сетевой безопасности Flash. Как его обойти, мы обсудим в главе 18.
Если таблицы стилей будут успешно импортированы, они автоматически обработаются и результат будет занесен в объект класса StyleSheet, вызвавший метод load.
Действие загрузки не завершается моментально. Более того, заранее неизвестно, когда закончится закачка ess-файла. А это означает, что код, каким-то образом использующий импортируемые стили, не может размещаться непосредственно после строчки метода load(). Его нужно поместить в обработчик события onLoad класса StyleSheet. Данное событие происходит по завершении загрузки css-файла, а также если файл импортирован быть не может (указан неверный путь к нему или сервер не ответил). Об успешности закачки можно судить по значению передаваемого обработчику onLoad параметра: true — стили загрузились, false — попытка импорта оказалась безуспешной.
Пример использования внешней таблицы стилей:
//Наберите в текстовом редакторе следующий код и сохраните файл,
//как hyperlink.css в той же директории, в которой располагается
//использующий его фильм
A:link {text-decoration:underline; color:#0000FF; font-style:italic-text-size:12}
A:hover {text-decoration:underline; color:#AA5500; font-style:italic; text-size:14} A:active {text-decoration:underline; color:#FF0000; font-weight:bold; text-size:12} // Код самого фильма будет следующим:
var hyp_st:TextField.StyleSheet = new TextField.StyleSheet(); hyp_st.load("hyperlink.ess"); // Подгружаем таблицу стилей
//Если стили успешно загрузятся, создаем текстовое поле с гиперссылкой и
//применяем их по отношению к нему. Иначе выводим сообщение об ошибке. hyp_st.onLoad = function(result:Boolean):Void {
if (result) {
this.createTextField("pole", 0, 200, 200, 0, 0);
pole.border = pole.autoSize=true;
pole.stylesheet = hyp_st; // Связываем поле и объект стилей pole.text = "<A HREF='http://www.piter.com' TARGET='_blank'> Посетите наш
сайт </А>"; } else {
trace("Таблица стилей не может быть загружена");
}
};
Внешние стили подгружаются в конкретный объект класса StyleSheet. Зачастую же их должны использовать несколько объектов StyleSheet. Скопировать один или несколько стилей из одного объекта StyleSheet в другой можно, используя метод getStyle(). Дело в том, что возвращаемый данным методом объект полностью соответствует тому, который нужно передать методу setStyle(), чтобы записать данный стиль в новый объект. Для примера приведем функцию, создающую копию существующего объекта класса StyleSheet:
function copyStyleSheet(st_obj:TextField.StyleSheet):TextField.StyleSheet { var new_st_obj:TextField.StyleSheet = new TextField.StyleSheet();
var st_arr:Array = st_obj.getStyleNames(); for (var i = 0; i<st_arr.length; i++) {
new_st_obj.setStyle(st_arr[i], st_obj.getStyle(st_arr[i]));
}
return new_st_obj;
}
Очистить объект таблиц стиля от старого содержимого можно, используя метод clear():
hyp_st.clear(); |
// |
Пробуем зачистить объект класса StyleSheet |
trace(hyp_st.getStyleNames()); |
// |
В Output ничего не отображается |
Если снять защиту с прототипа конструктора StyleSheet(), можно обнаружить, что помимо описанных данный класс имеет довольно значительное количество недокументированных возможностей. А это означает, что вполне можно рассчитывать на расширение возможностей по работе с CSS при очередном обновлении Flash.
13.12.3. Применение объекта стиля к текстовому полю
Чтобы применить стили, сохраненные в объекте класса StyleSheet, к тексту поля, его нужно присвоить специальному свойству styleSheet класса TextField. По умолчанию данное свойство не определено. Например:
// Создаем стиль, который будет делать текст зеленым this.createTextField("pole", 0, 200, 200, 100, 30);
var styie:TextField.Stylesheet = new TextField.StyleSheet(); style.parseCSS("GREEN {color:#00FF00}");
pole.styleSheet = style;
pole.text = "<GREEN>Зеленый текст</GREEN>";
Если полю ставится в соответствие объект класса StyleSheet, появляется ряд особенностей, обусловленных специфичностью CSS-разметки. Перечислим их:
• Стирается всякое различие между свойством htmlText и свойством text. Хотя форматирование