Preloaders, something that you can never escape from. Hence I decided to share one of the ways to create a Flex Web Application Preloader.
Some Codings for the fancy preloader swf file.
//This variable will be shown on the screen...
var currentValue:int = 0;
//This variable stores the precentage loaded...
var newValue:int = 0;
//Add a ENTER_FRAME Event so that the preloader will
//animate from the currentValue to the newValue
this.addEventListener(Event.ENTER_FRAME, enterFrameEvent);
//This function will handle the calculation
//between the 2 variables 'currentValue' and 'newValue'
function enterFrameEvent(event:Event):void
{
if(currentValue < newValue)
{
currentValue = newValue;
updateContent();
}else if(currentValue == 100)
{
this.removeEventListener(Event.ENTER_FRAME,
enterFrameEvent);
}
}
//Update the Progress of the Preloader
//and the Progress Text
function updateContent():void
{
preloader_mc.gotoAndStop(currentValue);
percent_txt.text = currentValue + "%";
}
//This function will be called from the
//Flex Application.
function setPreloader(value:int):void
{
newValue = value;
}
Main Application File - FlexCustomPreloader.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="100%" height="100%"
preloader="com.zcs.CustomPreloader">
<mx:Script>
<![CDATA[
//Embed a heavy dummy asset
[Embed(source="../resources/music.swf")]
public var contentClass:Class;
]]>
</mx:Script>
<mx:VBox width="100%" height="100%"
verticalAlign="middle"
horizontalAlign="center">
<mx:Label text="Hello World..."/>
</mx:VBox>
</mx:Application>
Custom Preloader File - CustomPreloader.as
package com.zcs
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.utils.Timer;
import mx.containers.VBox;
import mx.controls.SWFLoader;
import mx.events.FlexEvent;
import mx.preloaders.DownloadProgressBar;
public class CustomPreloader extends DownloadProgressBar
{
//Embed a swf that will be used as a preloader
[Embed(source="../resources/loading2.swf")]
public var preloaderClass:Class;
private var preloadMovieClip:MovieClip;
//Like the Flash file, _currentPercent will be
//shown as the current loading progress
private var _currentPercent:int = 0;
//_maxPercent will be the precentage of the file
//that has been loaded
private var _maxPercent:int = 0;
public function CustomPreloader()
{
super();
//Add the preloader swf to the Stage
preloadMovieClip = new preloaderClass();
addChild(preloadMovieClip);
}
// Define the event listeners for the preloader events.
override public function set preloader(preloader:Sprite):void {
preloader.addEventListener(
ProgressEvent.PROGRESS, myHandleProgress);
preloader.addEventListener(
Event.COMPLETE, myHandleComplete);
preloader.addEventListener(
FlexEvent.INIT_PROGRESS, myHandleInitProgress);
preloader.addEventListener(
FlexEvent.INIT_COMPLETE, myHandleInitEnd);
preloader.addEventListener(Event.ENTER_FRAME,
enterFrameEvent);
}
//This function will be used to access the content in the swf
private function getSWFLoaderContent(tempSWF:MovieClip):*
{
var tempSWFContent:*;
var tempSWFContent1:*;
tempSWFContent = tempSWF.getChildAt(0);
tempSWFContent = tempSWFContent.content;
return tempSWFContent;
}
private function enterFrameEvent(event:Event):void
{
//If the swf haven't beenn added to the stage
//yet, then we will not be doing anything
if(getSWFLoaderContent(preloadMovieClip))
{
}else{
return;
}
//Compare _currentPercent and _maxPercent...
if(_currentPercent < _maxPercent)
{
_currentPercent ++;
}
//And pass it into the preloader swf file
getSWFLoaderContent(preloadMovieClip).
setPreloader(_currentPercent);
//Once the flex app has been loaded completely...
//Trigger a timer for 2 sec and execute
//dispatchComplete function after that
if(_currentPercent == 99)
{
var timer:Timer = new Timer(2000,1);
timer.addEventListener(TimerEvent.TIMER,
dispatchComplete);
timer.start();
}
}
// Event listeners for the ProgressEvent.PROGRESS event.
private function myHandleProgress(event:ProgressEvent):void {
_maxPercent = Math.floor((event.bytesLoaded / event.bytesTotal) * 98);
}
// Event listeners for the Event.COMPLETE event.
private function myHandleComplete(event:Event):void {
}
// Event listeners for the FlexEvent.INIT_PROGRESS event.
private function myHandleInitProgress(event:Event):void {
}
// Event listeners for the FlexEvent.INIT_COMPLETE event.
// When everything is loaded, set _maxPercent to 99
private function myHandleInitEnd(event:Event):void {
_maxPercent = 99;
}
// Event listener for the Timer to pause long enough to
// read the text in the download progress bar.
private function dispatchComplete(event:TimerEvent):void {
//Pass 100 into the preloader.swf
getSWFLoaderContent(preloadMovieClip).setPreloader(100);
dispatchEvent(new Event(Event.COMPLETE));
}
}
}
* Click here for the demo.^ Click here for the source files.
No comments:
Post a Comment