画像が固定(更新なし)のスライドショー的なものを作っていて、外部swfにひとまとめにして、そこから画像を取り出そうと考えてみた。
画像はphoto.swfに入れて、そのライブラリのプロパティでリンケージを設定して「photo0」のようにクラス名をつけておく。それで書き出すだけ。
で、取り出しはSWFをロードするクラスに書きます。
package {import flash.events.EventDispatcher;import flash.display.Loader;import flash.display.LoaderInfo;import flash.display.MovieClip;import flash.net.URLRequest;import flash.events.Event;import flash.system.LoaderContext;import flash.system.ApplicationDomain;import flash.events.ProgressEvent;public class SwfLoader extends Loader {var flg_play:Boolean;var func_complete:Function;private var cont:LoaderContext;//コンストラクタfunction SwfLoader(url:String,isPlay:Boolean,func_comp:Function = null) {flg_play = isPlay;func_complete = func_comp;//各種イベント定義this.contentLoaderInfo.addEventListener(Event.INIT,onInit_swf);this.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded_swf);this.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadProgress_swf);//for URLvar urlReq:URLRequest = new URLRequest(url);cont = new LoaderContext();cont.applicationDomain = ApplicationDomain.currentDomain;this.load( urlReq, cont);}//—–Event.INITfunction onInit_swf(evt:Event):void {//ロード中は再生しないよう停止var info:LoaderInfo = LoaderInfo(evt.target);var mc:MovieClip = info.content as MovieClip;mc.stop();}//swf:ロード継続private function onLoadProgress_swf(e:ProgressEvent):void {//継続イベント:送信(ProgressEvent.PROGRESSを引き継ぐ)dispatchEvent(e);}//—–Event.COMPLETEfunction onLoaded_swf(evt:Event):void {try {//指定関数の呼び出し(LoaderInfo.contentを渡す)var info:LoaderInfo = LoaderInfo(evt.target);var mc:MovieClip = info.content as MovieClip;//再生の有無if (flg_play) {mc.play();} else {mc.stop();}if (func_complete != null) {func_complete(mc);}} catch (err:TypeError) {trace(err.message);}}public function getImage():Loader {return this;}public function checkClass(ClassName:String):Class {var cl:Class;//アプリケーションドメインに指定したクラスがあるかif (cont.applicationDomain.hasDefinition(ClassName)) {//取得したクラスをClass型変数に代入cl = cont.applicationDomain.getDefinition(ClassName) as Class;trace(“外部SWFファイルから”+ClassName+”クラスをインポートしました”);} else {trace(“外部SWFファイルには”+ClassName+”クラスは存在しません”);}return cl;}}}
本体側では、こんな感じにswfをロードして・・・
import SwfLoader;var swf_content:SwfLoader;//画像用swf:ロードfunction loadContent_img():void {var url:String = “photo.swf”;var flg_play:Boolean = false;swf_content = new SwfLoader(url,flg_play);swf_content.addEventListener(ProgressEvent.PROGRESS, checkLoad_font);this.addChildAt(swf_content,1);}
SwfLoaderのcheckClass()という関数を使って、外部swfからBitmapDataを取得します。
//ビットマップ取得function getBitmap_img(no:int):Bitmap {var name_bmp:String = “photo” + String(no);var imgClass:Class = swf_content.checkClass(name_bmp);if (imgClass != null) {var img:BitmapData = new imgClass(stage.stageWidth,stage.stageHeight);var bmp:Bitmap = new Bitmap(img);}return bmp;}
納品先での画像差し替えが不要で、定期的に一括更新かけるような場合は便利かも。作例はこちら。
下記のサイトを参考にさせていただきました。