Perfect Preloader

by hemingway
buffer for adding image with option to enable visual representation of loading progress (of the image)
♥0 | Line 324 | Modified 2015-02-12 12:14:28 | MIT License
play

Related images

ActionScript3 source code

/**
 * Copyright hemingway ( http://wonderfl.net/user/hemingway )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/mpZa
 */

package
{
    import net.hires.debug.*;
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.text.*;   

    [SWF(frameRate = 60, width = 465, height = 465)]
    public class Instance extends Sprite
    {
        internal var image1 :ImageBuffer;
        internal var image2 :ImageBuffer;       
        internal var image3 :ImageBuffer;
        internal var image4 :ImageBuffer;
        internal var sTrace :Text_Output;
        
        
        public function Instance()
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            
            addEventListener(Event.ADDED_TO_STAGE, addedToStage);
            
            image1 = new ImageBuffer(Resources.URL3, true, 200,200);
            //image2 = new ImageBuffer(Resources.URL2, true, 75, 125, 200, 200);
        }
        
        public function _init() :void
        {
            graphics.clear     ();
            graphics.lineStyle (1, 0, 0.75);
            graphics.drawRect  (0, 0, 464, 464);
        }
        
        public function addedToStage($e:Event) :void
        {
            removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
            
            addChild(image1);
            
            _init();

            addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        }
        
        internal var ptObj :Object;
        internal var oldPt :Point = new Point();
        internal var newPt :Point = new Point();
        internal var clcPt :Point = new Point();

        public function onMouseDown($e:MouseEvent) :void
        {
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            
            if ($e.target != this) {ptObj = $e.target}
            oldPt = new Point($e.stageX, $e.stageY);   
            
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        }
        
        public function onMouseMove($e:MouseEvent) :void
        {
            newPt = new Point($e.stageX, $e.stageY);
            clcPt = Point(newPt.subtract(oldPt));
            
            if (ptObj != null)
            {
                ptObj.x = (ptObj.x + clcPt.x);
                ptObj.y = (ptObj.y + clcPt.y);
            }

            oldPt = newPt;
        }
        
        public function onMouseUp($e:MouseEvent) :void
        {
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            
            var colArr :Array = CollisionHandler.detectCollision(Resources.colArr);
            
            if  (colArr.length > 0)
                {sTrace.content = "Overlap:\n" + colArr}else{sTrace.content = "Non-Overlap"}
        }
    }
}

import flash.display.*;
import flash.system.*;
import flash.events.*;
import flash.text.*;
import flash.net.*;

class CollisionHandler
{
    public static function detectCollision($arr:Array) :Array
    {
        var enumItems :Array = $arr;
        var detectedItems :Array = [];
        
        for (var $enum:Number = 0; $enum < enumItems.length; $enum++)
        {
            for (var $enum2:Number = 0; $enum2 < enumItems.length; $enum2++)
            {
                if ((enumItems[$enum] != enumItems[$enum2]) && (enumItems[$enum].hitTestObject(enumItems[$enum2])))
                {
                    detectedItems.push(enumItems[$enum].parent);
                }
            }
        }
        
        return detectedItems;
    }
}

class ImageBuffer extends Sprite
{
    private var preloader :Preloader;

    protected var _url    :String;
    protected var _x      :Number;
    protected var _y      :Number;
    protected var _width  :Number;
    protected var _height :Number;
    protected var _alpha  :Number;
    protected var _state  :Boolean;
    
    public function ImageBuffer($url:String, $pre:Boolean, $x:Number = 1, $y:Number = 1, $w:Number = 100, $h:Number = 100, $a:Number = 0.9)
    {
        addEventListener(Event.ADDED_TO_STAGE, addedToStage);

        _url    = $url;
        _state  = $pre;
        _x      = $x;
        _y      = $y;
        _width  = $w;
        _height = $h;
        _alpha  = $a;
        
        preloader = new Preloader(this, url, _state);
    }
    
    public function _init() :void
    {   
        alpha = alpha;
        if (preloader.state)
        {
            preloader.x = x;
            preloader.y = y;
            preloader.width = width;
            preloader.height = height;            
        }
        
        if (url != preloader.url)
           {for (var i:int = 0; i < numChildren; i++)
                {if (getChildAt(i) == preloader) {preloader.url = url}}}
    }
    
    public function addedToStage($e:Event) :void
    {
        removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
        
        mouseChildren = false

        addChild(preloader);
        
        _init();
    }

    public function get url() :String
    { return _url }
    public override function get x() :Number
    { return _x }
    public override function get y() :Number
    { return _y }
    public override function get width() :Number
    { return _width }
    public override function get height() :Number
    { return _height }
    public override function get alpha() :Number
    { return _alpha }
    public function set url($value:String) :void
    { _url = $value; _init(); }
    public override function set x($value:Number) :void
    { _x = $value; _init(); }
    public override function set y($value:Number) :void
    { _y = $value; _init(); }
    public override function set width($value:Number) :void
    { _width = $value; _init(); }
    public override function set height($value:Number) :void
    { _height = $value; _init(); }
    public function set trans($value:Number) :void
    { _alpha = $value; _init(); }
}

class Preloader extends Loader
{
    private var preBG :Sprite = new Sprite;
    private var preFG :Sprite = new Sprite;

    //background
    private var BG_x :Number;
    private var BG_y :Number;
    private var BG_w :Number;
    private var BG_h :Number;
    private var BG_a :Number;
    
    //foreground
    private var FG_x :Number;
    private var FG_y :Number;
    private var FG_w :Number;
    private var FG_h :Number;
    private var FG_a :Number;
    
    protected var _obj :Object; //so we can add our children
    protected var _url :String;
    protected var _pre :Boolean;
    protected var _ste :Boolean;
    
    public function Preloader($obj:Object, $url:String, $pre:Boolean)
    {
        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
        
        _obj = $obj;
        _url = $url;
        _pre = $pre;
        _ste = false;
        
        var bgWidth  :Number = (_obj.width * 0.66);
        var bgHeight :Number = (60);
        
        BG_x = (_obj.x + (_obj.width / 2) - (bgWidth / 2));
        BG_y = (_obj.y + (_obj.height / 2) - (bgHeight / 2));
        BG_w = (bgWidth);
        BG_h = (bgHeight);
        BG_a = (0.5);
        
        FG_x = (BG_x + 4);
        FG_y = (BG_y + 4);
        FG_w = (0);
        FG_h = (BG_h - 8);
        FG_a = (0.75);
    }
    
    public function _init() :void
    {
        _obj.addChild(preBG);
        _obj.addChild(preFG);        
        
        if (_pre)
        {
            contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoaderProgress);
            contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
            
            BG_a = (0.5);
            FG_a = (0.75);
            FG_w = (0);
            _initBG();
            _initFG();
        }
        
        contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
        
        load(new URLRequest(_url), new LoaderContext(true));
    }
    
    public function _initBG() :void
    {
        preBG.graphics.clear         ();
        preBG.graphics.lineStyle     (4, 0xFFFFFF, BG_a);
        preBG.graphics.beginFill     (0, BG_a);
        preBG.graphics.drawRoundRect (BG_x, BG_y, BG_w, BG_h, 12);
        preBG.graphics.endFill       ();
    }
    
    public function _initFG() :void
    {
        preFG.graphics.clear         ();
        preFG.graphics.beginFill     (0xFFFFFF, FG_a);
        preFG.graphics.drawRoundRect (FG_x, FG_y, FG_w, FG_h, 6);
        preFG.graphics.endFill       ();
    }
    
    public function addedToStage($e:Event) :void
    {
        removeEventListener(Event.ADDED_TO_STAGE, addedToStage);

        _init();
    }
    
    public function onLoaderProgress($e:ProgressEvent) :void
    {
        state = false;
        
        var loaderContext :Number = (BG_w - 8);    
        var deltaProgress :Number = ($e.bytesTotal > $e.bytesLoaded) ? ($e.bytesLoaded / $e.bytesTotal) : 0.01;
        
        loaderWidth = (deltaProgress * loaderContext);
    }
    
    public function onLoaderComplete($e:Event) :void
    {
        contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onLoaderProgress);
        contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoaderComplete);
        
        state = true;
        
        //inherit our parent
        x = parent.x;
        y = parent.y;
        width = parent.width;
        height = parent.height;
        Resources.colArr.push(this);
        
        if (_pre) {addEventListener(Event.ENTER_FRAME, onEnterFrame);}
    }
        
    public function onEnterFrame($e:Event) :void
    {fadeOut()}
    
    public function fadeOut() :void
    {
        if   (FG_a > 0) {alpha -= 0.025;}
        else {removeEventListener(Event.ENTER_FRAME, onEnterFrame); parent.removeChild(preBG); parent.removeChild(preFG);}
    }

    public function get url() :String
    { return _url }
    public function get state() :Boolean
    { return _ste }
    public override function get alpha() :Number
    { return FG_a } //because foreground alpha is, by default, a greater quantity
    public function set url($value:String) :void
    { _url = $value; _init(); }
    public function set state($value:Boolean) :void
    { _ste = $value; }
    public override function set alpha($value:Number) :void
    { BG_a = FG_a = $value; _initBG(); _initFG(); } //background alpha will increase, by inheriting foreground's alpha (since background alpha is, by default, less of a quantity
    public function set loaderWidth($value:Number) :void
    { FG_w = $value; _initFG(); }
}

class Text_Output extends TextField
{
    private var textFormat :TextFormat;
    
    protected var _content :String;
    protected var _x :Number;
    protected var _y :Number;
    protected var _font :String;
    
    public function Text_Output($content:String, $x:Number = 0, $y:Number = 0, $font:String = "Helvetica")
    {
        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
        
        _content = $content;
        _x = $x;
        _y = $y;
        _font = $font;
        
        multiline = true;
        autoSize = "left";
        selectable = mouseEnabled = false;
        antiAliasType = AntiAliasType.ADVANCED;
    }
    
    public function _init() :void
    {
        text = _content;
        x = _x;
        y = _y;
        
        textFormat = new TextFormat(_font);
        setTextFormat(textFormat);
    }
    
    public function addedToStage($e:Event) :void
    {
       removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
       
       _init(); 
    }
    
    public function get font() :String
    { return _font }
    public function get nWidth() :Number
    { return width }
    
    public function set font($:String) :void
    { _font = $; _init(); }
    public function set content($:String) :void
    { _content = $; _init(); }
}

class Resources
{
    public static var colArr :Array = [];
    
    public static const URL1 :String = "http://i609.photobucket.com/albums/tt178/g500pb/album%202/fl_03c9fb5c6b66afa37b6c5de5aedd2c2e.jpg";
    public static const URL2 :String = "http://i609.photobucket.com/albums/tt178/g500pb/album%202/fl_04c6906524cd877e833fe26ddaddc62f.jpg";
    public static const URL3 :String = "http://www.wallpaperup.com/uploads/wallpapers/2012/09/10/13699/6e07ade0cfe8ec9f84fd2d4b3fa7fe60.jpg";
    public static const URL4 :String = "fake.png";
    public static const URL5 :String = "";
}