Flex и RIA блоги
2007-03-29 |
Плагин XMLBuddy для Eclipse Вчера открыла для себя плагин для Eclipse XMLBuddy, который помогает работе с XML. Позволяет настроить подсветку XML и DTD, генерит DTD для имеющегося XML и еще много всего. Есть бесплатная версия XMLBuddy и платная XMLBuddy Pro. Про все это подробнее на сайте http://www.xmlbuddy.com. |
2007-03-28 |
Решение проблемы наследования от Point. Проблема:
Есть у меня класс утилита, который работает с этим интерфейсом:
Кульминация - нужно сделать реализацию IVector:
Если присмотреться к классу Vector, становиться понятно, что он очень похож на Point. Решение:
И реализация IVector будет иметь следующий вид:
Вот такая радость |
2007-03-27 |
Новый Flex Community Site Farata Systems анонсировали сайт http://www.myflex.org. Пока это только alpha версия. Интересно то, что сделан сайт на flex. Пока еще не очень удобно им пользоваться, но надеемся на лучшее. Обещают, что там будут появляться компоненты для flex и плагины для flex builder, в том числе и бесплатные. |
2007-03-26 |
Легкая локализация во Flex. А будет ли runtime локализация? Если вы разрабатываете flex приложение, то локализация не должна отнять много времени, про что есть статьи и на русском языке (например, эта). Несколько минут и ваше приложение “заговорит” на разных языках, а если забудете что-то важное, то exception обеспечен. |
Подгрузка css на стадии компиляции В процессе работы над очередным проектом у нас с Junik возникла потребность в использовании каскадных стилей. Подробнее о стилях и вариантах их использования написано тут, методика подгрузки css в рантайме тут, здесь же речь пойдет о тех проблемах с которыми мы столкнулись в процессе подгрузки файла css на стадии компиляции. |
2007-03-24 |
Вышел первый HotFix для Flex SDK 2.0.1 От разработчиков Flex SDK появился первый HotFix, лечащий многие баги в DataGrid. К сожалению другие баги (неправильные скроллбары, ошибка на вторичной загрузке модулей, дублирование иконок в Menu), пока не исправлены. Но будем надеятся, что скоро выйдут соответствующие исправления. Немного недоумения вызвало, что все файлы в архиве отдатированы 06-фев-2007, а фикс вышел только два назад. Ну да ладно…, как умеют, так и работают … |
2007-03-23 |
Встречайте Apollo! Apollo – кросс платформенная среда, позволяющая создавать многофункциональные приложения с использованием большого количества современных технологий; таких, как HTML, Flash, JavaScript, AJAX, Flex и проч. для операционных систем Windows и MacOS, а в перспективе – и Linux. Уже сегодня можно посмотреть и потрогать Apollo-технологию, скачав дистрибутивы с сайта Adobe Labs. Выход финальной версии Apollo запланирован на конец этого года, так-что массовое создание Apollo-приложений вероятно переносится на 2008 год. Уже в альфа-версии можно:
И всего этого программисты из Adobe, добились всего-лишь за год напряженной работы. Порадуемся вместе с программистами из Adobe долгожданному выходу Альфа-продукта и с нетерпением ждём новых фич и функционала в этом и последующих годах. |
2007-03-20 |
«Убийца» Java и .NET: Apollo Тут CNews порадовала своим заголовком, вслед за информативными сообщениями от Роста и Константинера: http://flash-ripper.com/archives/001691.php http://riapriority.com/blogs/constantiner.php… Post Update: Сорри пост зачищен, отныне про Adobe Flex, либо хорошо, либо ничего… |
2007-03-18 |
Как теперь работать с клипами ? Что-то давно я ничего не писал , блог зафлудили спамеры, тем не менее посещаемость растёт. Последнее обстоятельство заставило меня пристыдиться и написать что-нибудь. Разницы между AS1 и AS2 невелика, некоторые фичи API плеера (например битмап фильтры и ExternalInterface) и эмуляция ООП среды на стадии компилляции. Это именно эмуляция, компиллятор собирает из исходников AS2 код AS1. Посмотрите на параметры публикации, выберите Flash Player 6 и убедитесь что среда предалагает публикацию на двух языках AS1 и AS2. Многие флешеры говорят что они “кодят на AS2″, но большинство из них не понимают что такое ООП. Они имеют какие-то представления об этом, но пишут программы приемущественно в кадрах клипов и считают “классы” лишним наворотом большого смысла в котором видят. ООП идеология – ключевой момент, отличающий AS1 от AS2. Раньше приаттачить клип из библиотеки можно было так: clip.attachMovie('linkageId', 'clipName', depth) 1. cоздали новую копию символа linkageId 2. создали новую переменную clipName в клипе clip. В Actions Script 3 логика больше соответсвует стандартам. 1. Создать новый сомвол в библиотеке и нарисовать что-то в этом символе. Допустим вы создали в библиотеке символ и ассоциировали его с классом Square. package { import flash.display.Sprite; public class Board extends Sprite { public function Board() { var aSquare:Square = new Square() this.addChild(aSquare); } } }
В строке 9 “аттачим” “клип” aSquare к инстации Document Class, которая служит “рутом”. Усложняем пример, создаём в библиотеке новый символ, например кружок поменьше квадратика, и ассоциируем его с классом Round. package { import flash.display.Sprite; import flash.utils.setTimeout; public class Board extends Sprite { var aSquare:Square; var aRound:Round; function Board() { this.aSquare = new Square(); this.aRound = new Round(); trace(this.aSquare.parent); // null trace(this.aRound.parent); // null flash.utils.setTimeout(this.addToBoard, 1000); flash.utils.setTimeout(this.addToSquare, 2500); } function addToBoard():void { this.aSquare.x = this.aSquare.y = 100; this.addChild(this.aSquare); this.addChild(this.aRound); trace(this.aSquare.parent); // [object Board] trace(this.aRound.parent); // [object Board] } function addToSquare():void { this.removeChild(this.aRound); trace(this.aRound); // null this.aSquare.addChild(this.aRound); trace(this.aSquare.parent); // [object Board] trace(this.aRound.parent); // [object Square] } } }
Ещё через 1,5 секунды будет вызвана функция addToSquare:
Важный момент: мы отказались и полностью игнорируем имёна клипов. Нет необходимости отслеживать путь к объекту и юзать извращения targetPath и eval, стиль требует передавать ссылки на объекты. Например в объекте aSquare создать поле round ссылающееся на aRound. В AS1/2 конструктор мувиклипов приватный, это значит что вызвать его мы можем только из другого клипа. Новый клип создаётся и сразу присоединяется к родителю на указанный уровень. Итог: |
Как теперь работать с клипами ? Что-то давно я ничего не писал , блог зафлудили спамеры, тем не менее посещаемость растёт. Последнее обстоятельство заставило меня пристыдиться и написать что-нибудь. Разницы между AS1 и AS2 невелика, некоторые фичи API плеера (например битмап фильтры и ExternalInterface) и эмуляция ООП среды на стадии компилляции. Это именно эмуляция, компиллятор собирает из исходников AS2 код AS1. Посмотрите на параметры публикации, выберите Flash Player 6 и убедитесь что среда предалагает публикацию на двух языках AS1 и AS2. Многие флешеры говорят что они "кодят на AS2", но большинство из них не понимают что такое ООП. Они имеют какие-то представления об этом, но пишут программы приемущественно в кадрах клипов и считают "классы" лишним наворотом большого смысла в котором видят. ООП идеология - ключевой момент, отличающий AS1 от AS2. Если AS1 — ваш первый язык программирования. То перейти на ActionScript 3 вам будет сложнее. Т.К. в вашем мозге (как и ранее в моём) есть вредные извилины абстрактной модели MovieClip'ов. Раньше приаттачить клип из библиотеки можно было так: В Actions Script 3 логика больше соответсвует стандартам. 1. Создать новый сомвол в библиотеке и нарисовать что-то в этом символе. Допустим вы создали в библиотеке символ и ассоциировали его с классом Square.
В строке 9 "аттачим" "клип" aSquare к инстации Document Class, которая служит "рутом". Усложняем пример, создаём в библиотеке новый символ, например кружок поменьше квадратика, и ассоциируем его с классом Round.
Ещё через 1,5 секунды будет вызвана функция addToSquare: Важный момент: мы отказались и полностью игнорируем имёна клипов. Нет необходимости отслеживать путь к объекту и юзать извращения targetPath и eval, стиль требует передавать ссылки на объекты. Например в объекте aSquare создать поле round ссылающееся на aRound. В AS1/2 конструктор мувиклипов приватный, это значит что вызвать его мы можем только из другого клипа. Новый клип создаётся и сразу присоединяется к родителю на указанный уровень. Итог: |
2007-03-16 |
Изменение цвета прелоадера flex приложения Недавно наткнулась на проблему изменения цвета прелоадера flex приложения. Это, тот прелоадер, который flex автоматически показывает во время инициализации приложения. Сама не смогла догадаться, как это сделать, решение нашла тут. Для тех, кому лень переводить, вкратце перескажу.
Чтобы задать цвет в Flex Builder необходимо выбрать свойства проекта и там на вкладке Flex Compiler дописать строку “-default-background-color #336699″ в Additional compiler arguments. |
Готов A3 JTable Ребята из aswing.org выпустили на всеобщее обозрение A3 JTable Этот год сулит новое “программистское щастье”:
До кучи осталось забрать производство Flash Player Runtime из нерасторопных рук Адобовских программистов и заодно повысить скорость исполнения апликух в 50-100 раз и наконец сделать мультиязычный инсталлятор. |
2007-03-03 |
Публичные переменные в классе flash.geom.Point Дополнение к посту «Публичные переменные это зло… » Изучим структуру flash.geom.Point:
в данные момент меня интересуют две строчки, которые говорят что свойства x, y класса flash.geom.Point, описаны как публичные переменные … какие проблемы это вызывает? Отсутствует возможность переопределить данные свойства в классе потомке. Пример 1:
error: 1024: Overriding a function that is not marked for override. Пример 2:
error: 1023: Incompatible override. Следовательно для реализации, например, интерфейса IPoint
нельзя использовать использовать наследование
придется использовать делегацию:
Делегация в данном случае не оправдана, так как класс MyPoint нельзя будет использовать в методах работающих с Point. Вокруг стандартных методов придётся писать обёртки или использовать преобразование. Пример преобразования:
… Пример обертки:
|
flex-coding-guidelines Fabio Terracini опубликовал в рассылке FlexCoders рекомендации по оформлению кода для Flex (AS3, MXML, CSS). Данный документ основан на соглашениях используемых в Adobe Flex libararies, Java |
2007-02-23 |
Исследование AVM и Garbage Collector По ссылке http://flash.korax.ru/demo/ethereal/ethereal.html Несколько выводов, которые мне удалось сделать из тестов:
Всё-таки, как мне кажется, если в приложении есть “тяжёлые”, многократно пересоздаваемые объекты, лучше доводить счетчик ссылок (Reference Counter) до единицы перед зачисткой “главной” ссылки объекта. Все мои попытки создать чрезвычайно сложный неубиваемый пул объектов (с Reference Counter поднятым от 100 до 200) со множествственными связями (кольцевыми, иеархаическими, в массивах, полях) не увенчался успехом. Мощный однако анализатор кроссвязей у VM! Может кому-нибудь другому удастся |
2007-02-12 |
Юбилей :) |
2007-02-07 |
Формат даты в DateTimeAxis При работе с чартингом, одной из осей которого является DateTimeAxis, часто возникает потребность в изменении формата отображения меток. Как я поняла в ходе общения с кодом DateTimeAxis, сам флекс не меняет формат даты в зависимости от локали. По умолчания дата отображается в формате m/d/yy. Для российского глаза такое отображение несколько непривычно. Хелп предоставляет два пути решения этой проблемы.
Казалось бы вот оно счастье, однако поспешность в выборе может послужить для вас причиной дополнительного геморроя. Качественная замена функции дело довольно муторное. Ведь интервал между метками может составлять как секунды так и годы. Куча кода. Рекомендую с негодованием отвергнуть эту веселую перспективу и обратить свой взор к пункту 2. 2. В хелпе есть такое понятие как Protected Methods. Для человека пришедшего из AS2 и не озаботившегося ознакомлением с матчастью AS3 такое буквосочетание может показаться слабо информативным, однако белые люди сжевавшие в процессе общения с флексом уже не одну pdf-ную страницу в курсе что Protected Methods - методы класса которые можно переопределять в наследниках. Часто большинство этих методов скрыто в недрах хелпа в аккордеоне с надписью “Show Inherited Protected Methods", однако это не наш случай. Интересующие нас сейчас методы DateTimeAxis на виду:
Разумеется прежде чем переопределять их в соответствии с вашими пожеланиями следует ознакомиться с исходным кодом DateTimeAxis. Там за вас уже все придумали и написали:
Потребуется только слегка откорректировать эти методы в соответствии с вашими пожеланиями. Или, если приложение требует некоторой гибкости, добавить к уже имеющемуся формату еще несколько форматов отображения. (в зависимости от локали) Кстати. Если вдруг получившиеся в ходе переопределения методов метки будут натыкаться друг на друга и делать подписи абсолютно нечитаемыми следует воспользоваться методом |
2007-02-03 |
Пример неудачного, использования CairngormEventDispatcher Краткое описание действующих лиц. Паттерны программирования J2EE (Java 2 Enterprise Eddition) J2EE Patterns Cairngorm Микро архитектурный фреймворк, основанный на J2EE паттернах, адаптированных для flex /flash (ria). Т.е. это реализация нескольких паттернов для flex и общая рекомендация о связке между ними. CairngormEventDispatcher – Централизованный диспетчер событий, Singleton. CairngormEvent – пользовательское событие, его можно переопределить для отсылки данных вместе с событием. отсылаем событие:
Архитектура Cairngorm подразумевает, что обработка этих событий будет реализована через FrontController, который определяет соответствие событий и команд(ICommand). Другими словами, обработка реакции на события происходит централизованно. Но существует возможность подписаться на это событие в любом месте приложения. Без использования команд и FrontController. подписываемся на событие без использования комманд:
На первый взгляд данная возможность впечатляет: кто угодно может обратиться к кому угодно из любой точки приложения. Но если Вы напишите достаточно много таких вызовов, то потеряете контроль над своим приложением. Особенно, если работаете в команде над общим кодом. |
2007-01-13 |
Своя TopLevel функция. В некоторых встроенных пакетах flash, например в пакете flash.utils, есть свои функции. Импортируя пакет с функцией мы можем её вызвать без указания класса. Аналогично можно объявить функцию в пакете и импортировав пакет , получить к ней доступ |
Своя TopLevel функция. В некоторых встроенных пакетах flash, например в пакете flash.utils, есть свои функции. Импортируя пакет с функцией мы можем её вызвать без указания класса. package { import flash.display.Sprite; public class TopLevelTest extends Sprite { callTopLevel(); } public function callTopLevel():void { trace("i am TopLevel function"); } } Оператор callTopLevel(); – сработает в любом месте программы. Аналогично можно объявить функцию в пакете и импортировав пакет , получить к ней доступ package { import functions.callFnc; import flash.display.Sprite; public class FncTest extends Sprite { callFnc(); } } Можно разместить или в любом файле с используемом классом, или создать файл с карширением .as, одноимённый с функцией: package functions { public function callFnc():void { trace('calling Fnc'); } } Этот момент не принципиален, но приятен |
2006-12-29 |
Обзор Flash alpha 9. Document class. Пожалуй начнём с Flash IDE, уверен что более 80% процентов читающих статью и понятия не имеют о других IDE (а может и вовсе не знают что такое IDE ). Поэтому нее буду вас распугивать флексом и FDT Ну и где писать код ? Давайте созданим новый флэш документ, сохраним его в какой-нибудь фолдер. А теперь посмотрим, что нового у нас появилось на панели properties: Попробуем создать такой класс, что бы у нас заработал хоть какой-то код. Проще всего заставить работать функцию trace(); Создадим в фолдере с нашим .fla файл Tracer.as. В котором запишем |
Обзор Flash alpha 9. Document class. Пожалуй начнём с Flash IDE, уверен что более 80% процентов читающих статью и понятия не имеют о других IDE (а может и вовсе не знают что такое IDE ). Поэтому не буду вас распугивать флексом и FDT Итак, у вас уже установлена Flash 9 alpha (если нет, скачайте её здесь). В принципе, это та же восьмёрка, только теперь мы можем творить в ней AS3 (при желании, в параметрах публикации можно изменить версию AS, только помните что AS1/2 и AS3 не совместимы). var a:Number = b; Короче, забыли писать код в кадрах, договорились ? Ну и где писать код ? Давайте созданим новый флэш документ, сохраним его в какой-нибудь фолдер. А теперь посмотрим, что нового у нас появилось на панели properties:
Добавилось одно новое поле Document class (выделено синим). Это имя класса, который будет у нас “рутом” (вобще-то в AS3 понятие root приобрело несколько иной смысл). Попробуем создать такой класс, что бы у нас заработал хоть какой-то код. Проще всего заставить работать функцию trace(); Создадим в фолдере с нашим .fla файл Tracer.as. В котором запишем package { import flash.display.Sprite; public class Tracer extends Sprite { public function Tracer() { trace('Я Tracer. Я буду здесь рутом :)'); } } } Теперь идём в окошко нашего .fla и тестируем. |
2006-12-28 |
Нетипизированный массив, как с этим бороться ? Часть - 1 Для начала привожу цитату Nirth'а: Дело в том, что в таких забавных и пушистых языках, как например Java или C++, массивы являются инвалидами по сравнению с их братьями в ActionScript, например массив может хранить себе только экземпляры одного типа( только числа, только строки, только текстовые поля), и его размер задается в начале, и его нельзя увеличить. Спасением несчастным программистам были КОЛЛЕКЦИИ, которые позволяли хранить экземпляры разных типов (если надо было), размер их был динамическим, их можно было фильтровать и сортировать, и вообще работать с ними было в радость. Действительно, радость. Разработчики подарили нам один тип - Array, который делает всё и сразу, благодаря чему флешерам приходится меньше думать.... Сила AS 3 кроется в типизации, потому, что плеер не тратит время на определение типов. Обращение к полям ссылки с дифинированным типом, происходит намного быстрее. Однако с динамическими объектами всё осталось по-прежнему. Объявив динамически переменную , мы не можем задать ей тип. Плеер тратит кучу времени на поиск типа, но мы можем ему помочь сделать это побыстрее В последнем примере я вообще отказался от массивов используя цепь типизированных ссылок. var m1:My; А вот куда: Добавим в класс My переменную next.
Следует отметить, что на AS2 самый оптимизированный вариант, с в 10 раз меньшим количеством элементов (у меня 1 000 000 повисает и никогда не досчитывается) , занимает более 950 милисекунд. Т.е. здесь AS3 быстрее AS2 более чем в 380 раз. |
Нетипизированный массив, как с этим бороться ? Часть – 1 Для начала привожу цитату Nirth’а: Дело в том, что в таких забавных и пушистых языках, как например Java или C++, массивы являются инвалидами по сравнению с их братьями в ActionScript, например массив может хранить себе только экземпляры одного типа( только числа, только строки, только текстовые поля), и его размер задается в начале, и его нельзя увеличить. Спасением несчастным программистам были КОЛЛЕКЦИИ, которые позволяли хранить экземпляры разных типов (если надо было), размер их был динамическим, их можно было фильтровать и сортировать, и вообще работать с ними было в радость. Действительно, радость. Разработчики подарили нам один тип – Array, который делает всё и сразу, благодаря чему флешерам приходится меньше думать…. Сила AS 3 кроется в типизации, потому, что плеер не тратит время на определение типов. Обращение к полям ссылки с дифинированным типом, происходит намного быстрее. Однако с динамическими объектами всё осталось по-прежнему. Объявив динамически переменную , мы не можем задать ей тип. Отсюда низкая скорость обработки элементов массива. package { public class My { public var a:Number = 0; public var b:Number = 0; public var c:Number = 0; public var sum:Number = 0; } } Допустим, у нас есть огромный массив объектов этого типа. Нам нужно в каждом объекте нужно найти сумму a+b+c и записать в переменную sum. //задаём массив : var ar:Array = []; var i:int = 0; while( i < 1000000){ ar[i] = new My(); ar[i].a = Math.random()*100; ar[i].b = Math.random()*100; ar[i].c = Math.random()*100; i+=1; } // пробегае по массиву, подсчитывая то, что нужно var t:int = getTimer(); i = 0; while( i < ar.length){ ar[i].sum = ar[i].a + ar[i].b + ar[i].c; i+=1; } trace(getTimer()-t); // 1755 Плеер тратит кучу времени на поиск типа, но мы можем ему помочь сделать это побыстрее var ar:Array = []; var i:int = 0; var m:My = new My(); while( i < 1000000){ m = new My(); m.a = Math.random()*100; m.b = Math.random()*100; m.c = Math.random()*100; ar.push(m); i+=1; } // пробегае по массиву, подсчитывая то, что нужно var t:int = getTimer(); i = 0; var l:int = ar.length; while( i < l){ m = ar[i]; m.sum = m.a + m.b + m.c; i+=1; } trace(getTimer()-t); // 45 Т.е. явно преобразуя тип и убрав сравнение с длиной массива, мы сократили время в 40 (!) раз. В последнем примере я вообще отказался от массивов используя цепь типизированных ссылок. var m1:My; А вот куда: Добавим в класс My переменную next. package { public class My { public var next:My = null; public var a:Number = 0; public var b:Number = 0; public var c:Number = 0; public var sum:Number = 0; } } // создаём объекты ссылающиеся друг на друга поцепочке. var m:My = new My(); var i:int = 0; var prevElement:My; while( i <= 1000000){ m = new My(); m.a = Math.random()*100; m.b = Math.random()*100; m.c = Math.random()*100; if(i != 0) prevElement.next = m; else firstElement = m; prevElement = m; i+=1; } // переходим в начало цепи и работаем с каждым элементом последовательно var t:int = getTimer(); i = 0; m = firstElement; // мы викинули счётчик и сравнение while(m != null){ m.sum = m.a + m.b + m.c; // и избавились от конвертации и проверки типов m = m.next; } trace(getTimer()-t); // 25 Как видите у этого способа есть существенный недостаток – мы не можем выбрать произвольный элемент в цепочке. Есть мысли обойти этот недостаток, ноя не готов ещё их опубликовать Следует отметить, что на AS2 самый оптимизированный вариант, с в 10 раз меньшим количеством элементов (у меня 1 000 000 повисает и никогда не досчитывается) , занимает более 950 милисекунд. Т.е. здесь AS3 быстрее AS2 более чем в 380 раз.
|
2006-12-25 |
Публичные переменные...это зло Вместо публичных переменных, нужно использовать свойства (get/set). Примером НЕ использования свойств может служить стандартный класс as3 flash.geom.Point, в котором атрибуты x и y определены как публичные переменные. Что из этого следует ? Как с этим жить? 2)Ещё как вариант сделать обёртки над классами принимающими Point, поменять их на IPoint, но это сразу видно работа не благодарная… так, что без кровного решения проблемы я пока не нашел…. |
2006-12-21 |
Плавная кнопка Итак, у вас есть клип кнопки, вы красиво нарисовали все переходы. На тайм лайне вы рассчитали как кнопка красиво переливаясь принимает положения up, over, down.... Класс: selected:Boolean [read-write] toggle:Boolean [read-write] Создание radioButton группы |
Отрезки, точки, измерение углов Выложу несколько классов для работы с геометрией, которые я часто использую. Класс точки: А вот класс отрезка или, как это называют в зарубежной литературе, - edge. Включает в себя 4 элемента - точку начала, конечную точку (если потребуется работать с отрезком как с вектором) и коэффициенты k, b. k- угловой коэффициент, b - смещение по оси Oy. Методы cross(e:Edge):Object Свойства b:Number [read-only] k:Number [read-only] p1:APoint length:Number [read-only] Правда в этом классе есть один недостаток. Если пересечением двух отрезков являться другой отрезок , то функция возвращает null вместо точки p, однако однако следовало бы возвращать отрезок. |
2006-11-24 |
Ассоциация классов с объектами библиотеки во Flash 9 alpha Речь пойдет о свойстве linkage муви клипов библиотеки или скорее его отсутствии в Flash 9. Объектная модель графических объектов в as3 сильно изменилась. В частности исчез метод attachMovie. Теперь используются:
Проблема заключается в том, что в as3 нельзя назначить один класс двум различным клипам библиотеки. Компилятор не сможет определит с каким клипом ассоциировать класс. Выходы из положения заключается в: 1) создании нескольких одинаковых классов, с различными именами например от общего родителя; 2)Пожалуй единственный способ который не создает одинаковые классы это загрузка внешнего swf; 3)Также возможно включать внешний ресурс для класса:
4) Использовать Embed, для свойства,
Далее следует вопрос, как эти классы использовать? |