一个不错的StyleManager

从asForm看到一个StyleManager,感觉还不错
主要是提取用swf打包后的skin style

素材打包成swf好处在于 内部进行DefineBitsJpeg3压缩,文件体积比较小,但因为继承MovieClip,不是很轻量
也可以“手动”修改让它继承Sprite。
用jsfl批处理命令的话,写到swf里都是继承MovieClip,我手动修改成Sprite后,复制那条命令,重播一次还是继承MovieClip,比较杯具。

如果把图片直接Embed进主swf,压缩就没前者来的大,文件体积相对也会大些。
所以有好有坏,根据实际情况取舍。

当然如果要用Embed嵌入方式的话,那就用不上了
下面是用动态载入的方式

使用方法很简单,就不介绍了~

package form.core
{
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IOErrorEvent;
	import flash.net.URLRequest;
	import flash.system.ApplicationDomain;

	import form.events.StyleEvent;

	public class StyleManager extends EventDispatcher
	{
		private var loader:Loader;
		private var appDomain:ApplicationDomain;

		private var _url:String;
		public function get url():String{return _url;}
		public function set url(value:String):void{_url = value;}

		public function loadStyleDeclarations(url:String = null):void
		{
			if(!url || url == "") url = this.url;
			if(!url || url == "") {throw new Error("No skin url found."); return;}
			loader.load(new URLRequest(url));
		}

		private function onLoadComplete(e:Event):void
		{
			appDomain = loader.contentLoaderInfo.applicationDomain;
			StyleManager.getInstance().dispatchEvent(new StyleEvent(StyleEvent.STYLE_COMPLETE));
		}

		private function onLoadError(e:Event):void
		{
			StyleManager.getInstance().dispatchEvent(new StyleEvent(StyleEvent.STYLE_ERROR));
		}

		public function getStyleDefinition(selector:String):DisplayObject
		{
			var s:Class;
			try
			{
				s = appDomain.getDefinition(selector) as Class;
			}
			catch(err:Error){trace(err.message);}
			if(s)
			{
				return new s as DisplayObject;
			}
			return null;
		}

		// Class Instance
		private static var instance:StyleManager;

		public function StyleManager(enforcer:SingletonEnforcer)
		{
			loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
			loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onLoadError);
		}

		public static function getInstance():StyleManager
		{
			if(StyleManager.instance == null)
			{
				StyleManager.instance = new StyleManager(new SingletonEnforcer());
			}
			return StyleManager.instance;
		}
	}
}
class SingletonEnforcer {}