пятница, сентября 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

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