Рубрика: Flash
Приложение под цвет кофточки
Flex 4 предоставляет нам возможность легко изменять цветовую гамму всего приложения. Flash Player предоставляет доступ к веб-камере. Так почему-бы не попробовать раскрасить Flex-приложение на основе картинки с камеры? ![]()
Flash Catalyst и его место в рабочем цикле Flex-проекта
Написал небольшой обзор места Flash Catalyst в рабочем цикле Flex-проекта.
Вопрос: соответствует ли то, что я написал, действительности?
Возможно, у Вас есть, что добавить?
Отрезанное W
Настал наш черед писать прекрасные тексты про типографику! ![]()
Arial 11px, первая буква “W” в текстовом поле. Слева отрезают 1 пиксель:
Иногда помогает указать:
- textFormat.blockIndent = 1;
Иногда - не помогает (закономерности не выведено). В этих случаях можно вставить пробел первым символом и сдвинуть все поле влево.
Также замечено, что “W” могут отрезать, если она является первым символом, с которого начинается действие TextFormat-а.
P.S: Также страдает левый край палочки на букве “t”
Подобный эффект был замечен и на других размерах шрифта, в том числе при использовании fontWeight = bold.
Debug mode для FDT 3
В FDT 3 очень удобно работать, но в нем нет дебаг-режима. Способ дебагить, работая в FDT:
- Делаем две копии Eclipse:
- В одной установлен Flex Builder Plugin (далее - Flex)
- В другой - FDT 3 (далее - FDT)
- Во Flex создаем произвольный проект
- Добавляем в него папку нашего проекта через Link to the folder in file system
- Заходим в Run -> Open Debug Dialog…
- Заводим новый профиль во Flex Application
- Вкладка Main:
- Выбираем наш пустой проект, его главный файл
- URL or path to launch - убираем галочку с Use defaults и прописываем во все три поля путь к HTML-обертке нашего главного проекта. У меня это выглядит как “C:\projects\AS3_WS\Portal\bin\Main.html”
- Вкладка Source:
- Добавляем папки с кодом главного проекта (пути - абсолютные). У меня это “C:\projects\AS3_WS\Portal\src\” и “C:\projects\AS3_WS\Portal\lib\”
Все. Жмем F11, запускается наш FDT-билд с дебагом внутри Flex. Расставляем breakpoints во Flex, запускаем - работают! Стек вызовов, все дела. Ура!
Жизнь после Flash CS3
Работая во Flash CS3
Путь Flash-разработчика чаще всего начинается со среды разработки Flash IDE. Однако со временем начинаешь понимать, что все должно бы быть лучше:
- Редактор кода без настоящей системы подсказок
- Вылавливание багов только процессе публикации
- А компилять средний проект надо секунд 10
- И дай Бог чтобы у Вас все было хорошо с датами сохранения документов (+ еще несколько других неприятных багов)
- Даже если Вы захотите разобраться с Data Binding в AS 3.0 - у вас он не заработает как во Flex
Если попытаться подключить классы из Flex, которые за это отвечают, то он не заработает все равно - компилятор в IDE не поспринимает аттрибуты [Bindable]
- И просто Flash IDE создана не для того - в ней неудобно писать код
Что сдерживает переход к какому-либо более совершенному способу разработки:
- Порог осноения недостаточно знакомой/новой среды (Flex Builder, FDT)
- Там нет таймлайна!

- Перспектива работать в более чем одной среде (анимацию все равно придется делать во Flash)
- Придется писать больше кода (?)
- И так сроки горят?
Как оказывается (проверено на себе), потери времени действительно имеют место (особенно в первый день работы). Однако очень быстро начинаешь делать все очень-очень быстро и получаешь от этого большое удовольствие. Flex 2 / Flex 3 Beta 2, конечно, тоже не безупречны, но по сравнению с Flash CS3 IDE - просто рай.
Разработка - Flex Builder 3 Beta 2
Эту среду Вы можете скачать бесплатно. Также понадобится установить Flash Component Kit - расширение для Flash. Вот как выглядит работа в общих чертах:
- Рисуем/анимируем в Illustrator, Photoshop. Импортируем во Flash (за исключением растровых картинок).
- Разделяем графику и анимацию на логические части - с мыслью испльзовать их как стандартные компоненты во Flex.
Автоматические подсказки не покажут Вам, что находится внутри такого “импортированного из Flash” компонента, однако это можно делать (надо знать, что где лежит). AS 3.0 код также работает - например, класс SelectedButton, прилинкованный к MovieClip и реализующий кнопку с нажатым состоянием.
- Выбираем в библиотеке Flash-документа MovieClip-ы, которые будут нужны во Flex. Используем появившуюся после установки Kit’a функцию Commands -> Make Flex Component
О том, что эта команда делает, можно почитать в доках.
- Для нас сейчас главное - это то, что теперь при публикации появляется .SWC файл. Соберем все такие файлы и положим в отдельную папку внутри Flex-проекта, а лучше - назначим путь публикации из всех Flash-документов в ту папку (я завел внутри проекта две папки - assetsSrc и assets)
Вот и все. Flex будет автоматически отслеживать изменения в той папке и пересобираться (что важно - при этом ему не нужно компилировать ваши многочисленные .fla). Если вы опубликовали символ MainBackground (это должно быть именем класса в Linkage во Flash), то автоматическая подсказка его покажет и вставит за Вас import …;. Вот, что мы получаем:
XML:
<local:MainBackground id="assets"></local> |
Обращение к assets в коде там же:
- // Подписываемся на нажатие на кнопку
- assets.myButton.addEventListener(MouseEvent.CLICK, clickHandler);
- // Например, подписываемся на событие,
- // которое раздает наш класс SelectedButton
- // который мы прилинковали ко
- // кнопке mySelectedButton во Flash
- assets.mySelectedButton.addEventListener(MouseEvent.CLICK, clickHandler);
В итоге мы отделили мух от котлет - рисуем в графическом редакторе, пишем код в настоящем редакторе кода. Примерно такой подход я сейчас использую. Доволен! ![]()
Динамическая загрузка шрифтов - Flash CS3
Разобравшись в длиннющем посте немецкого флешера решил его перевести и немного сократить. К Flex это не относится.
Задача: динамически загружать и использовать встроенные шрифты (embedded fonts) в Flash CS3 - Flash Player 9. Для Flash Player 8 и более ранних - Shared Fonts Manager (отдельное удовольствие
).
Что мы имеем? Класс Font, оттуда нам понадобятся функции enumerateFonts(Boolean):Array и registerFont(Class):void а также свойства fontName:String и fontStyle:String.
1. Создаем внешний .swf-контейнер для нужного шрифта
Создаем новый .fla для ActionScript 3.0. В библиотеке создаем новый шрифт - “New Font…” - в “Name” пишем что угодно (в будущем не пригодится), размер шрифта также не имеет значения. Параметры “Bold", “Italic” и “Bitmap text” а также выбор самого шрифта напрямую определяют вид вашего будущего шрифта.
Далее, выбираем созданный символ в библиотеке и жмем “Linkage…". Выбираем “Export for ActionScript” и “Export in first frame". “Export for runtime sharing” выбирать не надо. Базовым классом оставляем flash.text.Font. Имя класса “Class” будет в будущем играть большое значение, введите его. Создавать сам файл .as с классом необходимости нет, среда сама создаст нужный класс.
В настройках публикации оставляем только компиляцию .swf, публикуем. Один шрифт готов, а этот .fla готов к созданию остальных нужных шрифтов через “Save as…” чтобы не повторять все операции заново а лишь заменить шрифт, и имя класса для него.
2. Создание XML-описания для только что подготовленных шрифтов
Пусть наше основное приложение будет брать список шрифтов из XML-файла:
<?xml version="1.0" encoding="utf-8"?> <!-- title - имя шрифта для пользователя className - то, что вы ввели в поле Class раздела Linkage url - адрес .swf со шрифтом --> <fonts> <font title="Arial (smooth)" className="Arial" url="fonts/Arial.swf"/> <font title="Bell MT (smooth)" className="BellMT" url="fonts/BellMT.swf"/> <font title="Bodoni MT (smooth)" className="BodoniMT" url="fonts/BodoniMT.swf"/> ... </fonts>
Парсить этот XML мы будем в массив объектов типа MyFont:
- package com.yourname.yourproject.model
- {
- public class MyFont
- {
- public var title:String;
- public var className:String;
- public var url:String;
- }
- }
Делать MyFont наследником Font мне не хотелось т.к. Font олицетворяет уже загруженный и готовый к использованию шрифт, а у нас только описание для вершины в XML-файле. К тому же подобного наследника мы уже имеем - среда создала по одному дочернему классу для каждого шрифта.
3. Загрузим шрифт и будем его использовать
Пусть мы загрузили XML с описаниями, распарсили его в массив объектов MyFont. Загрузим .swf с нужным шрифтом через Loader с указаннием LoaderContext:
- loader = new Loader();
- var req:URLRequest = new URLRequest(usFont.url);
- var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
- loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
- loader.load(req, loaderContext);
Важно указать ApplicationDomain.currentDomain - шрифты будут загружаться в текущий домен, откуда мы их и будем забирать.
- private function completeHandler(event:Event):void
- {
- var fontClass:Class = ApplicationDomain.currentDomain. getDefinition(textEditVO.font.className) as Class;
- Font.registerFont(fontClass);
- var font:Font = new fontClass();
- // Теперь шрифт можно смело использовать:
- // tf.embeddedFonts = true;
- // var textFormat:TextFormat = new TextFormat(font.fontName);
- // tf.setTextFormat(textFormat);
- }
4. Комментарии.
Можно загружать шрифт не в текущий домен ApplicationDomain.currentDomain, а оставлять его в собственном домене. По событию Event.COMPLETE loader.contentLoaderInfo.applicationDomain инициализируется и до нашего шрифта можно добраться:
- // myFont:MyFont - нужный шрифт
- var fontClass:Class = loader.contentLoaderInfo.applicationDomain. getDefinition(myFont.className) as Class;
- var font:Font = new fontClass();
- Font.registerFont(font);
- // шрифт можно использовать:
- // tf.embeddedFonts = true;
- // ...
PS: А нужно ли это вообще?
Вот примеры того, как выглядят встроенные и обычные шрифты у пользователя. В принципе не смертельная (хотя очень заметная) разница на шрифтах размера больше 10px.

Но стоит сделать попиксельный экспорт в случае device font в BitmapData, отослать это на сервер и там мы увидим нечто (в случае embedded все хорошо):

Runtime embedded fonts in Flash CS3
Со времен Flash 5 многое поменялось, однако загрузка embedded шрифтов по-прежнему не простое занятие. Хороший (правда много букв) пост про это для Flash CS3.
Сохранение изображения из Flash и Flex (ActionScript 3.0)
Снова понадобилось сохранить труды юзера в виде JPG или PNG файла на сервере, но на этот раз уже не c PHP а с ASP.NET. Я уже собрался поселиться на MSDN для изучения этого вопроса, как вдруг нашлось отличное решение: as3corelib, классы JPGEncoder и PNGEncoder.
Когда мало места
Приходится разбираться с одним дурацким проектом, в котором все организовано по-старине. Во Flash CS3 нашелся удобный способ организовать панельки! Показанным ниже способом у меня получается смотреть отрывки скриптов (stop(); в основном) а также смотреть имена объектов, при это не теряясь в горе слоев.

Конструктор, часть 1
Начиная с этого поста я попробую коротко и ясно рассказать про интересные аспекты flash-части проекта my.futbolka.ua. Flash 8, AS 2.0.
Сразу скажу, что не открою секретов или “tricks", но возможно мой опыт (и мои ошибки) будут Вам полезны.
Упрощение развертывания и отладки. Описание проблемы.
Для проекта такой длительности (от 100-150 часов) необходимо заранее уменьшить транзакционные расходы, чтобы было легче жить. Конкретно:
- Как организовать загрузчик (Preloader)
- Как быстро при рабочей локальной версии сделать рабочую серверную, напр. брать файлы с нужных адресов
- Как обеспечить комфортную отладку на сервере, в данном случае - отображение trace()
Решение: Local to Global.
Обычно вопросы конфигураций при компилировании решаются командами препроцессора. В AS 2.0 набор команд ограничивается #endinitclip, #include и #initclip, очевидно что они ничего в этом случае не дадут.
В конструкторе футболок в package model есть отвечающий за это класс LinkSet, большинство свойств и функций в нем поставляют адреса для остальных компонент:
- class model.LinkSet {
- //
- // properties
- //
- // local - флаг локальной версии, остальные относятся к отладке
- public static var local:Boolean = false;
- public static var viewDebugOrder:Boolean = false;
- public static var debugSaveImages:Boolean = false;
- //
- // functions
- //
- // Эту функцию использует прелоадер, т.к. адрес загрузки основного клипа тоже меняется
- public static function get constructorUrl():String
- {
- if (local)
- return "constructorBig.swf";
- else
- return "/constructor/constructorBig.swf";
- }
- // Адрес для отправки данных: локально не используется
- public static function get orderSendUrl():String
- {
- if (local)
- {
- throw new Error("LinkSet::orderSendUrl called local");
- return null;
- }
- else
- {
- return "/order.php";
- }
- }
- // Начало, как правило общее для многих путей как локально так и на сервере
- public static function get linkBase():String {
- if (local)
- return "serverXML/";
- else
- return "/engine.php?type=";
- }
- // Адрес для типичного запроса - xml с описанием
- // категорий основ (футболки, кепки и т.п.)
- public static function getBaseCategoryLink():String {
- if (local)
- return linkBase + "bases.xml";
- else
- return linkBase + "bases";
- }
- // ...
- }
Доступ ко флагам public - другие компоненты тоже могут их видеть (можно дописать еще кода и сделать эти их read-only).
Прелоадер при компиляции также работает с LinkSet.constructorUrl(), в итоге мы получаем настройку прелоадера и основного клипа одной переменной - LinkSet.local .
Есть способ лучше - сделать загружаемый конфигурационный xml-файл, в котором описать нужные параметры - тогда локальную .swf можно смело заливать на сервер, на котором лежит нужный xml-конфиг.
Об отладке и trace()
Есть разные способы отладки приложения на сервере, меня устроил один из самых простых: устанавливается плагин Flash Tracer для Mozilla Firefox (комментарии к установке от Роста) и окошечко Output из среды разработки фактически перемещается в сайдбар Firefox’а.
:: Следующие >>






