ExternalInterface.addcallbackはFlash(swf)とHTML(JavaScript)を連携させる場合に使う。
JavaScriptから任意のタイミングでswfの関数を呼び出し、引数を得ることができる。
今回はhtml上のボタンから、JavaScript上の関数(as3sendToActionScript)を実行し、ActionScript上の関数を実行するものを作ってみた。
ボタンをクリックすると、Flash内の赤丸が移動する。
以下、実行例とダウンロードファイル一式
↓AS2版
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 27 28 29 30 31 32 33 34 35 36 37 38 |
//JSと交信する機能を読み込みます。 import flash.external.ExternalInterface; //テキストエリアをつくります。 _root.createTextField("return_txt", 0, 0, 0, 300, 20); return_txt.text += "JSからの命令を待っています。"; //円を描きます。 _root.createEmptyMovieClip("_mc",1); _mc.lineStyle (50, 0xFF0000, 100); _mc.moveTo (Stage.width/2, Stage.height/2); _mc.lineTo (Stage.width/2, Stage.height/2+1); /** * JSからの命令はExternalInterface.addCallbackを経由して、 * 関数に引き渡されます。 */ function addCallback(myValue:Number):Void { var houkou:Array = ["左", "下", "上", "右"]; return_txt.text = "JSからの命令を受け取れました。"+houkou[myValue]+"に移動します。"; switch (myValue) { case 0 : _mc._x -= 5; break; case 1 : _mc._y += 5; break; case 2 : _mc._y -= 5; break; case 3 : _mc._x += 5; break; } } //JSから受け取る準備をします。 ExternalInterface.addCallback("JS2AS", null,addCallback); |
↓AS3版
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
package { /** * ... * @author umhr */ import flash.display.Shape; import flash.display.Sprite; import flash.external.ExternalInterface; import flash.text.TextField; public class Main extends Sprite { private var tfStatus:TextField = new TextField(); private var shape:Shape = new Shape(); public function Main():void { //円を描きます。 shape.graphics.beginFill (0xFF0000, 1.0); shape.graphics.drawCircle ( stage.stageWidth/2, stage.stageHeight/2 , 25); stage.addChild(shape); //テキストエリアをつくります。 tfStatus.width = 300; tfStatus.text = "JSからの命令を待っています。"; addChild(tfStatus); //JSから受け取る準備をします。 ExternalInterface.addCallback("JS2AS", addCallback); } /** * JSからの命令はExternalInterface.addCallbackを経由して、 * 関数に引き渡されます。 */ private function addCallback(myValue:int):void { var houkou:Array = ["左", "下", "上", "右"]; tfStatus.text = "JSからの命令を受け取れました。" + houkou[myValue] + "に移動します。"; switch (myValue) { case 0: shape.x -= 5; break; case 1: shape.y += 5; break; case 2: shape.y -= 5; break; case 3: shape.x += 5; break; } } } } |
↓html側のJavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//AS3版のボタンを押した時に実行される関数 function as3sendToActionScript(num){ swfName("externalas3addcallback").JS2AS(num); } //AS2版のボタンを押した時に実行される関数 function as2sendToActionScript(num){ swfName("externalas2addcallback").JS2AS(num); } //ブラウザに対応した呼び出し方のための関数 function swfName(str) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[str]; }else { return document[str]; } } |
ファイル一式 >>ダウンロード
【関連】
ExternalInterface.call(ASからJSを呼び出す)
http://www.mztm.jp/2009/05/24/externalinterfacecall/
【参考】ExternalInterface – ActionScript 3.0 言語およびコンポーネントリファレンス
http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/external/ExternalInterface.html
swf内だけで完結する動作ではないので、どうしてもブラウザ側との相性の問題がでてくる。
ハマり報告がいくつかあるの確認すること。
ExternalInterfaceにハマる
http://www.ironhearts.com/diary/archives/001473.html
Flashが何故かうまく動かない時に疑うべき8つの要素
http://blog.flair4.jp/2009/03/flash-debug-pattern.html
ExternalInterfaceでActionScriptの関数呼び出し失敗への対策
http://blog.katsuma.tv/2008/02/externalinterface_error.html
> 「*external*」な名前にしておかないとIEでコケる場合があります。
> ExternalInterface.addCallbackが確実に完了してから呼び出す
【余談】
作っている段階でFlashCS3でパブリッシュして意図通りに動いたものが、FlashCS4でパブリッシュすると動かない、ということがあった。これは、コードの記述ミスだった。
誤:private var wasSuccessful:* = ExternalInterface.addCallback(”JS2AS”, fn);
正:ExternalInterface.addCallback(”JS2AS”, fn);
返り値のないメソッドに対して、返り値を取得しようとしていた。
CS3ではaddCallbackは動き返り値に関しては無視されるが、CS4ではエラーログも出さずに単に動かない、という現象になった。
CS3とCS4でミスの許容度が異なるようだ。
3 Comments
[…] ExternalInterface.addcallbackを知らない人は、まずは↓を読むこと。 http://www.mztm.jp/wp/2009/06/10/externalinterfaceaddcallback/ […]
[…] ExternalInterface.addcallbackを知らない人は、まずは↓を読むこと。 http://www.mztm.jp/2009/06/10/externalinterfaceaddcallback/ […]
[…] 【関連】 ExternalInterface.addcallback(JSからASを呼び出す) http://www.mztm.jp/2009/06/10/externalinterfaceaddcallback/ […]