プログラミング工房
TOP
Flex基本
開発環境 JavaScript連携 PHP連携1 PHP連携2(AMFPHP) ウィンドウ ボタンスキン 矩形スキン ローカルファイル(テキスト) F5等の対策 ローカルファイル(イメージ) ダウンロード、アップロード 1枚の画像のカラーを変更 時間のかかる計算処理 外部SWFの読込み
Flexで3D
Flexだけで3D Papervision3Dを使ってみる 3Dオブジェクト カメラ、前後判定の工夫しました 自由な形状を作成
Flexでクラス
Class1(白黒ゲームの盤) Class2(白黒ゲームのプレイヤー) Class3(プレイヤーを外部SWF)
PHP
共通関数1
Flexの作品
お問合せの説明 サンプルのソース表示の説明 分子構造の表示(PDBファイル) マンデルブロ集合の画像作成 swf参加型白黒ゲーム(Reversi) ストップウォッチ WEB素材
AIR
AIRを使ってみる ソースファイルのHTML変換を作る
etc.
マンデルブロ集合のギャラリー ジュリア集合のギャラリー wonderflを使ってみました お問合せ

Flex4基本-外部SWFの読込み

■2011.04.21:作成
■2011.04/26:追加
■2011.05/30:改定
サンプル(今回は外部サーバ) サンプルのソース

外部SWFの読込んで利用する

Flexでクラス-Class3(プレイヤーを外部SWF) で試したようにFlexには外部のswfファイルを読み込んで利用することが出来ので使い方等をまとめてみた。

wonderfl(hi.kurosawa) の「外部サーバのSWFファイル読み込みのテスト」および「ローカルファイルのSWFの読み込み 」も登録してあります。
読み込み用のswfのソースとswfファイル

ローカルSwf読込み

Flex4基本-ローカルファイル(イメージ) のローカルイメージの読込みとほぼ同じ方法でローカルのswfファイルが読み込むことが出来ます。
「Object」の形で保持しないと読込みswfの関数は利用できないようだ?
//ローカルSwf読込み==========================================
private function fncLocLoadSwf():void {
    // イベント登録
    filRef = new FileReference();
    filRef.addEventListener(Event.SELECT, onFileSelect);

    // ファイル選択ダイアログを表示...
    var swfTypes:FileFilter;
    swfTypes = new FileFilter("swfファイル(*.swf)", "*.swf");
    filRef.browse(new Array(swfTypes)); 
}
//読み込みSWFファイル選択
private function onFileSelect(e:Event):void {
    // イベントリスナー登録...
    filRef.addEventListener(Event.COMPLETE, onFileComplete);
    filRef.load();
}
//読み込み完了、SWFを展開
private function onFileComplete(e:Event):void {
    ladSwf = new Loader;
    // イベント登録
    ladSwf.contentLoaderInfo.addEventListener(Event.COMPLETE, compLoader1);
    ladSwf.loadBytes(filRef.data);
}
          :
//読み込んだSWFを表示
public function compLoader1(evt:Event):void {
    while (sveSwf.numChildren) sveSwf.removeChildAt(0);
    sveSwf.addChild(ladSwf);
    objLoadSwf = ladSwf.content as Object;
}

同一サーバのswf読込み

同一サーバのswfは「Loader()」を利用して読み込める。
「compLoader1」関数は「ローカルSwf読込み」と同じものを利用している。
//同一サーバのSwf読込み================================================
private function fncSvrLoadSwf(strSwf:String):void {
    ladSwf = new Loader();
    ladSwf.contentLoaderInfo.addEventListener(Event.COMPLETE,compLoader1)
    ladSwf.load(new URLRequest(strSwfUrl+strSwf));
}
               :
//読み込んだSWFを表示
public function compLoader1(evt:Event):void {
    while (sveSwf.numChildren) sveSwf.removeChildAt(0);
    sveSwf.addChild(ladSwf);
    objLoadSwf = ladSwf.content as Object;
}

外部サーバのSwf読込み

基本的にFlexは自分が読み込まれたドメイン以外にアクセスすることが出来ない。
ただし、外部サーバに「crossdomain.xml」があればアクセスすることが出来る。

今回は外部サーバ「http://www.ne.jp/asahi/kuro/hp/Flex4/LoadSwf/」から
「http://programmingatelier.net/publicSwf/」ディレクトリの下のswfファイルを
読むことを行う。

まずドメインのURLのルートに以下の内容の
「http://programmingatelier.net/crossdomain.xml」を置きます。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM 
            "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
</cross-domain-policy>

アクセスを許可するディレクトリの下に以下の内容の
「http://programmingatelier.net/publicSwf/crossdomain.xml」を置きます。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM 
            "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>

また、ソース上に
Security.loadPolicyFile("http://programmingatelier.net/publicSwf/crossdomain.xml");
が必要になります。(ドメイン全体をアクセス可能にしたときはこの記述は不要)

外部サーバのSwfを読込時は「URLLoader()」と「Loader()」の2段階で読み込む。
「compLoader1」関数は「ローカルSwf読込み」と同じものを利用している。
//外部サーバのSwf読込み=========================================
private function fncExtSvrLoadSwf():void {
    if (txtUrlCrDo.text == "" ) {
        Alert.show("crossdomain.xmlのURLを指定してください", "LoadSwf");
        return;
    }
    if (txtUrlSwf.text == "") {
        Alert.show("読み込むSWFを指定してください", "LoadSwf");
        return;
    }
    Security.loadPolicyFile(txtUrlCrDo.text);
    urlLoader = new URLLoader();
    urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
    urlLoader.addEventListener(Event.COMPLETE, onCompUrlLoad);
    urlLoader.load(new URLRequest(txtUrlSwf.text));
}
private function onCompUrlLoad(event:Event):void {
    ladSwf = new Loader();
    ladSwf.contentLoaderInfo.addEventListener(Event.COMPLETE, compLoader1);
    ladSwf.loadBytes(urlLoader.data);
}
//読み込んだSWFを表示
public function compLoader1(evt:Event):void {
    while (sveSwf.numChildren) sveSwf.removeChildAt(0);
    sveSwf.addChild(ladSwf);
    objLoadSwf = ladSwf.content as Object;
}

読込み側と読込まれ側の関数(2011.05/30:改定)


読込み側の関数
 読込んだSwfの関数を実行するには
  *.asで作ったほうは「objLoadSwf.fncTest(・・)」でよいのですが
  *.mxmlで作ったほうは「objLoadSwf.application.fncTest(・・)」となります。
 読込んだSwfが*.asまたは*.mxmlの判断にはobjLoadSwf.hasOwnProperty("application")を
 使います。

 hasOwnProperty関数はプロパティ(関数等)の有無がチェック出来ます。
 これで「fncTest」関数の有無がチェックすれば読込みSWFが対象かチェックできます。
//読込んだSwfの関数実行
private function fncSwfFnc():void {
    if (objLoadSwf == null) {
        Alert.show("SWFを読み込んでください", "LoadSwf");
        return;
    }
    if (objLoadSwf.hasOwnProperty("application") == false) {//*.asで作成されたSWF
        if (objLoadSwf.hasOwnProperty("fncTest") == false) {//関数の有無チェック
            Alert.show("fncTest関数がありません。正しいSWFを読み込んで下さい。"
            , "LoadSwf");
            return;
        }
        txtFromSwf.text=objLoadSwf.fncTest(txtToSwf.text);
    }else {                                             //*.mxmlで作成されたSWF
        //関数の有無チェック
        if (objLoadSwf.application.hasOwnProperty("fncTest") == false) {
            Alert.show("fncTest関数がありません。正しいSWFを読み込んで下さい。"
            , "LoadSwf");
            return;
        }
        txtFromSwf.text=objLoadSwf.application.fncTest(txtToSwf.text);
    }
}

読込まれ側の関数
//読み込み元からコールする関数
        public function fncTest(s:String):String {
            txtDat1.text = s;
            return txtDat2.text;
        }

mxmlで作成したswfの読込みで苦労しました(2011.05/30:改定)

苦労した点は以下の2点です。
 1)読込み側、読込まれ側のswfをmxmlで作成した時、両方とも「main.mxml」作成してはいけません。
mxmlで作成したswf

両方とも「main.mxml」作成し読み込んだとき、こうなります。
両方とも「main.mxml」作成し読み込んだとき
「main.mxml」でなくちゃんと別々の名前を付けて作成すれば問題ありません。

 2)読み込むほうswfの関数の実行はうまくいきませんでした。
  「objLoadSwf.application.fncTest(txtToSwf.text);」の「application」を付ければいい
  ことが分からなかったためだいぶ時間を無駄にしました。
  デバックモードで読み込んだSWF変数「objLoadSwf」をチェックして見つけました。

プログラミング工房