Продолжаю тему прелоадеров на ActionScript. Но на этот раз создадим простейший внешний прелоадер на ActionScript 3.0. Принцип работы внешнего предзагрузчика flash-роликов прост: ролик-прелоадер загружает внешний флеш-ролик (точно также, как если бы он загружал картинку или текстовый документ) и отображает процесс загрузки.
Внешне это будет выглядеть следующим образом (в данном примере загрузки swf-ролика не происходит, а только показывается зацыкленная анимация самого прелоадера):
Достоинством внешнего флеш-прелоадера является то, что он более точно отображает процесс загрузки swf-ролика. Нет такой временной задержки между началом отображения flash-ролика и началом работы предзагрузчика, которая наблюдается в случае использования встроенного прелоадера. Есть, конечно, и свои недостатки (так, например, у многих внешних прелоадеров наблюдаются проблемы с правильным позиционированием, масштабированием загруженных роликов и т. д.).
Итак, приступим к написанию кода (пояснения даны в виде комментариев в коде)...
Код ActionScript 3.0:
/*
импорт классов
*/
import flash.display.Sprite;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
/*
устанавливаем значение переменных
*/
var w:uint = 200;// ширина прелоадера
var h:uint = 10;// высота прелоадера
var containerColor:uint = 0xffffff;// цвет фона
var preloaderColor:uint = 0xcccccc;// цвет фона прелоадера
var bandColor:uint = 0x333333;// цвет индикатора загрузки
/*
рисуем контейнер
*/
var container:Sprite = new Sprite();
container.graphics.beginFill(containerColor,1);
container.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
container.graphics.endFill();
addChild(container);
/*
рисуем контейнер прелоадера
*/
var preloaderContainer:Sprite = new Sprite();
preloaderContainer.graphics.lineStyle(1,bandColor,1);
preloaderContainer.graphics.beginFill(preloaderColor,1);
preloaderContainer.graphics.drawRect(0,0,w,h);
preloaderContainer.graphics.endFill();
container.addChild(preloaderContainer);
/*
помещаем наш прелоадер на середину флеш-ролика
*/
preloaderContainer.x = (stage.stageWidth - w) / 2;
preloaderContainer.y = (stage.stageHeight - h) / 2;
/*
рисуем индикатор загрузки
*/
var band:Sprite = new Sprite();
band.graphics.beginFill(bandColor,1);
band.graphics.drawRect(0,0,w,h);
band.graphics.endFill();
preloaderContainer.addChild(band);
band.scaleX = 0;
/*
загружаем ролик и отслеживаем основные события (какие события отслеживать и как на них реагировать вы решите сами, но, как минимум нам необходимо следить за COMPLETE и PROGRESS)
*/
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onProgress);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onIOError);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSecurityError);
loader.load(new URLRequest("content/simple3d_5.swf"));
/*
если надо, чтобы загружаемые флеш-ролики не кэшировались, то можно так:
loader.load(new URLRequest("simple3d_5.swf?rand=" + new Date().time));
*/
/*
обработчики событий
*/
function onComplete(event:Event):void
{
/*
удаляем прелоадер
*/
container.removeChild(preloaderContainer);
/*
добавляем загруженный ролик на сцену
*/
container.addChild(loader);
}
function onIOError(event:IOErrorEvent):void
{
trace("IOErrorEvent");
}
function onSecurityError(event:SecurityErrorEvent):void
{
trace("SecurityErrorEvent");
}
function onProgress(event:ProgressEvent):void
{
var percent:Number = event.bytesLoaded / event.bytesTotal;
band.scaleX = percent;
}
Результат:
Скачать исходники к данному уроку можно по следующей ссылке - скачать исходники (под Adobe Flash CS5).