вторник, апреля 29, 2008

Эффект Fade для текста без внедрения шрифта

Как известно, чтобы применить эффект Fade к тексту (плавное его появление и исчезновение), необходимо, чтобы соответствующий шрифт был внедрен в приложение. Но в результате размер приложения существенно увеличится. Чтобы избежать этого, но сохранить красоту эффекта, необходимо перед началом превратить текст в битмап с помощью пустого эффекта BlurFilter с нулевыми значениями:
private function addBlurFilter():void {
var bf:BlurFilter = new BlurFilter(0,0,0);
var myFilters:Array = new Array();
myFilters.push(bf);
label.filters = myFilters;
}
А потом уже запускать эффект Fade.
Есть еще один способ - применить эффект Dissolve. В отличии от Fade, который работает непосредственно с элементом, Dissolve создает непрозрачный прямоугольник над элементом и работает уже с ним. Но этот эффект хорошо смотрится только на белом фоне, так как иначе он будет виден поверх нашего объекта.
Отсюда

среда, марта 26, 2008

RubyIZUMI - опенсорсный RTMP сервер (MP4/H.264) для потокового Flash видео и аудио

Takuma Mori из Vixy.tv недавно зарелизил RubyIZUMI - открытый потоковый сервер (Ruby) для проигрывания H.264 видео.
Демо.

вторник, марта 25, 2008

Атрибуты метатега SWF

Официально опубликованы все атрибуты метатега SWF

[SWF width="#"
height="#"
widthPercent="#"
heightPercent="#"
scriptRecursionLimit="#"
scriptTimeLimit="#"
frameRate="#"
backgroundColor="#"
pageTitle="String"]

Напомню, что данный тег должен располагаться непосредственно перед определением AS-класса:

[SWF(width="1024", height="768", frameRate="31", backgroundColor="#000000")]
public class Main extends Sprite {...

четверг, марта 20, 2008

Повышение производительности AS3 приложений

Здесь представлены некоторые приемы, которые помогут повысить производительность наших приложений:

1) Создавайте константы для часто используемых объектов типа new Point(0,0) или new Rectangle(0,0,320,240):

//вызов 100000 раз: 75мс
new Point(0,0);
//или
private static const POINT:Point = new Point(0,0);
//8мс
POINT;


Быстрее на 838%

2) Сократите указания на статические члены классов. Вместо этого старайтесь использовать переменные пакета:
//15мс
SomeClass.somevar;
package somepackage{
public const somevar:int;
}
//8мс
somevar;

на 66% быстрее

3) Сохраняйте getter свойства в локальных переменных при их использовании более одного раза.

somesprite.graphics.clear();
somesprite.graphics.beginFill(0x000000);
somesprite.graphics.drawRect(0,0,10,10);
somesprite.graphics.endFill();

// лучше заменить на

var n:Graphics = somesprite.graphics;
n.clear();
n.beginFill(0x000000);
n.drawRect(0,0,10,10);
n.endFill();


4) Создавайте собственные reflection-методы вместо использования getDefinitionByName(getQualifiedClassName(object))
utils reflection
// 503мс
var someclass:Class = getDefinitionByName(getQualifiedClassName(someObject));
// getter reflection
public class SomeClass {
public function get reflect():Class {
return SomeClass;
}
}
// 9мс
var someclass:Class = object.reflect();

быстрее на 5489%

5) Страрайтесь использовать строгое типизирование

6) Приводите к нужным типам, например, при чтении из массива.
Быстрее будет обращаться к image

var image: BitmapData = images[index];
image.getPixel(x,y)
//чем к
images[index].getPixel(x,y);


7) Где возможно, используйте int вместо Number

8) Операторы побитового сдвига работают быстрее:

Побитовый сдвиг влево быстрее на 300% при умножении на любую степень двойки:

x = x * 2;
x = x * 64;
//равно:
x = x << 1;
x = x << 6;


Побитовый сдвиг вправо быстрее на 350% при делении на любую степень двойки:

x = x / 2;
x = x / 64;
//равно:
x = x >> 1;
x = x >> 6;


Извлечение компонентов цвета:

//24bit
var color:uint = 0x336699;
var r:uint = color >> 16;
var g:uint = color >> 8 & 0xFF;
var b:uint = color & 0xFF;
//32bit
var color:uint = 0xff336699;
var a:uint = color >>> 24;
var r:uint = color >>> 16 & 0xFF;
var g:uint = color >>> 8 & 0xFF;
var b:uint = color & 0xFF;


Объединение компонентов цвета:

//24bit
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = r << 16 | g << 8 | b;

//32bit
var a:uint = 0xff;
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = a << 24 | r << 16 | g << 8 | b;


9) Обмен значениями численных переменных без использования временной переменной:

var t:int = a;
a = b;
b = t;
//равно:
a ^= b;
b ^= a;
a ^= b;


Быстрее на 20%.

10) Инкремент/декремент.
Внимание: это пример понижения производительности, но зато есть возможность понизить читабельность кода для врагов:)

i = -~i; // i++
i = ~-i; // i--


11) Смена знака с помощью NOT или XOR (говорят на 300% быстрее):

i = -i;
//равно:
i = ~i + 1;
//или
i = (i ^ -1) + 1;


12) Подсчет остатка

Если делитель является степенью двух, то остаток можно подсчитать быстрее на 600% следующим образом:
остаток = делимое & (делитель - 1);

x = 131 % 4;
//равно:
x = 131 & (4 - 1);


13) Проверка на четность/нечетность:

isEven = (i % 2) == 0;
//равно:
isEven = (i & 1) == 0;


Быстрее на 600%.

14) Абсолютное значение. Версия 1 быстрее на 250%, чем Math.abs(), а версия 2 быстрее на 20%, чем версия 1.

//версия 1
i = x < 0 ? -x : x;
//версия 2
i = (x ^ (x >> 31)) - (x >> 31);


15) Сравнение двух числе на равенство знаков

eqSign = a * b > 0;
//равно:
eqSign = a ^ b >= 0;


На 35% быстрее.

16) Быстрое конвертирование цвета из R5G5B5 в R8G8B8

R8 = (R5 << 3) | (R5 >> 2)
G8 = (R5 << 3) | (R5 >> 2)
B8 = (R5 << 3) | (R5 >> 2)

17) a++ быстрее, чем a = a + 1 и т.п.

18) Умножение быстрее деления.

Лучше использовать a = b*.5 вместо a = b / 2

19) int(1.5) быстрее, чем Math.floor(1.5)
Аналогично int(1.5) + 1 быстрее, чем Math.ceil(1.5)

пятница, февраля 29, 2008

Улучшаем Flash 9 IDE

Lee Brimelow предлагает вашему вниманию три кастомные панельки для Flash IDE:
  • Event Generator - генератор событий. Необходимо выбрать мувиклип, открыть панель (Window > Other Panels), определить необходимые события, скопировать в буфер и потом вставить готовый код куда нужно. Это значительно облегчает монотонные записи добавления событий.
  • Калькулятор - считаем не выходя из любимой IDE.
  • Панель заметок позволяет легко сохранять интересные куски кода с названиями.
Также автор выложил видео Building Custom Flash Panels о том, как создавать собственные панели.

четверг, февраля 28, 2008

Использование RSL классов фреймворка и кэширование в плеере

Эта статья является вольным и неполным переводом статьи из хелпа по поводу использования RSL и кэширования плеера.

Каждое Flex приложение использует Flex фреймворк, который сам по себе является широким набором классов, определяющих инфраструктуру приложения. Если пользователь загружает два различных приложения, то эти приложения будут содержать одни и те же классы фреймворка.

Чтобы не внедрять одни и те же классы на этапе компиляции, можно использовать внешние библиотеки классов (Runtime Shared Libraries или RSL) классов flex-фреймворка, то есть подгружать эти классы на этапе загрузки приложения. Существует два вида RSL классов фреймворка – подписанные и неподписанные. Подписанные RSL кэшируются плеером, доступ к ним возможен из любых приложений вне зависимости от доменов. Они не удаляются при очистке кэша браузера. Неподписанные RSL кэшируются браузером и могут использоваться только приложениями, которые имеют доступ к домену RSL.

Flash Player 9.0.115 поддерживает загрузку подписанных RSL классов фреймворка. Эти RSL имеют расширение SWZ, и только Adobe может их создавать. Для плееров версий ниже 9.0.115 будут автоматически загружаться запасные неподписанные RSL, если конечно они были определены при компиляции приложения.

Только приложения, скомпилированные с помощью Flex 3, могут использовать подписанные RSL.

Существующие RSL

Для SDK RSL классов фреймворка находятся в папке flex_sdk_dir/frameworks/rsls, для Flex Builder - flex_builder_dir/sdks/3.0.0/frameworks/rsls. Файлы именуются следующим образом – версия Flex плюс версия сборки компилятора. Следующие RSL классов фреймворка включены в продукты Flex:

  • framework_3.0.build_number.swz (подписанная RSL классов фреймворка)
  • framework_3.0.build_number.swf (неподписанная RSL классов фреймворка)
  • rpc_3.0.build_number.swz (подписанная RSL классов сервисов данных (data services)
  • rpc_3.0.build_number.swf (неподписанная RSL классов сервисов данных)
  • (Только для Flex Builder) datavisualization_3.0.build_number.swz (подписанная RSL классов визуализации данных)
  • (Только для Flex Builder) datavisualization_3.0.build_number.swf (неподписанная RSL классов визуализации данных)

Данные библиотеки уже оптимизированы.

Flex также включает некоторые SWC файлы, которые можно использовать как стандартные или кросс-доменные RSL. Эти библиотеки неоптимизированны и не подписаны. Они находятся в папке frameworks/libs: automation.swc и qtp.swc. Это классы для автоматизированного тестирования приложения.

Кэш плеера

По умолчанию, максимальный размер кэша плеера равен 20MB. После превышения этого размера кэш автоматически очищается от файлов, которые реже всего использовались. Очистка происходит, пока размер кэша не станет меньше 60%, то есть по умолчанию 12MB. С помощью Settings Manager можно регулировать место, отведенное под кэш плеера.

В следующей таблице показаны папки, в которых плеер хранит кэш:

Windows 95/98/ME/2000/XP - C:\Documents and Settings\user_name\Application Data\Adobe\Flash Player\AssetCache\

Windows Vista - C:\Users\user_name\AppData\Roaming\Adobe\Flash Player\AssetCache\

Linux - /home/user_name/.adobe/Flash_Player/AssetCache/

Mac OSX - /Users/user_name/Library/Cache/Adobe/Flash Player/AssetCache/

Использование RSL классов фоеймворка

Использовать RSL классов фреймворка просто:

  1. заходим в свойства проекта;
  2. Flex Build Path -> Library Path
  3. Раскрываем Flex 3 -> framework.swc -> Link type -> Edit
  4. Ставим в выпадающем списке RSL и добавляем (Add) 2 файла – framework_build_number.swz и framework_build_number.swf
  5. Теперь эти два файла сохранятся в вашем проекте

Кстати, размер пустого приложения при использовании внешних библиотек сократился со 150 Кб до 50, правда сама библиотека весит порядка 550Кб, но она сохраняется в кеше и грузится только один раз.

среда, февраля 27, 2008

Проект Open Flash Chart

Наткнулся на интересный проект - Open Flash Chart. Попросту говоря, это приятные на вид flash-графики, которые можно легко вставлять на свои страницы.
Проект в первую очередь разрабатывается для PHP, но есть версии и для Java, Perl, Python, Ruby and Rails и .NET (правда, не факт, что они будут той же версии, что и для PHP). В частности, для Ruby and Rails плагин, которые позволяет в два счета создать нужный график.
Кстати, использовать графики можно абсолютно бесплатно, но помощь приветствуется.

четверг, февраля 14, 2008

E4X запросы с учетом namespace'ов

Допустим у нас есть некий XML (например, rss поток):
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
<item>
<title>News feeds from the BBC</title>
<description></description>
<link>http://news.bbc.co.uk/go/rss/-/1/hi/help/rss/3223484.stm</link>
<guid isPermaLink="false">http://news.bbc.co.uk/1/hi/help/rss/3223484.stm</guid>
<pubDate>Mon, 21 Aug 2006 08:34:42 GMT</pubDate>
<category>RSS</category>
<media:group>
<media:category>RSS</media:category>
<media:copyright>(C) British Broadcasting Corporation</media:copyright>
</media:group>
</item>
</channel>
</rss>
Чтобы получить данные тегов из пространства имен media необходимо поступить следующим образом:

1) создать пространство имен
var media:Namespace = new Namespace("http://search.yahoo.com/mrss/");

2) обращаться к необходимым узлам с использованием этого пространства имен
var copyright:String = xml.channel.item.media::group.media::copyright.text();

3) Ответ верный:
(C) British Broadcasting Corporation

пятница, февраля 01, 2008

Ошибка при отсутствии атрибута в XML

Возьмем простой xml типа

<data>
<row owner="Andrey"/>
<row owner="Peter"/>
<row/>
</data>


Нам необходимо получить все записи, у которых owner = "Andrey".
Делаем как всегда:

var res:XML = httpServ.lastResult as XML;
var rows:XMLList = res.row.(@owner=="Andrey");


Вылезает ошибка:

ReferenceError: Error #1065: Variable @owner is not defined.

Чтобы решить эту проблему в лоб, нужно для всех узлов прописать атрибут owner, что не очень хорошо. Поэтому есть альтернативные виды получения этой информации:

1 способ:

var rows:XMLList = res.row.(attribute("owner")=="Andrey");

2 способ:

var xml:XMLList = res.row.(hasOwnProperty("@owner")==true && @owner=="Andrey");

понедельник, января 21, 2008

Новый проект As3Eval

As3Eval - это библиотека, позволяющая динамически компилировать некоторый ecmascript внутри плеера. Она находится сейчас в стадии разработки, поэтому применять ее в реальных проектах врядли получится. Библиотека состоит из портированного es4 "esc" компилятора, доступного из проекта Tamarin.

Демо
В закладке Eval UI можно увидеть сгенерированный байткод. Также можно вставить дамп (hexdump -C) свфки и дизассемблировать его.
Исходный код
SWC

вторник, января 15, 2008

Разновидности Flex-специализаций

Яков Файн обещал флексовый бум в 2008 году. И вот он настал и флекс-программисты сейчас в большом дефиците (имеются ввиду, наверно США). В настоящий момент его команда работает над двумя проектами, суть которых состоит в переносе приложений с Java на Flex. В этих проектах естественно участвуют Flex-разработчики. Поэтому вашему вниманию предлагается их классификация:

1. Разработчики GUI (графического пользовательского интерфейса)
2. Разработчики Flex-компонентов
3. Flex-архитекторы

К первой группе относятся люди, способные создать внешний вид приложения. Это так называемая стартовая позиция в иерархии Flex-профессий. Вам необходимы лишь базовые знания программирования. Статьи и презентации евангелистов создают впечатление, что работа с Flex достаточна проста - накидал компонентов, выровнял их, повесил пару функций на кнопки и вуаля. Как Visual Basic в вебе. Этому легко обучиться самому, поэтому не ждите больших дидвидендов от этой позиции, так как многие также легко могут это постигнуть.

GUI разработчики взаимодействуют с веб-дизайнерами, которые создают шаблоны приложения.

Рассмотрим следующую позицию - разработчики компонентов. Эта каста должна объединять в себе знания предыдущей группы плюс знания в области объектно-ориентированного и событийного (event-driven) программирования. Знания паттернов проектирования также поможет, но здесь будьте осторожны. Особенно, это относится к людям, пришедшим из Java. Не злоупотребляйте паттерном MVC. Шаблон, созданный дизайнером, должен быть разбит на несколько компонентов, взаиммодействующих друг с другом. Поэтому использования паттерна Mediator здесь подойдет лучше (пример).

Также помните, что, хотя ActionScript 3 очень похож на Java, он дает нам динамическое программирование, поэтому нет необходимости создавать тонны строго определенных объектов как в Java.

Третья группа знает все, что и две предыдущие плюс эти люди имеют представление обо всем приложении в целом, о его структуре, способах взаимодействия с сервером, взаимодействия между компонентами, эффективности его работы. Flex-архитектор никогда не предложит использовать фреймворк для создания простого видео-плеера (пример). Эти знания за неделю не получишь, здесь нужно как серьезное обучение, так и практический опыт и знания других языков программирования.

В небольших командах обычно последние две специализации объединены в одном человеке. Если для вашего проекта необходимо создание собственного фреймворка на основе Flex-фреймворка, то вам понадобятся фреймворк-кодеры.

Ну и как в Голливуде:
Если вы хотите изучить Flex, дерзайте и вступайте в растущее Flex-сообщество. Решите, кем вы хотете быть и идите к этой цели. Be what you can be.

Оригинал

пятница, января 11, 2008

Pacifica - VoIP-проект от Adobe

На MAX 2007 Adobe анонсировал новый проект под кодовым названием "Pacifica". Было продемонсрировано простое приложение с использованием высококачественного голосового кодека. Качество было настолько высоким, что некоторые не верили, что это VoIP.

Несколько фактов о Pacifica:
  • Pacifica разработана на основе открытого SIP протокола;
  • Основной целью является поддержка высокого качества звука;
  • Сейчас Pacifica позволяет осуществлять P2P передачу медиа-данных с помощью серверов;
  • Одной из задач является уход от сложных серверных решений, которые необходимы сейчас для VoIP технологий.

Планы по развитию проекта:
  • Поддержка Video over IP;
  • Поддержка AIR приложений;
  • Поддержка стандартных телефонных сетей;
  • Поддержка текстовых сообщений и др.

Участвовать в разработке можно пройдя небольшой опрос.

Официальный сайт проекта

понедельник, декабря 31, 2007

Всех с Новым годом!

Дорогие друзья! Поздравляю всех вас с наступающим праздником, желаю, чтобы все ваши мечты сбылись, планы реализовались, а счастье и удача не покидала вас!

среда, декабря 26, 2007

Tree vertical-scroll баг

Столкнулся с такой проблемой.
При открытии нода дерева с сервера приходят данные об его дочерних элементах, изменяется этот узел датапровайдера, дети отображаются. Все вроде бы ничего, но если по высоте элементы не влезают в дерево, вертикальный скроллинг появляется только после повторного открытия нода (когда он уже знает о своих детях).
Решение - использовать кастомный dataDescriptor. Нашел в блоге Joan Lafferty здесь.

Бажное приложение:
treeScrollAuto.mxml
treeScrollAuto.swf
Решение:
treeScrollAutoFixed.mxml
myDescriptor.as
treeScrollAutoFixed.swf

среда, декабря 05, 2007

Девайс от Nokia с девятым флеш-плеером

На днях мне подсказали, что у Nokia вышла усовершентсвованная версия интернет-планшета N810, подробную спецификацию которого можно посмотреть на странице продукта. Скажу лишь, что там есть мозилла-подобный браузер, поддерживающий вебстандарты и AJAX и Adobe® Flash® 9 плагин с поддержкой потокового видео и аудио. Данный аппарат является последователем N800, который также имеет девятый плеер и, в отличии от новой модели, уже продается в России по цене от 15 до 18 тысяч рублей.

Скринкаст Papevision3D 2.0

Ralph Hauwert разместил у себя скринкаст (8 Мб), в котором показаны основы работы с Papevision3D второй версии на примере создания небольшого приложения с вращающимися сферами(исходники).

пятница, ноября 23, 2007

Онлайн-сервис для трассировки изображений в вектор

VectorMagic - новый сервис, позволяющий загрузить картинку, сконвертировать ее в вектор и сохранить результат в eps, svg или png.

вторник, ноября 13, 2007

Новый Flex - новые чарт-компоненты

Громко сказано, но отчасти правда. Сегодня наткнулся на платный компонент ILOG Elixir, который расширяет возможности и виды существующих чарт-компонентов. В чарт-терминах я особо не разбираюсь, поэтому почитайте про фичи на странице проекта (скажу лишь, что возможно создавать трехмерные графики). Компонент платный, релиз обещают к выходу третьего флекса, текущую бету можно взять здесь. Тем не менее неутомимый Коэнратс уже вовсю делает примеры с исходниками.

четверг, ноября 01, 2007

Flare visualization toolkit

Flare - это коллекция ActionScript 3 классов для создания разнообразных интерактивных визуализаций, например, при создании графиков, сложных анимаций, диаграмм и т.п. Flare основан на prefuse, богатом инструменте для визуализаций, написанном на Java. Flare является опенсорсным (BSD) и может спокойно использоваться для коммерческих целей.
Скачать
Демо
Урок
API докуметация

понедельник, октября 29, 2007

AIR SQLite Admin от Коэнратса

Кристоф Коэнратс обновил свое приложение по администрированию SQLLite. Вы сможете создавать и удалять базы, выполнять различные запросы. Приложение кэширует все запросы в специальном файле sqladmincache.db, использует синхронные операции с БД и schema API для вывода информации о таблицах вашей базы.

Mozilla представляет Prizm - симбиоз веба и десктопа

На днях Mozilla Labs анонсировала новый проект Prizm (бывший WebRunner)


Как говорят разработчики, это не новая платформа, а просто полезное совмещение декстопных приложений, построенный с помощью XUL (XML User Interface Language) и современных веб-технологий. Если вкратце - Prizm позволяет добавлять ваши любимые веб-приложения на десктоп и запускать их оттуда.


Новость интересная. Даже адобы в комментах начали к словам придираться. Пойду качать и разбираться.

UPDATE: Вот более подробная инфа.

вторник, октября 23, 2007

Экспорт из DataGrid в Excel через буфер

Немного переделал функцию по экспорту данных из dataProvider'а DataGrid в Excel. В качестве источника данных выступает ArrayCollection.

private function exportToExcel(dg:DataGrid, fields:Array):void
{
var dp:ArrayCollection = dg.dataProvider as ArrayCollection;
if (dg == null || dp==null || dp.length==0 || fields == null || fields.length==0) {
Alert.show("Ошибка экспорта.");
return;
}
var i:int;
var j:int;
var l_dp:int = dp.length;
var l_f:int = fields.length;
var result:String = "";
for (i=0; i<l_f; i++)
{
result += fields[i][1];
if (i!=(l_f-1)) result+='\t';
}
result +='\r\n';
for (i=0; i<l_dp; i++)
{
for (j=0; j<l_f; j++)
{
var prop:String = fields[j][0];
var l_col:int = dg.columns.length;
var k:int;
for (k=0; k<l_col; k++)
{
if (prop == dg.columns[k].dataField)
{
break;
}
}
var f:Function = dg.columns[k].labelFunction;
if (f != null)
{
result += f(dp[i], dg.columns[k]);
}
else result += dp[i][prop];
if (j!=(l_f-1)) result+='\t';
}
result +='\r\n';
}
System.setClipboard(result);
}

Вызываем так:

exportToExcel(grd,
[['title','Заголовок'], ['rank','Рейтинг'],
['views', 'Просмотров'],['comp', 'Конкурсы'],
['access', 'Доступность'], ['pics','Количество изоб-й']])
,

grd - id нашего DataGrid, а делее идет массив с dataField и заголовками колонок.
При экспорте также учитывается labelFunction. После выполнения функции данные можно смело вставлять в таблицу Excel.

Свежие видео-уроки от GotoAndLearn.com

Я не знаю, в курсе вы или нет, но существует замечательный ресурс GotoAndLearn.com с интересными видео-уроками от Lee Brimelow. На сайте представлено порядка 40 туториалов начиная с 7 версии и до Flash CS3 и AIR приложений. Из свежих:
- Вебкамеры, PNG и AIR
- Использование Document Class
- Drag and Drop в AIR
- Разработка AIR во Flash
- Основы Papervision3D

Все уроки подробные и понятные. Язык не обязателен - каждый шаг показан на видео, вплоть до того, как автор набивает код и исправляет ошибки:)

вторник, октября 16, 2007

Случайная ошибка flash.accessibility

Недавно, я случайно при настройке проекта выбрал галочку Generate accessible SWF file. Потом после каждого вызова Alert у меня вываливалась ошибка:
TypeError: Error #2007: Parameter source must be non-null.
at flash.accessibility::Accessibility$/sendEvent()

Случайную галочку пришлось снять:)

среда, октября 10, 2007

SWFObject 2.0 или правильное внедрение Flash на HTML страницу

Скоро выйдет сие чудо второй версии (пока можно скачать третью бету). А покамест я решил перевести статью-документацию по его использованию. Говорят, скоро это будет стандартом Adobe. Кого ломает читать на блоггере (длинные строки кода обрезаются), могут зайти на народ

Как внедрить Flash контент с помощью совместимой со стандартами html-разметки? (1 способ)

ШАГ 1: Внедрение Flash контента и альтернативного контента с помощью совместимой со стандартами html-разметки

SWFObject использует в качестве разметки метод вложенных тегов object с условными комментариями, поддерживаемыми Internet Explorer [http://www.alistapart.com/articles/flashembedcagematch/] , чтобы обеспечить наиболее оптимальную кросс-браузерную поддержку, совместимость со стандартами и наличие альтернативного контента [http://www.swffix.org/testsuite/]:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 - step 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<div>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">
<param name="movie" value="myContent.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
<!--<![endif]-->
<p>Alternative content</p>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>

</div>
</body>
</html>

Заметка 1: Метод вложенных тегов object требует двойное их определение(внешний тег для Internet Explorer и внутренний для остальных браузеров), таким образом задавать все атрибуты и параметры необходимо дважды.

Заметка 2: Атрибуты id, classid, элемент param с movie используются для внешнего object. Атрибуты type и data используются только для внутреннего.

Заметка 3: Мы не рекомендуем использовать атрибут codebase для задания пути к установщику Flash плагина с серверов Adobe, потому что это запрещено согласно спецификации, которая ограничивает его доступ доменом текущего документа. Вместо этого мы предлагаем использовать альтернативный контент с сообщением о возможности загрузки плагина и соответствующей ссылкой.

Как можно использовать HTML для конфиграции Flash контента?

Можно задать следующие атрибуты [http://www.w3schools.com/tags/tag_object.asp] элементу object:

  • id
  • name
  • class
  • align

Можно задать следующие элементы param [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701]:

Почему необходимо использовать альтернативный контент?

Элемент object позволяет размещать альтернатиный контент, который будет показан, если Flash плеер не установлен или не поддерживается. Этот контент также виден для поисковых машин, что немаловажно для SEO.

Недостатки использования метода вложенных объектов?

При более тщательном рассмотрении кросс-браузерности приведенной выше разметки, вы увидите следующие проблемы:

  • Safari 1.2.2 и ниже игнорирует все вложенныеэлемены param
  • Internet Explorer 6+ под Windows XP SP2+ и Opera 9+ будут использовать механизм активации Flash контента по клику.
  • Присутствует риск некорректного отображения (или неотображения вовсе) Flash контента в плеере версии ниже необходимой

Библиотека SWFObject старается решить эти проблемы.

 

ШАГ 2: Внедрение библиотеки SWFObject в HTML страницу

Библиотека SWFObject состоит из внешнего JavaScript файла (размер: 9.8Kb, GZIPed: 3.3Kb).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 - step 2</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<script type="text/javascript" src="swfobject.js"></script>

</head>
<body>
<div>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">
<param name="movie" value="myContent.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
<!--<![endif]-->
<p>Alternative content</p>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</body>
</html>

ШАГ 3: Конфигурация Flash контента через библиотеку SWFObject

Сначала необходимо задайть уникальный id внешнего тегу object. Затем добавьте метод swfobject.registerObject:

  1. Первый аргумент (String, необходим) - это id объекта, заданный ранее.
  2. Второй аргумент (String, необходим) определяет версию Flash плеера, под которую опубликован ваш ролик. SWFObject смотрит только на первые три цифры версии, например, "9.0.18".
  3. Третий аргумент (String, опциональный) может быть использован для активации экспресс-установки плеера [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75] и задает адрес swf-файла экспресс-установки. Данный файл включен в библиотеку SWFObject.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 - step 3</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>

<script type="text/javascript">
swfobject.registerObject("myId", "9.0.0", "expressInstall.swf");
</script>

</head>
<body>
<div>

<object id="myId" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420">

<param name="movie" value="myContent.swf" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420">
<!--<![endif]-->
<p>Alternative content</p>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
</body>
</html>

Как внедрить несколько SWF файлов с помощью первого способа?

Просто повторите шаги 1 и 3 предыдущего радела.

Как ссылаться на активный элемент object с помощью JavaScript (используя первый способ)?

Одним из сторонних эффектов использования метода вложенных объектов является то, что на один SWF существуют два элемента object, но задавать можно только один уникальный атрибут id или name.

Разные браузеры указывают на разные элементы object:

  • Internet Explorer на Windows видит только внешний object, так как внутренний закоментирован для него.
  • Opera и Safari поддерживают нотацию внутреннего object [http://www.swffix.org/testsuite/], ряд: object ActiveX)
  • Firefox, Mozilla and all other Gecko based browsers use the inner object

На активный объект можно сослаться через:

  1. Атрибут id или name внешнего тега
  2. С помощью следующего javascript-кода:
var obj = document.getElementById("myId");
var nestedObj = obj.getElementsByTagName("object")[0];
var ref = false;
if (obj) {
if (!nestedObj || (nestedObj && typeof obj.SetVariable != "undefined")) {
ref = obj;
}
else if (typeof nestedObj.SetVariable != "undefined") {
ref = nestedObj;
}
}
if (ref) {
ref.doSomething(); // например, вызов external interface
}

Как с помощью SWFObject динамически внедрять Flash контент? (второй способ)

ШАГ 1: Создание алтернативного контента с помощью стандартной html-разметки

Метод динамического внедрения следует принципу постепенного улучшения[http://www.adobe.com/devnet/flash/articles/progressive_enhancement.html] и замещает альтернативный HTML контент Flash контентов, если JavaScript и Flash плагины поддержтваются. Сперва создайте альтернативный контент с уникальным id:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 dynamic embed - step 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>

<div id="myContent">
<p>Alternative content</p>
</div>

</body>
</html>

ШАГ 2: Внедрение библиотеки SWFObject в HTML страницу

Библиотека SWFObject состоит из внешнего JavaScript файла (размер: 9.8Kb, GZIPed: 3.3Kb).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 dynamic embed - step 2</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<script type="text/javascript" src="swfobject.js"></script>

</head>
<body>
<div id="myContent">
<p>Alternative content</p>
</div>
</body>
</html>

ШАГ 3: Внедрение SWF с помощью JavaScript

swfobject.embedSWF(swfUrl, id, width, height, version, expressInstallSwfurl, flashvars, params, attributes) has five required and four optional arguments:

  1. swfUrl (String, необходим) - URL SWF файла
  2. id (String, необходим) - id HTML элемента, содержащего альтернативный контент, который будет замещен Flash контентом
  3. width (String, необходим) - ширина SWF файла
  4. height (String, необходим) - высота SWF файла
  5. version (String, необходим) - версия публикации SWF файла
  6. expressInstallSwfurl (String, опцианален) - адрес файла экспресс-установки необходимой версии [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75]
  7. flashvars (Object, опцианален) - переменные flashvars в виде name:value пар
  8. params (Object, опцианален) - параметры вложенного элемента object в виде name:value пар
  9. attributes (Object, опцианален) - атрибуты object в виде name:value пар
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>SWFObject v2.0 dynamic embed - step 3</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="swfobject.js"></script>

<script type="text/javascript">
swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0");
</script>

</head>
<body>
<div id="myContent">
<p>Alternative content</p>
</div>
</body>
</html>

Конфигурация Flash контента

Можно задать следующие атрибуты [http://www.w3schools.com/tags/tag_object.asp] элементу object:

  • id
  • name
  • class
  • align

Можно задать следующие элементы param [http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701]:

Как с помощью объектов JavaScript задавать flashvars, params и атрибуты object?

Создаем соответствующие объекты:

<script type="text/javascript">

var flashvars = {};
var params = {};
var attributes = {};

swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);

</script>

Добавляем пары name:value:

<script type="text/javascript">

var flashvars = {
name1: "hello",
name2: "world",
name3: "foobar"
};
var params = {
menu: "false"
};
var attributes = {
id: "myDynamicContent",
name: "myDynamicContent"
};

swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);

</script>

Или с помощью точечной нотации:

<script type="text/javascript">

var flashvars = {};
flashvars.name1 = "hello";
flashvars.name2 = "world";
flashvars.name3 = "foobar";

var params = {};
params.menu = "false";

var attributes = {};
attributes.id = "myDynamicContent";
attributes.name = "myDynamicContent";

swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);

</script>

Или для однострочников:

<script type="text/javascript">

swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", {name1:"hello",name2:"world",name3:"foobar"}, {menu:"false"}, {id:"myDynamicContent",name:"myDynamicContent"});

</script>

Если вы не хотите использовать аргумент задайте ему значение 'null' или сотавьте пустой объект:

<script type="text/javascript">

var flashvars = null;
var params = {};
var attributes = {
id: "myDynamicContent",
name: "myDynamicContent"
};

swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);

</script>

Объект flashvars можно задать внутри params:

<script type="text/javascript">

var flashvars = null;
var params = {
menu: "false",
flashvars: "name1=hello&name2=world&name3=foobar"
};
var attributes = {
id: "myDynamicContent",
name: "myDynamicContent"
};

swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes);

</script>

Как внедрить несколько SWF файлов с помощью второго способа?

Просто повторите шаги 1 и 3 предыдущего радела.

Как с помощью SWFObject получить информацию о Flash плеере через JavaScript?

 

swfobject.getFlashPlayerVersion() - возвращает JavaScript объект, содержащий версию (major:Number), (minor:Number), (release:Number) установленного плеера:

var playerVersion = swfobject.getFlashPlayerVersion();
var majorVersion = playerVersion.major;

swfobject.hasFlashPlayerVersion(versionNumbersString) - возвращает Boolean, показывающий установлена или нет сооветствующая версия:

if (swfobject.hasFlashPlayerVersion("9.0.18")) {
// есть
}
else {
// нет
}

 

Риски использования SWFObject?

Первый способ

Пользователи, у которых выключен или не поддерживается в браузерах JavaScript, увидят некорректное отображение или ничего не увидят вообще. Подсчитаем убытки:

 

Второй способ

Пользователи, у которых выключен или не поддерживается в браузерах JavaScript, увидят альтернативный контент.

Поддерживает ли SWFObject MIME тип application/xhtml+xml?

Нет.

понедельник, октября 08, 2007

Полезные плагины для FlashDevelop

Alessandro Crugnola рассказывает про свой новый плагин SharedObject Reader для FlashDevelop 3. Остальные полезные плагины можно найти на Google Code. Там представлены:
  • BookmarkPanel
  • AsClassWizard
  • FlashApi
  • SourceOptions
  • StickiesNotes
  • CodeReformatter
  • RegularExpressionPanel
  • SharedObjectReader

Кстати, устанавливать плагины нужно в папку userdir\Local Settings\Application Data\FlashDevelop. Но не торопитесь свалить все сразу. Лучше по одному, потому что я словил 3 ошибки на запуске (но все пашет) и сейчас не могу понять, кто в этом виноват:)

понедельник, октября 01, 2007

Adobe представляет Flash Player 10 "Astro"

На MAX 2007 Adobe анонсировала Flash Player 10 под кодовым именем Astro:
Вот что обещают:

1. Улучшенная работа с текстом

2. "Hydra" - язык написания собственных Bitmap-фильтров.

3. Поддержка 3D. Как говорят очевидцы - разочаровало. Позволяет искажать битмапы в перспективе. 3D теперь software based. Появляются новые свойства типа rotationX, rotationY и rotationZ. В качестве примера было показано видео, которое проигрывалось на плоскости, по которой можно было кликать мышкой. Значит, 3D hardware support для десятки не будет.

Прямо из Чикаго (говорят, дождь идет)

пятница, сентября 28, 2007

Имитатция trace во Adobe Flex

Последнее время появилось несколько полезных утилит, позволяющих потрейсить ваши приложения не прибегая к debug-режиму компиляции. Например, один от Алексея Аникутина и другой от ShaggySmile.
Первый тип неудобен для меня, так как он сделан для Mozilla Firefox, а я привык запускать приложения в осле. А второй подразумевает сперва запуск флешки-приемщика сообщений. И еще - мне не нужны всякие навороты типа табличных данных - мне просто нужен вывод текстовых сообщений, ну там массив протрейсить или строчку какую-нибудь вывести. Без обид, ребят:)

Поэтому, я для себя сделал маленький наворот для html-темплейта приложения. Открываем темплейт, добавляем следующий код сразу после body:

<!--logger-->
<input type="button" onclick="toogleVis()" value="show/hide"/>
<input type="button" onclick="clearLog()" value="clear"/>
<div id="log" style="display:block;">
<script language="JavaScript" type="text/javascript">

function setLog(val)
{
var objDiv = document.getElementById("txt_log");
objDiv.scrollTop = objDiv.scrollHeight;
objDiv.value +=val + "\n";
}

function toogleVis()
{
var objDiv = document.getElementById("log");
objDiv.style.display=(objDiv.style.display=="block")?"none":"block";

}

function clearLog()
{
document.getElementById("txt_log").value="";
}

</script>
<textarea style="width:100%; height:150px;" id="txt_log"></textarea>
</div>
<!--logger-->

На body вешаем обработчик onload="clearLog()".

Теперь в нашем флекс-проекте добавим маленькую функцию:

public function strace(val:*):void
{
var str:String = val.toString();
ExternalInterface.call("setLog", str);
}

Теперь после компиляции проекта и открытии его в браузере, наверху появляется текстовое поле, в которое можно выводить свои трейсы:

strace("Hello world :)");

четверг, сентября 27, 2007

Вышла версия 3D движка Sandy для AS3

Основными особенностями движка являются:
  • совместимость от 7 до 9 версий плеера
  • несколько 3D примитивов, позволяющих быстро создавать необходимые объекты без особых трехмерных знаний.
  • улучшенное и простое управление объектами, позволяющее без труда их масштабировать, вращать, двигать и т.п.
  • улучшенное управление камерой.
  • загрузка сложных объектов (.ASE, Collada, 3DS)
  • система материалов для управления внешним видом моделей
  • использование Flash-фильтров для создания приятных эффектов

Сайт проекта. Вот демки, отсюда можно скачать.

среда, сентября 26, 2007

Тонкости addFrameScript

Существует недокументированная функция addFrameScript, которая может быть иногда полезна. Она позволяет задать функцию, которая будет вызываться при прохождении мувиклипом соответствующего кадра. Эта функция является отличной альтернативой коду в кадрах.

Вот ее синтаксис:
MovieClip.addFrameScript(frame_number:uint,function_to_call:Function)

Пример:

function myFunction()
{
trace('10th frame')
}

addFrameScript(9, myFunction); // кадры нумеруются с 0


Осталось только научится передавать параметры в эту функцию. Тут нам поможет класс Delegate от Ian Thomas.

package
{

public class Delegate
{
public static function create(handler:Function,...args):Function
{
return function(...innerArgs):void
{
handler.apply(this,innerArgs.concat(args));
}
}
}
}


Теперь мы можем вызывать нашу функцию с параметрами:

package {

import flash.display.*;

public class main extends Sprite {


public function main() {
for (var i:int=0; i<10; i++) {
var mc:MovieClip = new Quad() as MovieClip;
addChild(mc);
mc.addFrameScript(mc.totalFrames-1,Delegate.create(myFunction,i));
}
}

private function myFunction(i:int):void {
trace(i);
}
}
}


Оригинал

Кстати, Денис Коляко недавно ниписал класс ClipFactory.

Класс ClipFactory позволит вам создавать обычный мувиклип с указанным количеством пустых кадров, который вы в последствии сможете использовать в качестве анимационного клипа, выполняя действия в каждом кадре (навесив обработчики через метод addFrameScript).

четверг, сентября 20, 2007

HTML во Flex - теперь еще проще!

Alistair Rutherford расширил созданный когда-то Кристофом Коэнратсом компонент для отображения HTML во Flex через IFrame. Использовать его достаточно просто, поддерживаеся несколько HTML окон, видимость контролируется автоматически. В общем - исходники, пример, почитать.

FunFX - фреймворк на Ruby для тестирования Flex приложений

Во время разработки большого приложения желательно быстро находить и исправлять возникающие ошибки. Здесь нам поможет Flex automation framework. Он делает возможным эмулировать действия пользователя во Flex интерфейсе. То есть вы можете написать скрипт, который будет выполнять серию действий (нажатие кнопки, заполнение формы и т.п.) и запустить его. Неплохо, не правда ли? Но загвоздка в том, что до настоящего времени существовало только одно решение для работы с Flex automation framework и оно достаточно дорогое. Но к счастью, теперь есть альтернатива.

FunFX - это бесплатный, опенсорсный фреймворк, разрабатываемый Peter Motzfeldt и позволяющий использовать Flex automation framework с помощью Ruby-скриптов. Сейчас он на ранней стадии разработки, но как видно из видеоурока, он уже много чего умеет. Загрузить можно отсюда.

Оригинал

вторник, сентября 11, 2007

Новый микросайт Audi

В рассылке увидел анонс нового сайта Audi A4, выполненного с помощью Papervision3D.

А вы еще удивляетесь, почему так быстро Джону Грдену на макбук собрали.

Как добраться до мувиклипов вашей 9 флешки из флекс-приложения

Допустим, есть какая-нибудь флешка, скомпилированная под 9 и AS3. Чтобы добраться до объектов ее сцены (например, мувиклипов) необходимо сперва сделать функции-геттеры в этой флешке, которые можно разместить прямо в кадре:

function getMC():MovieClip
{
    return mc; // mc - instance name
}


Далее, по идее, мы загружаем это творение через SWFLoader (например, swf_loader) и на событии complete вешаем обработчик со следующим кодом:

var swf_stage:MovieClip = MovieClip(swf_loader.content);
var mc:MovieClip= MovieClip(swf_stage.getMC());


Теперь мы можем использовать этот мувиклип нужным образом.

понедельник, сентября 03, 2007

Блог об интеграции Papervision3D и Flex

На днях в рассылке был проанонсирован новый блог, целью которого автор ставит:
- позволить флекс-программистам использовать MXML для построения сцен.
- использовать стиль программирования флекс-эффектов для создания анимации.
- добавлять 3d события для управления inline ActionScript кодом.
- создать DisplayObject3D-обертку для внедрения 2D flex UI компонентов в 3D сцену.
- обеспечить встроенные режимы 3d навигации?!
Есть примерчик с кодом.
В общем, начало интересное. Буду следить.

четверг, августа 30, 2007

Полезные статьи и переводы на Garbage Collector

Хочу поблагодарить Юрия Юрового за то, что он выложил все мои старые переводы к себе в Garbage Collector. Кстати, кто еще не знает, у него на сайте есть раздел Downloads, где можно найти материалы по Flash Lite, Flex, FDT и SWFObject.

вторник, августа 28, 2007

Degrafa - Declarative Graphics Framework

Недавно нашел очень интересную разработку - Degrafa. Вот как определяют ее сами авторы:
"Degrafa is a project dedicated to the development of a Declarative Graphics Framework for Flex 2."
Вот примерчики для затравочки.

среда, августа 22, 2007

Проблемы загрузки SWF 9 во Flex 2 приложения

Если при загрузке флешки во флекс вываливается ошибка:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Main$iinit()


, где Main - document class флешки, то необходимо проверить нет ли ссылок на stage в этом или других классах флешки. Если таковые есть (например, идет ссылка на размеры сцены), то придется их каким-то образом заменить (например, на жесткие значения) или убрать вообще.

вторник, августа 07, 2007

Проект TileUI - Microsoft Surface в браузере

Не так давно Рост писал про комп нового поколения Microsoft Surface.
Хотите попробовать его в действии? Пожалуйста! Дуг Маккун начал проект TileUI, в котором он разрабатывает десктоп на принципах, показанных в демках Surface.



Это плоды его трудов за 12 дней.

среда, августа 01, 2007

Для кругозора - WPF

Наткнулся на сайт www.nibblestutorials.net с краткими графическими уроками по созданию WPF-приложений.

Как читать Flex Cookbook из Eclipse?

С помощью плагина RssReaders.
Устанавливается стандартно через Software Updates. Адрес - http://flex.actionscript.it/plugins/Rss_Readers/. В комплекте идет еще и Css Advisor.

вторник, июля 31, 2007

Как можно использовать свойство data у кнопок

Ситуация следующая: имеем массив данных, структура которого состоит из идентификатора элемента и его имени. Требуется создать кучу кнопок с именами элементов массива, чтобы при нажатии на них мы знали, какой идентификатор присвоен этой кнопке.

Делаем кнопки в цикле:

var lb:LinkButton = new LinkButton();
lb.label = dp[i]["name"];


а идентификатор заносим в свойство data:

lb.data = dp[i]["id"];

Теперь эти данные при нажатии на кнопку можно легко выудить через

event.target.data.

понедельник, июля 23, 2007

Использование Flex Component Kit для Flash CS3

Все мы помним старый пример Питера Энта про шарики и звездочки, где из флекса можно было ими уравлять.



Сейчас, с выходом Flash CS3 и Flex Component Kit взаимодействие между флеш-компонентами и флекс-приложением становиться еще удобнее.

Создание Flash CS3 документа

Для начала необходимо создать новый Flash CS3 документ (star_and_ball.fla). Можно порыться в старых исходниках и вытащить оттуда символы шарика и звездочки, можно нарисовать их самому. Самое главное - чтобы они были отдельными символами с точкой регистрации (0;0). Далее создаем новый символ StarAndBall, помещаем туда наши запчасти на отдельные слои и создаем гайдлайн для движения звездочки вокруг шарика.

Создание Flex компонента

После установки кита (установка проста - загрузили и установили .mxp расширение к флешу.) выбираем символ в библиотеке и в меню команд выполняем новую команду "Make Flex Component". Происходит следующее:
1. Устанавливается фреймрейт в 24fps (чтобы соответствовать флексовому умолчанию).
2. Окно вывода показывает, что UIMovieClip был добавлен и StarAndBall готов к экспорту.

Загляните в свойства символа и посмотрите, что там добавилось.

Публикация

Опубликуем документ, задав в настройках не только компиляцию свф, но и swc: star_and_ball.swf и star_and_ball.swc. Сфка нам сейчас не нужна.

Использование Flash компонента во Flex

Создадим новый флекс-проект, зайдем в его Project Properties и добавим в "Add SWC" нащ star_and_ball.swc.

Флекс сейчас верит, что в star_and_ball.swc находится настоящий флексовый компонент StarAndBall. Чтобы его использовать начните печатать:

<Star

Автокомплит вам подскажет - <local:StarAndBall. Закроем тег и запустим приложение. Вы увидите наш шарик и звездочку!

Сейчас вы можете сказать - зачем сей геморрой, если можно использовать простой SWFLoader? Но нам важно другое - то, что флекс нашел наш символ как класс - и это благодаря UIMovieClip!

Объекты

В старом примере мы могли запускать и останавливать анимацию, вызывать методы с помощью LocalConnection. В предпоследнем примере методы, расположенные на таймлайне, можно было вызывать напрямую.

Сейчас мы сможем вызывать методы, которые принадлежат нашему новому классу!

Вернемся в star_and_ball.fla, откроем свойства символа StarAndBall и увидим, что класс называется StarAndBall. Если нажать кнопочку редактирования рядом, будет сообщено, что класс не существует и он будет создан сейчас же. Тоже самое вы можете сделать и руками.

Итак, в класс StarAndBall.as добавляем наши старые методы:
package {
import flash.display.MovieClip;
import mx.flash.UIMovieClip;

public class StarAndBall extends UIMovieClip
{
public function StarAndBall():void
{
}

public function rotateStar( angle:Number ) : void {
star_mc.rotation = angle;
}

public function zoomStar( factor:Number ) : void {
star_mc.scaleX = factor;
star_mc.scaleY = factor;
}

public function stopPlanet() : void
{
stop();
}

public function resumePlanet() : void
{
play();
}
}
}

Очень похоже на флекс-компонент. Заново опубликуем swc.

Назад во флекс

Дадим нашему компоненту имя . Теперь мы можем свободно вызывать методы этого компонента, которые мы только что добавили:

star.stopPlanet();
star.rotateStar(value)
и т.д.

Все исходники лежат здесь.

Спасибо Питеру Энту за полезный пост.

пятница, июля 20, 2007

Тестируем производительность на пузырьках

Сайт www.bubblemark.com посвящен сравнению производительности на примере двухмерной анимации пузырьков, исполненной в нескольких RIA технологиях: Java, Flex, Apollo, DHTML, Silverlight. Вот некоторые результаты.

среда, июня 27, 2007

List и дубликаты в датапровайдере

Давно заметил следующую теперь уже наверно фичу:
Сделаем маленький пример:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Script>
[Bindable]
public var listData:Array = ["alpha", "beta", "beta", "gamma", "delta"];
</mx:Script>
<mx:List dataProvider="{listData}"/>
</mx:Application>


В данном случае, если навести мышь на второй элемент, который идентичен третьему, то отработает наведение последний. Я думал, что это баг. Отнюдь. Вычитал из Jira, что List не должен иметь одинаковых элементов - все элементы коллекции должны иметь уникальный id, например,

public var listData:Array = [{label:"alpha", data: "01"}, {label:"beta", data: "04"}, {label:"beta", data: "90"}, {label: "gamma", data: "4"}, {label:"delta", data: "8"}];

Класс ImageSnapshot (Flex SDK 3)

В третьем SDK появился класс ImageSnapshot, который облегчает работу при создании скриншотов UI-компонентов. Класс ImageSnapshot имеет несколько методов для создания снэпшотов компонентов и кодирования их в PNG или JPEG изображения. В дополнение к этому классу появились также PNGEncoder, JPEGEncoder, Base64Encoder и Base64Decoder, которые раньше были в as3corelib.

mx.graphics.codec.JPEGEncoder
mx.graphics.codec.PNGEncoder

mx.graphics.codec.IImageEncoder


Интерфейс IImageEncoder служит для классов, которые перекодируют объекты BitmapData в ByteArray. Два вышеназванных класса (PNGEncoder и JPEGEncoder) имплементируют этот интерфейс. Если вы захотите написать свой перекодировщик, то он должен имплеменировать этот интерфейс тоже.

mx.graphics.ImageSnapshot

Класс ImageSnapshot облегчает работу с захватом снимков Flex-компонентов. Применений этому множество: создание отражений, или, например, сохранение изображений у пользователя.

Если раньше для получения Base64-строки снимка Flex UI-компонента необходимо было сделать так:

private function getBase64String(component:UIComponent):String) {
var bitmapData:BitmapData = new BitmapData(component.width, component.height, true, 0xffffff);
bitmapData.draw(component);

var bytes:ByteArray = PNGEncoder.encode(bitmapData);

var b64encoder:Base64Encoder = new Base64Encoder();
b64encoder.encodeBytes(bytes);

var b64String:String = b64encoder.flush();

return b64String;
}


То теперь нам поможет класс ImageSnapshot:

captureBitmapData
Этот метод возвращает объект BitmapData, ограниченный 2880 px по ширине и высоте.

captureImage
Этот метод возвращает объект ImageSnapshot. В параметре функции можно передать тип кодировки - PNG или JPEG.

После получения объекта ImageSnapshot мы имеем ByteArray изображения, который потом можно использовать по своему усмотрению.

encodeImageAsBase64
Этот метод получает объект ImageSnapshot и кодирует его в Base 64 строку.

Итак, перепишем наш пример:

private function getBase64String(component:UIComponent):String) {
var snapshot:ImageSnapshot = ImageSnapshot.captureImage(component);
var b64String:String = ImageSnapshot.encodeImageAsBase64(snapshot);
return b64String;
}


или в одну строку:

private function getBase64String(component:UIComponent):String) {
return ImageSnapshot.encodeImageAsBase64(ImageSnapshot.captureImage(component));
}


Обход максимального размера в 2880 px
Для захвата компонентов с большим размером есть метод captureAll, который создает несколько объектов BitmapData и объединяет их в один ByteArray. Но здесь есть ограничение - максимум 256Мб для ByteArray.

Итак, ничего нового, просто все приведено в порядок и собрано в одном месте, что позволяет сэкономить пару-тройку строк кода:)

Различия между Flex SDK 2.01 и 3

Все различия данных версиях можно наглядно посмотреть здесь. Страница еле грузится, правда.

пятница, июня 08, 2007

Flex 3 - баги DeepLinking в Firefox

Тед Патрик обрадовал диплинкингом, который будет встроен в 3 Флексе. (1 и 2) Но, еще работая с SWFAddress, я заметил следующий баг в Firefox'е: если зайти в адресную строку для ручного изменения адреса, а потом перевести фокус обратно на страницу, то адресная строка перестает редактироваться и весь DeepLinking отрубается, до тех пор, пока не перезайти на эту вкладку с другой. Как говорит автор SWFAddress, это баг Firefox и победить его пока не получилось.

понедельник, июня 04, 2007

Экспорт изображения без помощи сервера

Почти все браузеры, кроме IE, поддерживают data: URI scheme, то есть для отображения изображения можно в src передавать не ссылку на него, а его код. Например, так выглядит красная точка:

<img src="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP
C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA
AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J
REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq
ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0
vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot" />


Правда, отображать таким образом можно относительно небольшие изображения, зато появляется возможность создавать live-скриншоты приложения без помощи сервера.

Хороший пример с исходным кодом есть у Дуга МакКуна.

среда, мая 30, 2007

Подсветка ActionScript 3

Вышла опенсорсная (BSD) библиотека для подсветки AS3 кода. Вот наглядный примерчик. Скачать библиотеку можно отсюда

вторник, мая 29, 2007

Flex 2.0.1 Hotfix 2

Flex 2.0.1 Hotfix 2. Исправлено:

- ошибки в работе Flex Builder и Flex debugger под Flash Player 9 (9.0.45.0) в Мозилле.

- добавлена поддержка ASDoc для Linux, исправлены ошибки запуска ASDoc под Mac и Linux.

- Утечки памяти в Accordion и ViewStack

- RTE из ListBase при клике на датагриде, ошибки неправильного горизонтального скролирования датагрида при скрытии/отображении последней колонки.

- Ошибки твинига дерева при отображении скроллбаров и ошибки отображения данных при удалении нода.

- Изменение compc для использования SourceList.

- Атрибут uri для тега в catalog.xml теперь опционален.

- Пофиксены LineStyle2 и ButtonRecord2.

- unscaledWidth/unscaledHeight теперь public и read/write.

- Нажатие на полосу прокрутки не работает, если она заскинована

- Удален ExcludeClass metadata из AbstractWebService.

Установка стандартная: забэкапить старый SDK и перезаписать на старый новый.

пятница, мая 25, 2007

Класс Tweener

Открыл для себя класс Tweener, с помощью которого можно легко создавать программную анимацию и различные эффекты. Он реализован как для AS2, так и для AS3, при этом код менять не надо.
С помощью этого класса и Papervision3d создан прикольный каталог для ITunes.

Вот небольшой пример кода:

Tweener.addTween(UITarget, {x:selectedGoTo.x, y:selectedGoTo.y, z:selectedGoTo.z-bounceAmount+UISpacing, rotationX:0, rotationY:180, rotationZ:0, time:primeTransTime, transition:transEquation});

Прикольно то, что твининг можно задавать в трех измерениях, а также вращать элемент вокруг своих осей.

среда, мая 16, 2007

D.eval() - eval() для Flex

D.eval() (Дивал) - библиотека, позволяющая во Flex приложеняих исполнять текстовые строки как ActionScript-выражения. Выглядит он следующим образом:

import com.riaone.deval.D;
var six:int;
six = D.eval("4 + 2") as int;
six = D.evalToInt("var x=0; for(i=1;i<=3;++i)x+=i;return x");
six = D.evalToInt("a * b", {a:2, b:3});
six = D.evalToInt("f(5)", {f:function(x:int):int{return x+1}});
six = D.evalToInt("xml.@size*2", {xml:});
six = D.evalToInt('xml=; return xml.@size*2');


Язык, используемый в D.eval() - это Deval. Он поддерживает все AS3 выражения, включая E4X; он имеет доступ к AS3 классам и функциям, но сам их не задает. Типа, новый шаг в разработке Flex-приложений.

Загрузить можно здесь.

APE - Actionscript Physics Engine

APE - 2d движок для Flash/Flex. Скачать версию 0.3 alpha можно отсюда. Есть небольшое демо, а также можно выполнить урок для начала работы с движком во Flex Builder.

Прикольная демка Papervision/Flex

пятница, мая 04, 2007

AS3 String Utils

Класс с расширенными методами управления строками.

API:
afterFirst
adterLast
beginsWith
beforeFirst
beforeLast
between
block
capitalize
contains
countof
editDistance
endsWith
hasText
isEmpty
isNumeric
padLeft
padRight
properCase
quote
remove
removeExtraWhiteSpace
reverse
reverseWords
similarity
stripTags
swapCase
trim
trimLeft
trimRight
wordCount
truncate

четверг, апреля 26, 2007

Открываем ссылки в новом окне

Современные браузеры зачастую блокируют ссылки, открывающиеся в новом окне. Firefox также не является исключением. При этом (в зависимости от настроек блокировщика) у него появляется маленький крестик внизу, о миссии которого сложно догадаться с первого раза. Так как не все флексовые приложения использую SWFAddress, то открыв ссылку в этом же окне и вернувшись назад мы получаем исходный вид приложения, что является крайне неюзабельным. Поэтому, часто сразу ссылки открывают в новом окне, которое и блокируется. Чтобы этого избежать, некто Сергей Ковалев предлагает открывать окна через жаваскриптовый window.open. Все отлично работает, спасибо за метод борьбы:). Но теперь остается еще одна проблема: во флексе ссылки не открываются из Label. Чтобы решить эту проблему, можно совместить вышеприведенный метод с новым текстовым событием LINK следующим образом:

...
[Bindable] private var str:String = '<a href="event:http://www.ya.ru">www.ya.ru</a>';
...

<mx:Label selectable="true" htmlText="{str}" link="URLUtil.openWindow(event.text)"/>


Теперь все в порядке.

среда, апреля 18, 2007

AS3 карты

Даррон Шелл создал на гугл-коде раздел as3cards, который содержит скинуемый движок по созданию карточных игр (например, Klondike).
SVN

понедельник, апреля 16, 2007

FDT 3.0 beta

Powerflasher'ы анонсируют выход беты известного Eclipse-плагина FDT третьей версии с поддержкой конечно же AS3. Стоить сие творение будет 299 евро, а вот апгрейд с 1.5. версии всего 99. Релиз планируется на июль. Из новых фич ничего толком не объявлено: совместимость с флексом, улучшенная производительность и много очень полезных улучшений:)

понедельник, апреля 02, 2007

HTMLRenderer - больше, чем htmlText!

Хотите, чтобы Flex отображал нумерованный список, изображения с всплывающими альтами и цветными бордерами, разукрашенные таблицы со всякими колспанами и роуспанами? И еще, чтобы задано это было простыми html тегами/аттрибутами, обернутыми в конструкции OL, TEXT, IMAGE и GRID? Пожалуйста!



HTMLRenderer далеко не универсален, но всего функционала и впихнешь, а если и впихнешь, то можно получить какой-нибудь браузер:)

среда, марта 21, 2007

SWFZ - еще один 3D движок

Одновременно с Papervision3D некто jhalse разрабатывает свой движок SWFZ, который является портированным на AS движком Irrlicht, написанным на C++. Прогресс создания создания движка можно посмотреть здесь.

Примеры:
DOOM ?!
Танцующий динозаврик
Использование материалов для модели

воскресенье, марта 18, 2007

Семейство Flex Explorer

Flex Style Creator - создание css-стилей приложения.
Flex Primitive Explorer - создание графических примитивов.
Flex Filter Explorer - создание графических фильтров.
Flex Transitions and Effects Explorer - эффекты и переходы.

четверг, марта 15, 2007

Flex 2.0 Primitive Explorer

Flex 2.0 Primitive Explorer - простой способ создания графических примитивов (звездочек, треугольников, дуг, секторов и т.п.) Примитивы можно разукрашивать в свое удовольствие. Необходимый код генерируется тут же.

Некоторые тонкости использования E4X

1. Устанавливайте resultFormat="e4x" для HTTPService

По умолчанию, resultFormat для <mx:HTTPService> является "object". Но при получении XML данных, "object" - это не то, что вам нужно. Если же задать "e4x", то lastResult будет являтся XML объектом, который можно парсить с помощью E4X выражений.

2. E4X выражения не ссылаются на самый верхний тег XML

Итак, имеем <mx:HTTPService>, названный myService с resultFormat="e4x", возвращающим следующую структуру:

<?xml version="1.0"?>
<people>
<person>mike</person>
<person>sho</person>
<person>nj</person>
</people>

Эти данные содержатся в myService.lastResult (или в event.result.) Как получить XMLList всех элементов <person>?

Часто думают, что E4X выражения составляют от корневого тега <people>:

var personNodes:XMLList = myService.lastResult.people.person;
// неправильно
А правильно так :
var personNodes:XMLList = myService.lastResult.person;
// правильно

3. Используйте for each, а не for

ECMAScript давно имеет структуру for (ключ в коллекции). Но обратите внимание, что при использовании этого выражения переменной цикла является ключ коллекции, а не значение текущего элемента, поэтому в цикле необходимо писать коллекция[ключ] для ображения к его значению.

E4X добавляет следующую структуру (которую можно использовать на любой коллекции): for each (значение в коллекции). Рассмотрим примеры:

for (var key:* in myService.lastResult.person)  { 

var value:* = myService.lastResult.person[key];
...
}
А теперь for each:
for each (var value:* in myService.lastResult.person)  
{... }


4. Используйте for each (child in parent.*), вместо for each (child in parent)

Итак, есть документ :

var mydocument:XML = 
<root>
<cat>
<mouse />
<mouse />
<mouse />
</cat>
</root>
var cats:XMLList = mydocument.cat; // это только один элемент
Теперь необходимо перебрать всех мышей у этого кота.
Чтобы получить атрибуты объекта ActionScript, можно написать следующее:

var o:Object = ...;  for each (var property:* in o) ...
Вы думаете, что следующим образом вы делаете тоже самое:

for each (var mouse:XML in cats) ... // неправильно

Увы, E4X отличается. В E4X, "cats" - это коллекция -- список узлов <cat>, а в примере есть только один <cat>.

Поэтому, чтобы перебрать всех мышей необходимо использовать следующую структуру:

// перебрать все прямые дочерние элементы
for each (var mouse:XML in cats.*) { ... }
// или перебрать всех прямых потомков, которые являются узлами <mouse>
for each (var mouse:XML in cats.mouse) { ... }

5. E4X специально стирает различия между XML и XMLList

При изучении E4X, вы узнаете, что есть два типа данных: XML и XMLList. Вроде легко, но потом появляются проблемы с неправильной типизацией данных.
var mydocument = 
<root>
<rabbit name="Brownster Johansson McGee" />
</root>;
// 'mydocument.rabbit' - список всех узлов <rabbit>, значит
// myPetRabbit должен быть XMLList? Но я назвал переменную
// 'myPetRabbit', а не 'myPetRabbits',
// потому что я знаю, что заяц только один.
var myPetRabbit:XMLList = mydocument.rabbit;
// Как же его зовут? Почему следующее выражение не вызывает ошибки,
//ведь myPetRabbit - это XMLList?
trace(myPetRabbit.@name);

Причина в том, что E4X намеренно стирает различия между XML и XMLList. Каждый XMLList, который содержит один элемент, будет рассматриваться как XML. (Если 'myPetRabbit' будет содержать несколько узлов, то myPetRabbit.@name будет возвращать список всех атрибутов "name" все узлов <rabbit>.)

Например, рассмотрим документацию по методу XMLList.toString():

  • Если объект XML имеет простую структуру, то метод toString() возвращает содержимое узлов без тегов, атрибутов, пространств имен и т.п.

  • Если объект XML имеет сложную структуру, то метод toString() возвращает все содержимое, вклюяая теги, атрибуты и т.п.

То есть если XMLList содержит <node>hello</node>, то toString() вернет "hello"; но если он содержит <node>hello</node><node>goodbye</node>, toString() вернет "<node>hello</node><node>goodbye</node>" (а не "hellogoodbye"). Если же вам всегда нужен полный XML, используйте toXMLString() вместо of toString().

6. Внимание! Простое выражение может вам дорого обойтись

При использовании простых объектов нет ничего удивительного в использовании следующего кода:

var x:Object = ...;  
if (x.y.z == 3)
foo(x.y.z);

Код работает быстро, проблем не вознкает.

Но в E4X операция типа "x.y.z" будет означать, что цикл проходит через всю XML-структуру и ищет соответствующие совпадения:

var mydocument:XML = ...;  
if (mydocument.cat.mouse.length() == 3)
{foo(mydocument.cat.mouse)};

Итак, если вам потом понадобиться использовать результат, то лучше сохранить его в XMLLis переменнойt:

var mydocument:XML = ...;  
var mice:XMLList = mydocument.cat.mouse;
if (mice.length() == 3)
{foo(mice);}

7. Используйте дебаггер


Отладчик поможет вам разобраться в значениях XML и XMLList переменных.

XML variables


Отсюда

среда, марта 07, 2007

Презентация Papervision

Те, кого интересует движок Papervision, могут скачать презентацию (40 мб, говорят, там есть исходники psd, 3d max, papervision, я не качал). В конце, наверное, получится это чудо.

Взял отсюда.

FlexBook

Эли Гринфилд нафигачил кучу примеров по использованию книжного движка во флексе.

вторник, марта 06, 2007

ActionScript 2.0 - 3.0 Migration Cheatsheet

Опубликован ActionScript 2.0 - 3.0 Migration Cheatsheet, содержащий всю необходимую информацию по переходу на AS 3.

понедельник, марта 05, 2007

четверг, марта 01, 2007

Easing-эффекты в одном месте

Джеймс Ворд выложил примерчик, демонстрирующий все типы Easing-эффектов во Flex.

FlexLib на Google Code

Doug McCune, Ted Patrick, Mike Chambers и Darron Schall анонсируют библиотеку полезных компонентов Flexlib. Вот их список с примерами.

суббота, февраля 17, 2007

Примеры движка Papervision3D

Увидел еще несколько примеров, созданных на движке Papervision3D.


2007.jpg panorama.jpg


paperPlanet.jpg bumpmapRhino.jpg



Может для заядлых 3D-шников это ерунда, но меня впечатлило!

среда, февраля 14, 2007

Как раскрасить ряды DataGrid в зависимости от данных?

А вот так!

Adobe Flex Coding Guidelines

Некто Fabio Terracini совместно с DClick написали гайдланы для написания as и mxml кода. Привели в порядок в общем.

Flex Style Explorer 2.01

Вышел Flex Style Explorer 2.01. Из новых фич анонсируют следующие:

1) Навороченный ColorPicker (эх, Василий, не видели они вашего)
2) Экспорт всего CSS
3) Поддержка StyleName
4) Стили форматирования текста
5) Возможность введения значения руками и слайдером
6) Добавлены ToggleButtonBar, HDividedBox, VDividedBox, TextArea, VRule, VSlider, ColorPicker, ToolTip
7) Улучшенная навигация
8) Индикация отредактированных компонентов
9) Работа с прозрачным приложением
10) Улучшение UI

среда, февраля 07, 2007

Прикольный скин - мятые салфетки

Наткнулся на прикольный скин, имитирующий мятые салфетки.

.

У автора пока весь блог этим салфеткам посвящен:)

четверг, января 25, 2007

Макросы в html-темплейтах флекс-проекта

${project}
Название проекта, MyProject.

${application}
Имя приложения, MyApp.

${version_major}
Major-версия плеера, т.е. 9 для 9.0 r28.

${version_minor}
Minor-версия, т.е. 0 для 9.0 r28.

${version_revision}
revision-версия, т.е. 28 для 9.0 r28.

${build_suffix}
Суффикс, определяющий тип версии приложения, "-debug" - для отладочной версии и "" - для релиза.

${swf}
Имя SWF файла без расширения .swf. Эквивалентно ${application}${build_suffix}.

${bgcolor}
Фон приложения, заданный в атрибуте backgroundColor тега <mx:Application> или в поле метаданных backgroundColor в [SWF] metadata атрибуте [SWF(backgroundColor="#ffffff")] public class MyApp extends Sprite.

${width} и ${height}
Ширина и высота приложения, заданная в <mx:Application> или в метаданных [SWF(width="300", height="400")] public class MyApp extends Sprite.

${title}
заголовок приложения, заданный в атрибуте pageTitle тега <mx:Application> или в [SWF(pageTitle="flex r00lz")] public class MyApp extends Sprite.

Отсюда

среда, января 24, 2007

Flex2LocalDebugger - трейс-панель во флексе

Flex2LocalDebugger - это некоторое подобие легкой отладки флекс-приложений. Например, при вызове
LocalDebugger.show('test'); вылетает окошко Alert с надписью test.

А LocalDebugger.trace('test'); заносит информацию в окно отладки. Flex2LocalDebugger работает через LocalConnection, поэтому для правильной работы функции trace необходимо запустить файлик Flex2LocalDebuggerConsole.html, который идет в архиве. В нем и будут отображаться все ваши трейсы.

PageFlip во флеше и флексе

На ByteArray.org можно скачать базовый класс переворачивания страниц. А тем временем, в Нидерландах создали с его помощью маленькое флекс-приложение PageFlip.

среда, января 17, 2007

felxoBooth - сервис для эксбиционистов

Полушуточный сервис - felxoBooth - наложи на себя фильтр и покажись другим:)

пятница, января 12, 2007

Альтернатива FMS - Wowza Media Server

Вышла вторая бета Wowza Media Server (WMS). WMS - RTMP сервер для передачи потокового видео, аудио и данных от и к Flash-плееру. WMS может быть размещен на любой платформе, поддерживающей Java 5. На официальном сайте проекта текущая версия доступна для скачивания (после регистрации). В комплекте установки идут примеры проигрывания потокового видео, видеочата, использования Remote Shared Objects, записи видео и др.

О цене WMS будет объявлено позже.

четверг, января 11, 2007

Несколько заметок про Date

Как известно, конструктор Date может принимать значения года, месяца (0-11), дня (1-31) и т.п. Но можно немножко поиграть с параметрами и получить интересные результаты.

Например, если задать в качестве месяца -1, то из даты будет вычтен месяц:

var dt:Date = new Date( 2006, -1, 1 );
// Thu Dec 1 00:00:00 GMT+0300 2005


Теперь попытаемся создать 0 января 2006 года:

dt = new Date( 2006, 0, 0 );

Получим 31 декабря 2005 года.

0 марта не существует, поэтому получаем 29 февраля (2008 год будет високосным):

dt = new Date( 2008, 2, 0 );

Теперь вычтем из текущей даты неделю:

dt = new Date();
dt.date = dt.date - 7;


Получим Thu Jan 4 2006.

Вот такая математика:)

С прошедшими праздниками всех!