Flash Ripper RSS Readers

Класс UISprite: один из способов поженить AS3-класс Sprite с визульными компонентами Flex Framework

Когда мы попытаемся произвести такую простую операцию, как добавление экземпляра класса Sprite во Флекс-приложение, -- нечто вроде myCanvas.addChild(new Sprite()); -- флекс ругнется и скажет нам, что добавлять можно только классы, реализующие интерфейс IUIComponent.

Это потому, что все визуальные компоненты фрэймворка Fleх этот интерфейс реализуют и работают только с аналогичными реализаторами. Такая вот замкнутая система. Как же нам втиснуться со своим скромным спрайтом в эту громаду событийно-заскинованного великолепия? Ведь Sprite как класс не реализует интерфейс IUIComponent.

Значит, нам нужен тот, кто его реализует. Здесь открывается множество путей, один из которых -- создать класс, расширяющий класс Sprite и реализующий этот самый интерфейс IUIComponent -- этот путь называется Путь Великого Наследования, он долгий и утомительный, и мы туда сейчас не пойдем. Нам ведь совсем не хочется реализовывать все 86 методов интерфейса IUIComponent (я мог ошибиться, проверьте) в этот поздний час.

Ведь есть другой путь -- композиция. Это для нашего случая. Мы используем класс, который уже реализует интерфейс IUIComponent. Я выбрал класс, который называется -- о чудо -- UIComponent! Замечательно в нем то, что его метод addChild принимает в качестве аргумента столь нужный нам спрайт.

Значит мы теперь можем решить проблему женитьбы спрайта с компонентами Flex 2 Framework. Мы скормим свой спрайт экземпляру класса UIComponent c помощью его метода addChild, и сможем пользовться нашим спрайтом, завернутым в эту оболочку.

Я накропал простой класс UISprite, в котором это реализовано (будет обновляться, если в комментариях мне не покажут, что этот путь тупиковый и нужно было чаще ходить на форумы флэшера, чтобы не изобретать велописед):

package
{
import mx.core.UIComponent;
import flash.display.Sprite;

/**
* UISprite class is a wrapper class
* for adding Sprites to Flex display list as childs.
*
* @author Rostislav Siryk
*
*/
public class UISprite extends UIComponent
{
/**
* Sprite to add to display list
*/
public var mySprite: Sprite;

public function UISprite()
{
// Empty constructor
}

/**
* Adds non-flex display object as child to this UIComponent instance
*
* @param assetToSet Object to add as child
*/
public function setAsset(assetToSet: Object): void
{
mySprite = (new assetToSet());
this.addChild(mySprite);
}

/**
* Optionally sets teh hane of this UIComponent
*
* @param assetName New name of UIComponent
*/
public function setName(assetName: String): void
{
name = assetName;
}

/**
* Overrides UIComponent class width getter
* @return Width of the UIComponent as width of this mySprite child
*
*/
override public function get width():Number
{
return mySprite.width;
}

/**
* Overrides UIComponent class width setter
* @param width New width of the UIComponent as width of this mySprite child
*
*/
override public function set width(width:Number):void
{
mySprite.width = width;
}

/**
* Overrides UIComponent class height getter
* @return Height of the UIComponent as height of this mySprite child
*
*/
override public function get height(): Number
{
return mySprite.height;
}

/**
* Overrides UIComponent class height setter
* @param height New height of the UIComponent as height of this mySprite child
*
*/
override public function set height(height: Number):void
{
mySprite.height = height;
}
}
}

Пример использования:

var myUISprite = new UISprite();
myUISprite.setSprite(someSprite);
myCanvas.addChild(myUISprite);

(можно было обойтись и одной строкой кода, передавая параметр someSprite через конструктор, но я решил поддерживать подход с пустым конструктором, используемый во Flex Framework)

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

Писал Rost, 11 Февраль 2007 23:44

Найдены баги:

Рост, попробуй, как оно будет себя вести при ресайзе.

Mokus - 12 Февраль 2007 8:56

Ага. Я сейчас обкатываю это дело на своем экспериментальном домашнем проекте, как раз завязанном на трансформациях кучи запчастей. Пока работет нормально -- а дальше посмотрю, как себя поведет. Может, придется еще подописывать методы типа commitProperties, invalidateSize и т.п.

Рост - 12 Февраль 2007 18:52

Очень помог твой пост =), Спасибо
Создавать ивенты в swf и ловить во флексе у меня получилось, а вот обратной операции нет =(

jinzito - 20 Февраль 2007 17:26

jinzito, а что именно ты делаешь с свф-кой? Мне эта тема сейчас очень интересна. В ближайшее время будет еще минимум один пост на эту тему (да и класс UISprite я уже не раз обновил, адаптируя его ко все возникающим требованиям флекс-фреймворка).

Рост - 20 Февраль 2007 17:30



Это запись из категории 'Classes'. 10 еще cвежих:

Архивы по категориям:

3D-18, Adobe AIR-30, Animation-1, Apache Ant-1, Architecture-1, ARP-1, Art-25, Articles-26, AS3-52, Books-7, Business-3, Cairngorm-2, CI-1, Classes-10, Coding-30, Community-113, Components-19, Contests-28, Cool-Job-5, Debug-18, Design-26, Development-84, EMO-1, Events-13, Extensions-2, FAQ-8, FDS-1, Flash and html-5, Flash Player-35, Flash Updates-8, Flash-scene-1, flash10-4, FlashLite-2, Flex-30, Flex 2-80, Flickr-1, FMS-1, FPUG-46, frameworks-1, Games-11, Good Job!-35, HaXe-14, Health-2, Humor-10, Ideas-13, JavaScript-1, Job-26, JSFL-8, Links-2, Linux-1, Maps-1, Math-8, Money-11, MXML-1, Open Source-15, Optimization-2, Patterns-2, Personalities-27, Politics-1, Preloading-3, Productivity-9, PureMVC-10, Pv3d-1, Rafpug-4, Red5-3, Remoting-11, Resources-21, Ruby-6, SAAS-1, Security-11, SEO-8, Silverlight-5, Sound-3, Strategy-120, Tamarin-1, Tools-113, Training-2, Trash-8, URAFPUG-13, Urgent-1, Usability-6, Video-6, VoIP-5, Wallop-1, Wishlist-2, Архив всех записей (большой)

За последние месяцы:

Июл 2008: Международная встреча разработчиков URAFPUG завершена, URAFPUG - трансляция студии Flex-фреймворка Mate, весь Июл

Июн 2008: Попытка предварительных выводов о встрече аниматоров, Онлайн трансляция встречи аниматоров в Донецке, весь Июн

Май 2008: Если 3D, то по-взрослому: официальный запрос в Adobe по поводу контроля над мип-маппингом. Нужна ваша поддержка!, В этом году «Russian Flash Awards» пройдет в «космическом стиле», весь Май

Апр 2008: Программирование под флэш платформу. Cтатья (местами спорная), Advanced Flash Components бесплатно раздает все свои AS2-компоненты, весь Апр

Мар 2008: Зарплаты программистов в 2007 году, FlashPhone как технология года? Технология года? В Рунете?, весь Мар

Фев 2008: ЙА ФПУГ — регистрация на первую встречу UAFPUG продолжается, Закулисы Flex и секрет успеха опенсорс-проекта, весь Фев





Примечания:
Статус документа
: в процессе
   2002-2007 Производство: Рост Прибыли · О проекте · Подписка на новости (RSS)