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で行う場合の例を以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<strong>Imageコンポーネント(Img)にロードされたSWFを別のImageコンポーネント内(DupImg)に複製</strong> <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)