/** * @author Kyle Murray */ package net.reclipse.v4.utils { import flash.display.*; import flash.net.*; import flash.events.*; import flash.text.*; public class Preloader extends Sprite { private var _style :PreloaderStyle = PreloaderStyle.defaultStyle; private var _loadBar :Sprite; private var _loadText :TextField; private var _postLoadAction :Function; private var _percentBar :Boolean; private var _content :Bitmap; public function Preloader(contentURL:URLRequest, postLoadAction:Function, percentBar:Boolean = false) { super(); if(contentURL == null){ throw new ArgumentError('contentURL must be non-null.'); } else if(postLoadAction == null){ throw new ArgumentError('postLoadAction must be non-null.'); } else { var loader:Loader = new Loader(); _postLoadAction = postLoadAction; _percentBar = percentBar; loader.contentLoaderInfo.addEventListener(Event.OPEN, onOpen); loader.contentLoaderInfo.addEventListener(Event.INIT, onComplete); loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress); loader.load(contentURL); } } public function draw(percent:Number = 0):void { if(_loadBar != null && percent >= 0){ _loadBar.graphics.clear(); // draw background _loadBar.graphics.beginFill(_style.bgColor, _style.alpha); _loadBar.graphics.moveTo(0, 0); _loadBar.graphics.lineTo(_style.width, 0); _loadBar.graphics.lineTo(_style.width, _style.height); _loadBar.graphics.lineTo(0, _style.height); _loadBar.graphics.lineTo(0, 0); _loadBar.graphics.endFill(); // draw bar var barHeight:Number = _style.barHeightRatio * _style.height; _loadBar.graphics.moveTo(0, _style.height / 2 - barHeight / 2); _loadBar.graphics.beginFill(_style.barBGColor); _loadBar.graphics.lineTo(percent * _style.width, _style.height / 2 - barHeight / 2); _loadBar.graphics.lineTo(percent * _style.width, _style.height / 2 + barHeight / 2); _loadBar.graphics.lineTo(0, _style.height / 2 + barHeight / 2); _loadBar.graphics.lineTo(0, _style.height / 2 - barHeight / 2); _loadBar.graphics.endFill(); if(_percentBar){ _loadText.text = Math.ceil(percent * 100) + '\t%'; } } else { throw new ArgumentError('LoadBar must be non-null.'); } } private function onOpen(e:Event):void { _loadBar = new Sprite(); addChild(_loadBar); if(_percentBar){ _loadText = new TextField(); _loadText.textColor = _style.barBGColor; _loadText.selectable = false; _loadText.defaultTextFormat = _style.textFormat; _loadText.setTextFormat(_style.textFormat); // removable section _loadText.height = 20; _loadText.width = 50; _loadText.y = 30; // addChild(_loadText); } draw(0); } private function onIOError(e:IOErrorEvent):void { // this should clear all of the unneeded references _loadBar = null; _content = null; _postLoadAction = null; if(_percentBar){ _loadText = null; } } private function onProgress(e:ProgressEvent):void { draw(e.bytesLoaded / e.bytesTotal); } private function onComplete(e:Event):void { var loadedItem:Bitmap = (e.target as LoaderInfo).content as Bitmap; trace('loaded: ' + e.target.content); removeChild(_loadBar); _loadBar = null; if(_percentBar){ removeChild(_loadText); _loadText = null; } // TODO: do something with loaded object _postLoadAction.call(loadedItem); _postLoadAction = null; addChild(loadedItem); _content = loadedItem; } public function dereferenceContent():Boolean { if(_content != null){ _content = null; return true; } return false; } public function set style(preloaderStyle:PreloaderStyle):void { _style = preloaderStyle; } public function get style():PreloaderStyle { return _style; } } }