Библиотека swf файла во флекс проекте.

Особенно удобно использовать графику, те. пусть это будет картинка, например в моем случае в Adobe Flash CS3 (можно CS4)
[insert] - [new Symbol] - [Movie Clip] рисуем что нибуть, или вставляем готовую картинку, нажимаем ctrl+L. Выбираем в библиотеке наш символ, правой кнопочкой клацаем, [lincage] - [v]Export for action script] - [v]Export for first frame; class[Symbol1]
Теперь можно эту флешку скомпилировать засунуть во флекс проект и юзать класс Symbol1, естественно можно сделать много символов и можно так-же использовать символы с кодом, дополнительный плюc такого подхода в том, что можно полностью разделить в проекте графическую (дизайнерскую) и программерскую части, так-же можно быстро заменить граф. библиотеку, полностью, за несколько секунд (естественно дизайнер новую граф часть будет рисовать долго, но кто на что учился) скомпилировав тот-же проект, но полностью с другим внешнем видом, при таком подходе так-же уменьшается время компиляции, поскольку граф. часть уже собрана и скомпилирвованна.
Для примера вставим объекты с кодом. Итак, что-бы долго не мудрить чего вставить во флешку, нажимаем на ctrl+F7 в Adobe Flash CS3 или CS4 и тянем в библиотеку компоненты Button и TextArea, на всякий случай приведу скриншот
изображение библиотеки swf файла
На рабочее поле ничего добавлять не надо (разве что статик текст с названиями библиотечных классов), мы ж его будем юзать как библиотеку. нажимаем ctrl+enter. Теперь займемся флексом.
Swf файл ембедится во флекс как байтАррай, потом этот байтАррай грузится лоадером, как обычно мы и грузим посторонние флешки, потом получить доступ к классам содержащимся в загруженной флешке можно так - на примере с fl.controls.TextArea (Берем класс, создаем экземпляр и добавляем на рабочее поле.
var clTextArea:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("fl.controls.TextArea")as Class;
var dOb:DisplayObject;
var txtArea:Object;
addChild(dOb = new clTextArea);
txtArea = dOb as Object;
txtArea.setSize(200, 300);
txtArea.move(200, 10);
Видите специфика какая: общаться с ним можно на уровне объекта, но зато без ограничений. Так-же код довольно длинный, целесообразно создать отдельные классы для работы с swf файлом. Флекс проект будет состоять из трех файлов (документ класс, библиотечный класс и класс событий) те. мы создадим библиотеку, дождемся от нее события окончания загрузки, заберем классы и затем будем с ними работать.

package lex.

В папке с документ классом будет папка lex в которой будут ютиться классы SwfLib и LexEvent.

класс с событиями LexEvent.

package lex{

	import flash.events.Event;

	public class LexEvent extends Event {

		public static const ON_CHANGE:String = "onChange";
		public static const COMPLETE:String = "complete";
		public var params:Object;

		public function LexEvent($type:String, $params:Object, $bubbles:Boolean = false, $cancelable:Boolean = false ) {
			super( $type, $bubbles, $cancelable );
			this.params = $params;
		}

		public override function toString():String {
			return formatToString("CustomEvent","params","type","bubbles","cancelable");
		}
	}
}
Будет исользоваться только событие complete

класс для загрузки swf библиотеки SwfLib.

//SwfLib
package lex
{
	import flash.display.*
	import flash.events.*;
	import flash.text.*;
	import flash.ui.*;
	import flash.system.*;
	import flash.net.*;
	import flash.utils.*;




	dynamic public class SwfLib extends Sprite
	{
		private var swfByte:ByteArray;

		private var loader:Loader;
		public var cl:Object;

		public function SwfLib(_swfByte:ByteArray):void
		{
			swfByte = _swfByte;
			loader = new Loader;
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);

			loader.loadBytes(swfByte,new LoaderContext(false, ApplicationDomain.currentDomain));

		}
		public function onLoadComplete(evt:Event):void {
			//trace(" getQualifiedClassName (loader.content) "+getQualifiedClassName (loader.content));//Документ класс
			loader.removeEventListener(Event.COMPLETE, onLoadComplete);
			dispatchEvent(new LexEvent(LexEvent.COMPLETE, {value:"swfOK"}));
		}

		public function idGetClass(_id:String, _className:String):void {
			this[_id] = loader.contentLoaderInfo.applicationDomain.getDefinition(_className)as Class;
		}

	}
}
Как вы можете заметить по окончанию загрузки библиотека генерит событие
dispatchEvent(new LexEvent(LexEvent.COMPLETE, {value:"swfOK"}));
Которое потом и ловится в документ классе.

Документ класс использующий swf файл в качестве библиотеки.

//DocSwfLibUse
package
{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;

	import lex.SwfLib;
	import lex.LexEvent;

	/*
	http://www.murmadillo.tut.su/
	*/

	public class DocSwfLibUse extends MovieClip
	{
		[Bindable]
		[Embed(source = "FlButTxtArea.swf", mimeType='application/octet-stream')]
		private var swfByte:Class;

		private var b1:Object,//Button
			b2:Object,//Button
			b3:Object,//Button
			ta:Object,//TextArea
			swfLib:SwfLib,
			dOb:DisplayObject;

		public function DocSwfLibUse():void
		{
			swfLib = new SwfLib(new swfByte);
			swfLib.addEventListener(LexEvent.COMPLETE, onSwfComplete);
		}

		public function onSwfComplete(evt:LexEvent):void {
			swfLib.removeEventListener(LexEvent.COMPLETE, onSwfComplete);
			init();
		}


		public function init():void{
			swfLib.idGetClass("Button","fl.controls.Button");//как нам хочется его видеть, как он выглядит в библиотеке swf файла
			swfLib.idGetClass("TextArea","fl.controls.TextArea");

			addChild(dOb = new swfLib.Button);//кнопка
			b1 = dOb as Object;

			addChild(dOb = new swfLib.Button);//кнопка
			b2 = dOb as Object;

			addChild(dOb = new swfLib.Button);//кнопка
			b3 = dOb as Object;

			addChild(dOb = new swfLib.TextArea);//текстовое поле
			ta = dOb as Object;
			ta.setSize(200, 300);
			ta.move(200, 10);

			b1.width = 160;
			b2.width = 160;
			b3.width = 160;

			b1.move(10,10);
			b2.move(10,40);
			b3.move(10,70);

			b1.label = "Default Button";
			b2.label = "Custom Styled Button";
			b3.label = "Toggle Button";

			b2.setStyle("textFormat", new TextFormat("Georgia"));

			b3.toggle = true;

			b1.addEventListener(MouseEvent.CLICK, buttonClick);
			b2.addEventListener(MouseEvent.CLICK, buttonClick);
			b3.addEventListener(MouseEvent.CLICK, buttonClick);

		}

		private function buttonClick(e:MouseEvent):void {
			var button:Object = e.target as Object;//Object Button
			ta.appendText(button.label + "\n");
		}

	}
}

Компилим и смотрим, что вышло.

Архив, содержащий все классы проекта где в качестве библиотеки используется скомпиленный swf файл.