SWFの複製 – Flex

Loaderクラスを使って外部SWFをロードするサンプルはたくさんありますが、今回はLoaderとByteArrayを利用してStageにロード済みのSWFを複製します。

ここで肝になるのはLoaderInfoクラスです。

LoaderInfo クラスは、ロードされる SWF ファイルやイメージファイル (JPEG、GIF、PNG ファイルなど) に関する情報を提供します。LoaderInfo オブジェクトは、すべての表示オブジェクトで使用できます。提供される情報には、ロードの進行状況、ロードする側とロードされたコンテンツの URL、メディアの総バイト数、メディアの規格高さと幅などが含まれます。

複製の手順は以下の通りです。
1. DisplayObject(SWFやロードされたImage)のloaderInfoプロパティからバイト情報を取得(ByteArrayに格納)
2. Loader.loadBytes()でそのバイト情報を読み込む
3. LoaderオブジェクトのcontentLoaderInfoプロパティにアクセスしてロード状況を監視
4. ロードが完了したらLoaderをaddChild

バイト情報を取得するには、loaderInfo.bytesで取得できます。
ただし、FlashPlayerのバージョンが9.0.115.0からじゃないと使えないので注意!
Flex2のリファレンスには載ってませんでした。なのでFlex3.0以降で。

下の図にもあるように、LoaderInfoオブジェクトは、ロードされたオブジェクトファイルとロードした Loader オブジェクト間で共有されているようです。

ロードされたSWFの複製をFlexで行う場合の例を以下に示します。

Imageコンポーネント(Img)にロードされたSWFを別のImageコンポーネント内(DupImg)に複製

<mx:Image id="Img" width="200" height="200" source="starjulia.swf" />
<mx:Image id="DupImg" width="200" height="200" />

<mx:ApplicationControlBar width="100%">
  <mx:Button label="Duplicate" click="{this.duplicateImg()}" />
  <mx:Button label="Delete Duplicate" click="{DupImg.source = null}" />
</mx:ApplicationControlBar>

<mx:Script><![CDATA[

private var loader:Loader;
      
private function duplicateImg():void{
  var ba:ByteArray = Img.content.loaderInfo.bytes
  loader = new Loader();
  loader.loadBytes(ba);
  loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bytesLoaded);
}

private function bytesLoaded(event:Event):void{
  DupImg.source = loader;
}

]]></mx:Script>

(Flashが表示されない場合はこちら→duplicate.swf)

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です