loadSWF()を使ってswfをシーンのページコンテンツとして読み込む試みの続きです。
前回はswfの読み込みをコンストラクタで行っていたので、サイズが大きなswfだった場合にはページ表示に間に合わないことがあるだろうという懸念がありました。また、大きなswfをいくつも読み込んだままにしておく手法には限界があるという問題もあります。
そこで今回はページを表示する度にswfを読み込み直し、読み込みが終わった時点で表示するようにしました。タイミングはatCastAdded()です。次のように読み込みとトゥイーン表示をaddCommand()を使ってシリアルコマンドとして連続します。
[:script:]キャスト表示イベントでswf読み込みと表示を行う
protected override function atCastAdded():void {
addCommand(
new Prop(this,{x:20,y:-stage.stageHeight}),
//swf読み込み
new Func(loadSWF),
new DoTweener( this, { y:20,time:1, transition:"easeinoutsin"} )
);
}
ここでswf読み込みはFunc(loadSWF)のようにすることで、loadSWF関数をaddCommand()の引数として渡せるようにします。loadSWF関数は次のように定義します。わざわざ別関数にしたのは、プログレス処理を組み込みたかったからです。
[:script:]swfを読み込む
private function loadSWF():void {
//pageコンテンツをURLから読み込む(swf、画像)
var ldswf:LoadSWF = new LoadSWF(new URLRequest(_url));
ldswf.onProgress = function():void {
trace(ldswf.bytesLoaded + " / " + ldswf.bytesTotal + " (" + ldswf.percent + "%)" );
};
ldswf.onComplete = function():void{
addChild(this.loader);
};
ldswf.execute();
}

→
swfを試す。
完成形のサンプルファイル一式→
LoadSWF_pages2.zip
さて、この方法でページ表示でswfの読み込みを待ってswf表示ができるようになりましたが、このままではページ表示のたびに繰り返し同じswfを読み込んで追加してしまいます。そこでシーンを移動したならばページの表示リストからswfを取り除きます。
*もしかすると、取り除いたswfを明示的にメモリから消去する必要があるかもしれませんが、よくわかりません。このままでもいいのかな?
[:script:]ページを消すさいにはswfも消す
protected override function atCastRemoved():void {
addCommand(
new DoTweener( this, { y:stage.stageHeight, time:1, transition:"easeinoutsin"} ),
//読み込んだswfを消すために行う
new RemoveAllChildren(this)
);
}
ところで、前回ディープリンクを試したところ、下層ページのURLを直接開くとindexページ(今回からタイトルをtopに変更)のロゴマークが表示されたままでUIパネルが出てこないという状況でした。今回、これを解決しています。
↑
ありゃ!!解決してない。 orz
しかし「index.html/#/sceneA」となって欲しいところが「index.html#/sceneA」のように/が1つ抜けています。原因は調査中です。

↑
この結果が仕様どおりだということがわかりました。
問題ですらありませんでした。(^ ^;;;
「/#/sceneA」こうしたい場合には、htmlを呼び出す際に「http://sample.com/hoge/」のように/で終わるURLでリンクするってことですね!
→
swfを試す。