Рубрики: ActionScript 3, Components, Non-GUI
Работа для Flex-девелопера в Питере
Думаю, что многие из вас хотели бы работать бок о бок с такими крутыми и симпатичными дефченками как Юля Николаева aka Junique и Аня Громова aka Graann. Теперь у вас есть шанс
В Санкт-Петербурге появилась следующая вакансия.
В компанию Эксперт-Система требуется Flex\AS3 программист.
Требования:
- Опыт работы с технологией не менее года.
- Хорошее знание принципов ООП.
Обязанности:
- Разработка серии AIR/Flex приложений (с использованием BlazeDS).
- Поддержка существующих проектов.
Как водится, зарплата по результатам собеседования (и это правильно).
Предлагаются соцпакет, белая зарплата, оформление по трудовой книжке, гибкий график работы, бесплатное питание, курсы английского языка и прочие бонусы. Офис в 10 минутахпешком от станций метро Петроградская\ Чкаловская.
Использование кандидатом заглавных букв в начале предложений и именах собственных не поощряется (корпоративный стиль отдела) ![]()
L'enfer du Nord: Paris - Roubaix Tour de Flex Tour de Flex
Кстати, на Flex.org появилось замечательное AIR-приложение, которое позволяет довольно просто и интересно изучать Flex. Оно содержит постоянно пополняемые примеры кода, организованного по разным темам и группам, которые довольно легко. наглядно и интересно изучать. Называется приложение Tour de Flex. Рекомендую к установке.
Также приложение может оказаться полезным, например, чтобы быстро показать вашему менеджеру проекта сколько всего крутого и интересного есть во Flex (с технической точки зрения) и склонить его к использованию этой технологии. Упражнение на дом: проделайте то же самое с заказчиком.
Как вы поняли, приложение может оказаться незаменимым, а в дополнение к нему имеется еще и Eclipse-плагин. который держит список примеров под рукой и позволяет быстро запускать приложение с нужным примером. Информация по плагину также на страничке приложения.
Пора работать дальше ![]()
Еще о событиях в ActionScript

Если кто-то помнит, на первой встрече Русскоязычной Группы Пользователей Flash-платформы (RAFPUG) я рассказывал о событиях в ActionScript 3. Как краевед могу сказать, что тема событий в ActionScript далеко не так тривиальна, как это может показаться на первый, второй и третий взгляд. Работая с ними довольно долго, можно тем не менее иногда обнаружить что-то новое, сделать новые выводы и найти применения старым вещам. В частности, в том докладе я сказал некоторую лажу и во всем зале меня никто не поправил
Поправлю себя сам.
Там я сказал, что event flow (поток событий) работает только для визуальных объектов и только для интерактивных событий мыши и клавиатуры, генерируемых Flash-плеером. На основании этого я продемонстрировал пример с искусственным бабблингом (фазой пузырька). И сделал слегка неверные выводы.
На самом деле, на практике все гораздо проще. И мой тот пример вполне работоспособный, но более актуальный для невизуальных объектов, либо для того, чтобы объекты генерировали целевую фазу (target phase) и фазу пузырька (bubbling phase) одновременно. Речь идет о делегировании события.
Для простой же фазы пузырька в визуальных объектах практически ничего не надо, и сейчас я это проиллюстрирую.
В изначальном утверждении про визуальные объекты и поток событий все правильно если рассматривать под потоком событий все три фазы (capture, target и bubbling). Но фаза пузырька (bubbling) работает и так, сама по себе.
Рассмотрим пример:
Пример сделан в виде просто AS-проекта для наглядности. Исходники можно посмотреть тут. Скачать проект можно тут.
Что мы видим на данном примере. Есть корневой Sprite, в котором лежит простой компонент ParentSprite (внешний серый квадрат), в нем лежит компонент ChildSprite, при клике на внутренний квадрат которого наш компонент генерит событие, которое ловится внешним Sprite‘ом безо всякого участия ParentSprite:
- private function onInsideChildClick (event:MouseEvent):void
- {
- dispatchEvent(new Event ("ourTargetEvent", true));
- }
Обработка события видна в текстовом поле. Весь секрет в волшебных пузырьках во втором параметре конструктора класса Event (он установлен в true). Это и есть бабблинг. И ParentSprite автоматом бабблит его. Безо всякого кода.
Естественно, это просто иллюстрация. В реальности неплохо бы сделать кастомный класс события, соответствующие константы итд.
Гарантирую, что это может сильно облегчить вам жизнь.
Развитие Tamarin
Уже дня два-три в моих закладках лежит неопубликованной ссылка на новость от Теда Патрика о том, что Adobe внесли в репозиторий кода проекта Tamarin код QVM. Это виртуальная машина для ActionScript 3, которая написана на языке Форт, и предназначена для запуска на устройствах с ограниченными ресурсами.
Это, во-первых, первый шаг к новой версии FlashLite для мобильных устройств, которая позволит запускать Flex-приложения. Во-вторых, это также шаг к мобильной версии AIR. И в-третьих, это позволит большему проникновению ECMAScript на мобильные платформы.
Так как VM написана на языке Форт, это позволит портировать ее практически на все мобильные устройства. Так что новость эта достаточно важная.
Прошедшая встреча Russian Adobe Flash Platform User Group
Все, наверное, в курсе, что вчера прошла первая встреча Russian Adobe Flash Platform User Group (RAFPUG). Народу было довольно много, несмотря на воскресенье и такую рань (12 часов). Многие подтягивались чуть ли не к 11-ти. В общем, кворум был, хотя далеко не все из зарегистрированных 85 участников пришли. Была, наверное, половина или даже чуть больше.
Присутствовал весь цвет элиты разработчиков на базе Flash-платформы. Многих уже знал лично, а с некоторыми познакомился впервые. Если кого-то забуду, не пинайте ногами. Среди тех, кого встретил или с кем познакомился, были Евгений “john” Потапенко, Ден “cleoag” Иванов, Иван “iv” Дембицкий, Андрей “prof” Иванов, Саша “agahov” Гахов, Таня “0xffffff” Белая, Максим “slon_v_sapogah” Качуровский, Александр “fizzer” Козловский, Юрий “Бармалей” Яровой, Василий “Vasileus” Нужа, Влад Январев и многие, многие другие
А также, конечно, команда Flexis’а во главе с Артемием Малковым, которые и устроили данное мероприятие, а также представляли на нем Adobe.
В этот раз я, к сожалению, не фотографировал. Что-то не до того было. Но, надеюсь, что все другие участники мероприятия выложат свои фотографии для полноты картины ![]()
Начал встречу Артемий Малков с презентации, которая была предназначена для Flash-разработчиков, и дающая представление о возможностях и назначении Flex, и как можно взаимодействовать роликам, сделанным на Flash с Flex-приложением. Свою презентацию Артемий снабдил достаточно эффектными демонстрациями, где за каких-то пять минут сделал довольно простое, но производящее резонное впечатление на начинающих, приложение. То есть если знать всю мощь Flex, то все просто. Но если не иметь об этом представления, то с позиций Flash это кажется внушительным.
Ну дальше и я немного рассказал про событийную модель в девятой версии Flash Player’а применительно к ActionScript 3 и Flex. Меня попросили не сильно утомлять слшателей, и потому я по-быстрому все рассказал и показал. Презентацию можно скачать тут (500k), а примеры тут (3.7M). Код примеров можно смотреть по правой кнопке (View Source).
Завершилась встреча рассказом и обсуждением планов Adobe по части развития направления Flex, AIR и вообще Flash-платформы в России. В частности, Артемий обнародовал дату следующей встречи - 14 января. И на ней будут доклады евангелистов из Adobe, которые совершат road show по Европе и заедут в Россию. Так что ждем следующей встречи.
Ну а обсуждение глобальных проблем о судьбах технологии и сообщества, о взращивании профессионалов, о переводе документации и 15 лицензий Flash для Вани, о том, что первично - Flex или Silverlight, а также ряда других проблем, это обсуждение я пересказывать не буду. Но, кстати, там велась съемка мероприятия на видео, и если оно будет доступно, я сразу кину ссылочку.
После официальной части все двинулись продолжать общаться в ближайшую пивную. К сожалению, нам с Максимом надо было думать не только о судьбах технологии, но и о судьбах нации, и мы на несколько часов отлучились. Когда мы освободились, инициативная группа, возглавляемая Джоном, направилась в боулинг. В итоге оставшуюся часть вечера мы пили пиво, катали шары и обсуждали проблемы разной степени глобальности. В первом часу ночи остались лишь самые стойкие из нас. Ну а нам с Пашей “Vertex” Кожиным надо было уже бежать на поезд, и этот повод подвигнул и остальных (остались лишь Джон, Белая, Бармалей, Vertex и я) расходиться по домам.
Так что мероприятие было позитивным, полезным и вообще суперским. Будем чаще встречаться! ![]()
Update: Александр Козловский aka Fizzer выложил видео некоторых выступлений и фотографии. Изучаем ![]()
«ActionScript 3.0. Сборник рецептов» на русском!
Радостное известие. В конце ноября в издательстве «Символ Плюс», которое лично мне очень нравится качеством своих изданий и качеством переводов, выходит «ActionScript 3.0. Сборник рецептов» на русском языке. К сожалению, эта книга будет не совсем полезна для Flex-разработчиков, ибо про mxml там не будет ни слова. Но так или иначе, можно много узнать про ActionScript 3 и API Flash-плеера, что тоже полезно. Желающие могут ознакомиться с содержанием.
А уже сейчас книгу можно заказать со скидкой.
Также напомню, что это перевод вышедшей год назад в издательстве O’Reilly книги известных личностей Joey Lott, Darron Schall и Keith Peters «ActionScript 3.0 Cookbook».
Генерация геттеров/сеттеров
Многие недовольны Flex Builder’ом. Не буду перечислять всего того, что мы хотели бы видеть в идеальной IDE. Упомяну один лишь аспект. Маленький, но неприятный. Во Flex Builder’е нет темплейтов. Это часто очень напрягает. А сильнее всего напрягает, когда приходится писать довольно одинаковый и однообразный код для get/set методов.
К своему счастью на днях я натолнулся на замечательный пост, в котором рассказывается, как с помощью плагина Eclipse Monkey это все можно реализовать.Мало того, там приводится простой скрипт для генерации простого варианта get/set методов.
Ну мне такой вариант не сильно подходил, ибо чаще всего я использую get/set методы с биндингом. А есть еще более навороченные варианты с теми же коллекциями, которые, тем не менее, встречаются часто.
В итоге я написал на основе приведенного в посте парочку своих скриптов, которые вместе с модифицированным оригиналом можно скачать.
Ниже приводится ссылочка на видео, в котором я демонстрирую как всем этим добром пользоваться. Там не описан процесс установки плагина, который (с картинками) можно найти тут. У плагина также есть документация (в системе помощи Eclipse). Дополнительную информацию можно найти на сайте Aptana, в плагинах которой Monkey активно используется.
Ну а видео смотрим тут (9.5 метров).
Update: Оказалось, что некоторым людям [skipped skipped skipped] мало сообщения о том, что в видео дается практически вся информация по использованию. Для них пишу отдельно: если у вас возникли какие-то проблемы, и вы жалуетесь на них не просмотрев видео, не расчитывайте на серьезное к себе отношение. Понятно, что если у вас нет физической возможности смотреть - помогу. Я планирую в будущем выкладывать больше видеотуториалов, которые, имхо, обладают большей информативной емкостью. Спасибо.
Бесплатные главы из Essential ActionScript 3.0
В Adobe Developer Center в свободный доступ выложены две главы из книги Колина Мука Essential ActionScript 3.0. Глава 20 про Display API и глава 21 про события. Качаем.
Аспекты наследования во Flex
Если кто-то занимался исследованием кода компонент Flex-фрэймворка, мог заметить некоторые особенности реализации метода createChildren() практически во всех классах:
- override protected function createChildren():void
- {
- super.createChildren();
- if (!titleBar)
- {
- titleBar = new UIComponent();
- ...
- rawChildren.addChild(titleBar);
- }
- if (!titleTextField)
- {
- titleTextField = new UITextField();
- ...
- titleBar.addChild(titleTextField);
- }
- ...
- }
Примерно в таком духе.
Не очень понятно, зачем проверять существование создаваемых GUI-элементов, если метод createChildren() вызывается из конструктора, и именно в нем создаются контролы? Думаю, что многие знают, для остальных смысл объясняется ниже.
Предположим мы хотим создать вариант класса mx.controls.Alert, который может отображать текст с HTML-форматированием. Задача может показаться сложной, но описанное выше дизайнерское решение создателей Flex-фрэймворка существенно облегчает нам задачу, делая ее очень легкой.
Рассмотрим место в коде mx.controls.Alert, которое нас интересует:
- override protected function createChildren():void
- {
- super.createChildren();
- ...
- if (!alertForm)
- {
- alertForm = new AlertForm();
- alertForm.styleName = this;
- addChild(alertForm);
- }
- }
Именно поле alertForm содержит экземпляр класса mx.controls.alertClasses.AlertForm, в котором и находится наше текстовое поле. Идея простая: нам надо создать свой класс AlertForm и попробовать создать его экземпляр в методе createChildren() класса com.riapriority.controls.HTMLAlert, который мы хотим получить.
Логично предположить, что наш класс com.riapriority.controls.HTMLAlertForm будет наследоваться от оригинального AlertForm. И тогда благодаря проверке на существование alertForm мы преспокойно можем написать наш метод createChildren():
- override protected function createChildren():void
- {
- alertForm = new HTMLAlertForm();
- alertForm.styleName = this;
- addChild(alertForm);
- super.createChildren();
- }
Итак, идея понятна. Если же мы хотим дать возможность и другим проделывать ту же операцию, то лучше написать так:
- override protected function createChildren():void
- {
- if (!alertForm)
- {
- alertForm = new HTMLAlertForm();
- alertForm.styleName = this;
- addChild(alertForm);
- }
- super.createChildren();
- }
То же самое проделываем в классе com.riapriority.controls.HTMLAlertForm:
- override protected function createChildren():void
- {
- if (!textField)
- {
- textField = new UITextField();
- textField.styleName = this;
- textField.htmlText = Alert(parent).text;
- textField.multiline = true;
- textField.wordWrap = true;
- textField.selectable = true;
- addChild(textField);
- }
- super.createChildren();
- }
Единственная проблема в том, что статический метод show() класса mx.controls.Alert придется продублировать в нашем HTMLAlert: статические методы не наследуются. Итоговый класс com.riapriority.controls.HTMLAlert:
- package com.riapriority.controls
- {
- import flash.display.Sprite;
- import mx.controls.Alert;
- import mx.core.Application;
- import mx.core.mx_internal;
- import mx.events.CloseEvent;
- import mx.managers.PopUpManager;
- use namespace mx_internal;
- public class HTMLAlert extends Alert
- {
- public function HTMLAlert()
- {
- super();
- }
- override protected function createChildren():void
- {
- if (!alertForm)
- {
- alertForm = new HTMLAlertForm();
- alertForm.styleName = this;
- addChild(alertForm);
- }
- super.createChildren();
- }
- public static function show(text:String = "",
- title:String = "",
- flags:uint = 0x4 /* Alert.OK */,
- parent:Sprite = null,
- closeHandler:Function = null,
- iconClass:Class = null,
- defaultButtonFlag:uint = 0x4 /* Alert.OK */):Alert
- {
- var modal:Boolean = (flags & Alert.NONMODAL) ? false : true;
- if (!parent)
- parent = Sprite(Application.application);
- var alert:Alert = new HTMLAlert();
- if (flags & Alert.OK||
- flags & Alert.CANCEL ||
- flags & Alert.YES ||
- flags & Alert.NO)
- {
- alert.buttonFlags = flags;
- }
- if (defaultButtonFlag == Alert.OK ||
- defaultButtonFlag == Alert.CANCEL ||
- defaultButtonFlag == Alert.YES ||
- defaultButtonFlag == Alert.NO)
- {
- alert.defaultButtonFlag = defaultButtonFlag;
- }
- alert.text = text;
- alert.title = title;
- alert.iconClass = iconClass;
- if (closeHandler != null)
- alert.addEventListener(CloseEvent.CLOSE, closeHandler);
- PopUpManager.addPopUp(alert, parent, modal);
- alert.setActualSize(alert.getExplicitOrMeasuredWidth(),
- alert.getExplicitOrMeasuredHeight());
- return alert;
- }
- }
- }
Итоговый класс com.riapriority.controls.HTMLAlertForm:
- package com.riapriority.controls
- {
- import mx.controls.Alert;
- import mx.controls.alertClasses.AlertForm;
- import mx.core.UITextField;
- import mx.core.mx_internal;
- use namespace mx_internal;
- public class HTMLAlertForm extends AlertForm
- {
- override protected function createChildren():void
- {
- if (!textField)
- {
- textField = new UITextField();
- textField.styleName = this;
- textField.htmlText = Alert(parent).text;
- textField.multiline = true;
- textField.wordWrap = true;
- textField.selectable = true;
- addChild(textField);
- }
- super.createChildren();
- }
- }
- }
Использование стандартное - HTMLAlert.show (...). Но в тексте теперь можно задавать HTML-форматирование.
Не так много кода, не правда ли?
Flex 3 SDK: компоненты
Продолжаем прочтение обзоров Flex 3, публичная бета которой должна вот-вот выйти. На этот раз от Flex Builder’а переходим к Flex 3 SDK. В обзоре, посвященном в основном нововведениям в компонентах, Тед Патрик описывает AdvancedGrig. Вообще, я не буду пересказывать сам исходный материал: он доступен. Помимо AdvancedGrid в нем описаны компоненты, позволяющие отображать в адресной строке браузера ссылки на внутренние страницы вашего Flex-приложения/сайта (помните SWFAddress?). Также описана возможность переключения ресурсов в рантайме (очень востребованная фича!). Ну и Flash/Flex Integration Kit, который уже не новость.
Мои комментарии здесь просты. Если к Flex Builder’у я отношусь со скепсисом и считаю его использование разработчиками вынужденной на данный момент мерой, то качеством SDK я по большей части удовлетворен. Особенно что касается фрэймворка. Я считаю, что его гибкость и настраиваемость с лихвой перекрывает некоторые встречающиеся баги и фичи, которые при наличии исходного кода (исходный код, как мы знаем, предоставлен) и головы легко обходятся. И потому я думаю, что AdvancedGrid должен быть вполне хорош. И уж точно востребован! Что касается объема нововведений… Лично меня вполне удовлетворяет набор компонент и из второго SDK. Все равно очень сложно объять необъятное. И чем компоненты более изощренные и узкоспециализированные, тем больше вероятность, что именно в таком виде они вряд ли понадобятся. Меня вполне устраивает то, что разработчикам бесплатно дали довольно обширный, хорошо документированный, расширяемый фрэймворк, а все остальное они сделают сами.


