AS3で外部SWFの読み込みとロード状況の監視をする「SWFLoader」クラス

SWFLoader

SWFLoader

ActionScript3.0で外部SWFの読み込みとロード状況の監視をする「SWFLoader」クラスを作成しました。

SWFファイルを読み込むターゲットと、SWFファイルへのパスを指定して使用します。

ロード開始時と完了時に実行する関数を追加指定したり、ローディング時とロード完了時のフラグを外部から取得することが可能です。

下記のボタンより、ソースのダウンロード及びサンプルの閲覧ができます。

Sample Download

【使用例】

main.swfを読み込み


var myLoader:SWFLoader=new SWFLoader();
myLoader.load(this,"main.swf");

main.swfを _mc(MovieClip)へ読み込み


var myLoader:SWFLoader=new SWFLoader();
myLoader.load(_mc,"main.swf");

main.swfを _mc(MovieClip)へ読み込み、ロード開始時に onLoadFunctionを実行する


var onLoadFunction:Function = function(){
trace("外部SWFのロードが開始されました")
};
var myLoader:SWFLoader=new SWFLoader();
myLoader.load(_mc,"main.swf", onLoadFunction);

main.swfを _mc(MovieClip)へ読み込み、ロード完了時に onCompleteFunctionを実行する


var onCompleteFunction:Function = function(){
trace("外部SWFのロードが完了しました")
};
var myLoader:SWFLoader=new SWFLoader();
myLoader.load(_mc,"main.swf", null, onCompleteFunction);

【ロード状況の取得】

ローディング中であればメッセージを出力する


if(SWFLoader.loading) trace("外部SWFのロード中です…(TT)b");

ロードが完了していればメッセージを出力する


if(SWFLoader.complete) trace("外部SWFのロードが完了しました\(^o^)/");

【パラメータ説明】

_container


外部SWFをロードするターゲット
[DisplayObjectContainer][省略不可]

url


ロードする外部SWFへのパス
[String][省略不可]

onLoadFunction


ロード開始時に実行される関数
[Function][規定値:null][省略可]

onCompleteFunction


ロード完了時に実行される関数
[Function][規定値:null][省略可]

ソースコード

import jp.atziluth.system.SWFLoader;


package jp.atziluth.system{
import flash.display.DisplayObjectContainer;
import flash.display.MovieClip;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLRequest;
import caurina.transitions.Tweener;
import jp.atziluth.utils.cleaner;
public class SWFLoader extends MovieClip {
private var _container:DisplayObjectContainer;
private var loader:Loader;
private static var onLoadFunction:Function;
private static var onCompleteFunction:Function;
public static var loadProgress:loadClip=new loadClip();
private static var isLoading:Boolean = false;
private var totalBytes:Number;
private var loadedBytes:Number;
private var barscale:Number;
private var per:uint;
private var Tween:Function = Tweener.addTween;
private var removeTween:Function = Tweener.removeTweens;
public function load(
_container:DisplayObjectContainer,
url:String,
onLoadFunction:Function=null,
onCompleteFunction:Function=null
):void {
var swfURL:URLRequest = new URLRequest(url);
var loader:Loader = new Loader();
this.loader = loader;
this._container = _container;
this._container.addChildAt(loader, this._container.numChildren);
SWFLoader.onLoadFunction = onLoadFunction;
SWFLoader.onCompleteFunction = onCompleteFunction;
loader.contentLoaderInfo.addEventListener(Event.OPEN, onLoadHandler);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorHandler);
loader.visible = false;
loader.load(swfURL);
}
private function onLoadHandler(event:Event):void {
_container.addChildAt(SWFLoader.loadProgress,_container.numChildren);
with (SWFLoader.loadProgress) {
name = "preloader";
alpha = 0;
}
if (SWFLoader.loadProgress.alpha < 1) {
Tween(
SWFLoader.loadProgress,{
alpha:1,
time:.25,
transition:"Strong.easeOut"
});
}
if (SWFLoader.onLoadFunction != null) {
SWFLoader.onLoadFunction();
}
SWFLoader.isLoading = true;
}
private function onProgressHandler(event:ProgressEvent):void {
totalBytes = event.bytesTotal;
loadedBytes = event.bytesLoaded;
per = Math.floor(loadedBytes / totalBytes * 100);
barscale = loadedBytes / totalBytes;
SWFLoader.loadProgress.bar.scaleX = barscale;
SWFLoader.loadProgress.per.text = per.toString() + "%";
}
private function onCompleteHandler(event:Event):void {
Tween(
SWFLoader.loadProgress,{
alpha:0,
time:2,
transition:"easeInOutCubic",
onComplete:finishLoader
});
function finishLoader():void {
removeTween(SWFLoader.loadProgress);
cleaner.deleteContainer(SWFLoader.loadProgress,0,null);
loader.contentLoaderInfo.removeEventListener(Event.OPEN, onLoadHandler);
loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgressHandler);
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onCompleteHandler);
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onIOErrorHandler);
loader.visible = true;
}
if (SWFLoader.onCompleteFunction != null) {
SWFLoader.onCompleteFunction();
}
SWFLoader.isLoading = false;
}
private function onIOErrorHandler(event:Event):void {}
public static function get loading():Boolean {
return (SWFLoader.isLoading);
}
public static function get complete():Boolean {
return !(SWFLoader.isLoading);
}
}
}

サンプルソースコード: "preloader.swf"】

Preloader.as


package {
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import jp.atziluth.system.SWFLoader;
public class Preloader extends SWFLoader {
private var mainLoader:SWFLoader=new SWFLoader();
private var onLoadFunction:Function = function(){
Preloader.loadProgressLayout()
};
private var onCompleteFunction:Function = function(){};
public function Preloader():void {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.frameRate = 60;
mainLoader.load(
this,
"main.swf",
onLoadFunction,
onCompleteFunction
);
stage.addEventListener(Event.RESIZE,onStageResize);
}
private function onStageResize(event:Event=null):void {
Preloader.loadProgressLayout();
}
private static const ICON_SIZE:uint = 20;
public static function loadProgressLayout():void {
with (SWFLoader.loadProgress) {
alpha = 1;
x = 0;
y = 0;
per.visible = false;
per.alpha = 0;
bar.y = Math.round(stage.stageHeight / 2 - bar.height / 2);
bar.cont.width = stage.stageWidth;
basebar.y = bar.y;
basebar.cont.width = bar.cont.width;
icon.x = Math.round(stage.stageWidth / 2 - Preloader.ICON_SIZE / 2);
icon.y = Math.round(bar.y + (Preloader.ICON_SIZE+3));
}
}
}
}

サンプルソースコード: "main.swf"】

Main.as


package {
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import jp.atziluth.gui.relativeLayout;
public class Main extends MovieClip {
private const COMPLETE:completeClip=new completeClip();
public function Main():void {
super();
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(event:Event):void {
this.removeEventListener(Event.ADDED_TO_STAGE, init);
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
this.addChild(COMPLETE);
stage.addEventListener(Event.RESIZE,onStageResize);
lauoutMain();
}
private function onStageResize(event:Event=null):void {
lauoutMain();
}
private function lauoutMain():void {
relativeLayout.init(stage, COMPLETE);
}
}
}

【留意事項】

ロード状況を知らせるプログレスバーにはライブラリのリンケージクラス: "loadClip"を使用しています。

少し面倒ですがライブラリにある "_loadClip"フォルダを丸ごとコピーするか、SWFLoader.asの "loadProgress"、"loadClip"と記載のある箇所を編集してご使用ください。

改良案のご提示などお待ちしています。こちらのコメント欄か、info[at]atziluth.jp までお知らせいただけると嬉しいです。

【更新履歴】

2010/04/02

改訂版(Version 1.1)を公開しました

Download