Я намеревался написать полное руководство по теме preloaders, но я все еще в процессе запуска моего нового сайта ... до тех пор, вот основные моменты:
Нам понадобятся две части -
одна на стороне javascript: отправка flashvars в preloader и встраивание flash-объекта в структуру html.Я люблю swfobject за его простоту и пуленепробиваемость.
html:
<html>
<head>
<script type="text/javascript" src="/javascript/swfobject/swfobject.js"></script>
<script type="text/javascript" src="/javascript/logic.js"></script>
</head>
<body>
<div id="flashContainer">content for when swfobject fails</div>
</body>
</html>
logic.js:
var _flashvars =
{
filePath : "/flash/swf/yourcontent.swf",
FR : "60",
verbose : "false",
SW : "760",
SH : "550"
};
var _params =
{
quality : 'high',
menu : 'false',
base : '/flash/swf/'
};
var _attr =
{
id : "flashContainer"
};
function embedSWF()
{
swfobject.embedSWF(
"/flash/preLoader.swf",
"flashContainer",
"760",
"550",
"9.0.0",
"/javascript/swfobject/expressInstall.swf",
_flashvars,
_params,
_attr
);
return;
}
//onload event
embedSWF()
Со стороны флэш-памяти у нас есть предзагрузчик fla (или как вы его строите).Это целенаправленно «контентно-независимый», потому что я использую его для всей предварительной загрузки.Я полагаю, вы могли бы сэкономить некоторое время, жестко запрограммировав флэш-переменные.В любом случае, у меня есть два класса -
Main.as - который загружает flashvars во время выполнения, инициирует загрузку, а затем отвечает на процесс загрузки, наконец добавляя загруженный контент в список отображения.
Preloader.as - который выполняет всю тяжелую работу.
Обратите внимание, что это частичные классы, извлеченные непосредственно из моего проекта, и я включил только основные элементы (вам придется закончитькод и портной при необходимости).
Обратите внимание, что это один из многих способов сделать это;)
Main.as:
package {
public class Main extends MovieClip
{
private var _loadParams :Object;
private var _filePath :String;
private var _frameRate :uint;
private var _stageH :Number;
private var _stageW :Number;
private var _verbose :Boolean;
public function Main():void
{
super();
if (stage)
{
init();
}
else
{
this.addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
}
}
/**
* once preloader is onstage, create param object.
* assign vars from param object
*
* stage height / stage width:
* some files may have SH and SW defined, if they are, used them as
* stage dimensions. If they are not, default to current stageHeight,Width
*
* @param e
*/
private function init(e:Event = null):void
{
this.removeEventListener(Event.ADDED_TO_STAGE, init);
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
_loadParams = new Object();
_loadParams = LoaderInfo(stage.loaderInfo).parameters;
_filePath = String( parseParam( "filePath", "undefined.swf" ) );
_frameRate = uint( parseParam( "FR", "24" ) );
_stageH = Number( parseParam( "SH", String(stage.stageHeight) ) );
_stageW = Number( parseParam( "SW", String(stage.stageWidth) ) );
( String( parseParam( "verbose", "true" )) == "true")?_verbose = true : _verbose = false;
initiateLoader();
}
private function parseParam(name:String, defaultValue:String):String
{
if (_loadParams.hasOwnProperty(name) && _loadParams[name] != "" && _loadParams[name] != "undefined")
{
return _loadParams[name];
}
else
{
return defaultValue;
}
}
private function initiateLoader():void
{
_loader = new PreLoader(_filePath, _verbose);
_loader.addEventListener("displayObjectLoaded", onLoadComplete, false, 0, true);
this.addEventListener(Event.ENTER_FRAME, setLoadPercentage, false, 0, true);
}
/**
* respond to load graphically
*/
private function setLoadPercentage(e:Event):void
{
_loadPercentage = Math.round((_loader.progressNumberArray[0] /_loader.progressNumberArray[1])*100);
if (_verbose)
{
_txt.text = String(_loadPercentage) + "% Loaded";
}
}
/**
* finally, add the loader object into the display list.
*/
private function onLoadComplete(evt:Event):void
{
_loader.removeEventListener("displayObjectLoaded", onLoadComplete);
this.removeEventListener(Event.ENTER_FRAME, setLoadPercentage);
this.addChild(_loader);
}
Preloader.как
package {
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;
import flash.text.TextField;
public class PreLoader extends Sprite {
private var _loader : Loader;
private var _loaderInfo : LoaderInfo;
private var _verbose : Boolean = false;
private var _loadProgressString : String = "";
private var _bytesLoaded : Number = 0;
private var _bytesTotal : Number = 0;
public function PreLoader(path:String, verbose:Boolean)
{
_verbose = verbose;
_loader = new Loader();
_loaderInfo = _loader.contentLoaderInfo;
// there are several other events to listen for and respond to
_loaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress, false, 0, true);
_loaderInfo.addEventListener(Event.COMPLETE, onComplete, false, 0, true);
try
{
_loader.load(new URLRequest(path));
}
catch (evt:Error)
{
_loader.unload();
var errMsg:TextField = new TextField();
with (errMsg) {
width = 300;
text = "Unable to load content:\n" + evt.toString();
}
addChild(errMsg);
dispatchEvent(new Event("displayObjectLoaded"));
}
}
private function onProgress(evt:ProgressEvent):void
{
var loadPercent:int = Math.round((evt.bytesLoaded / evt.bytesTotal) * 100);
_bytesLoaded = evt.bytesLoaded;
_bytesTotal = evt.bytesTotal;
_loadProgressString = (loadPercent + " % loaded: " + _bytesLoaded + " bytes of " + _bytesTotal + " total bytes");
if (_verbose)
{
trace(_loadProgressString);
}
}
private function onComplete(evt:Event):void
{
_loaderInfo.removeEventListener(Event.COMPLETE, onComplete);
_loaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
addChild(_loader);
dispatchEvent(new Event("displayObjectLoaded"));
}
/**
* getter for load details
*/
public function get progressNumberArray():Array
{
return [_bytesLoaded,_bytesTotal];
}
Надеюсь, это поможет вам начать.Дайте мне знать, если у вас есть какие-либо вопросы.
ура!