この記事のURL

http://www.dango-itimi.com/blog/archives/2014/001205.html


FLASH tips Flash CC 13.1 カスタムパネルから jsfl 内の値を参照する

先日書いた「Flash CC 13.1 カスタムパネルから jsfl を呼び出す」の関連記事となります。

前提

jsfl 処理内容を次の二通りに分けるとします。

 (a)単独で開始~終了する jsfl
 (b)外部から適時呼び出される jsfl

(a)は例えば「Flash CC 13.1以降対応 リンケージ設定 GUI版公開」で利用している jsfl が該当します。
jsfl を呼び出す(読み込む)と自動的に処理が開始し、処理終了まで全て単独で行ってくれるタイプのものです。多くの jsfl がこれに該当するかと思います。

(b)は jsfl 呼び出し後、呼び出し側(拡張機能側)から jsfl 内処理を適時 呼び出すタイプのものとなります。jsfl 内変数を参照したり、jsfl 内メソッドを呼び出し、jsfl 内処理結果に応じて 呼び出し側での行動を変化させます。

今回は (b) の jsfl に関しての内容となります。

Adobe Extionsion Project manifest.xml 設定

Flash CC 13.1 カスタムパネルから jsfl を呼び出す」の方法では、呼び出し側から jsfl 内の変数やメソッドにアクセスする事ができないようです。
代わりに、Adobe Extionsion Project manifest.xml 内に 読み込みたい jsfl の指定を行うことで、呼び出し側から jsfl 内変数やメソッドにアクセスする事が可能となります。
※偶然に見つけた手法なので、正しい方法かどうかはわかりません。

読み込み対象 jsfl 指定方法

プロジェクト内 隠しディレクトリにある manifest.xml を開きます。プロジェクトルート 右クリックから[Adobe Extension Builder 3]-[Bundle Manifest Editor] を選択しても開くことができます。

Extension タブ内 右ページの「Startup」タブを選択し、Script path に読み込みたい jsf を指定します。

このようにすることで、呼び出し側から、jsfl 内 変数やメソッドに自由にアクセスが可能となります。fl.runScript による jsfl 読み込みは必要ありません。

独自変数・メソッドの呼び出し

例えば jsfl の内容が以下だとします。

var helloText = "hello!";

function hello2(){
	fl.trace("hello2");
}

呼び出し側からは以下のコードで jsfl 内変数やメソッドを利用できます。

new CSInterface().evalScript("fl.trace(helloText);");
new CSInterface().evalScript("hello2();");

jsfl 内の任意の値を 呼び出し側から取得するには CSInterface.evalScript 第二引数の callback を利用します。

例えば jsfl の内容が以下だとします。

function getHello(){
	return "hello!";	
}

拡張機能側からは、以下のように記述する事で、jsfl 内 メソッドの戻り値を取得する事ができます。

new CSInterface().evalScript("getHello();", function(n){ 
	alert(n); //hello!
});

function の引数 n の値が jsfl の getHello メソッドの戻り値となります。

jsfl API 戻り値取得

jsfl API 呼び出しの戻り値も取得できます。

new CSInterface().evalScript("document.getPlayerVersion();", function(n){ 
	alert(n); //FlashPlayer11.8
});

以下の様な jsfl API の Document オブジェクト取得は undefined になります。

new CSInterface().evalScript("fl.getDocumentDOM();", function(n){ 
	alert(n); //undefined
});

プロパティアクセスも undefined が返ってきます。

new CSInterface().evalScript("document.frameRate;", function(n){ 
	alert(n); //undefined
});

jsfl fl.addEventListener で設定したイベントを探知

jsfl の API fl.addEventListener で設定したイベントを拡張機能側から探知するには少々工夫が必要になります。まず jsfl 内に以下のメソッドを用意します。

function registerExtensionFunction(extensionFunction){
	callbackFunction = extensionFunction;
}


拡張機能側には例えば以下の記述を行います。

new CSInterface().evalScript('registerExtensionFunction(' + execute + ')');
new CSInterface().evalScript(
	'fl.addEventListener("documentNew", function(){ callbackFunction("new!"); });');

function execute(value){
	
	alert("called:" + value);
}

拡張機能側からは、jsfl に execute メソッドを登録し、jsfl 側でイベントが発行されると 登録されているメソッドを callbackFunction 変数経由で実行する、という形を採ります。
上記サンプルでは、fla ファイルの新規作成が行われると、called:new! という文字列がアラートで表示されます。

※サンプルということで CSInterface クラスを new しまくっていますが、実際には CSInterface インスタンスを生成して使いまわしたほうが良いと思われます。

追記2)
以下の方法でもいけました。直接変数にメソッドを登録します。

new CSInterface().evalScript('callbackFunction = ' + execute);
new CSInterface().evalScript(
	'fl.addEventListener("documentNew", function(){ callbackFunction("new!"); });');

...

[ FLASH ] [ tips ] 投稿者 siratama : 2014年02月15日 15:29

トラックバック

http://www.dango-itimi.com/blog/mt-tb.cgi/1165

コメント

以下コメントを書き込むだけでは、管理人には通知が行われません。通知を行いたい場合、管理人の書き込みに「返信」を押してコメントをしていただくか、あるいは Google+, Twitter へご連絡ください。




[EDIT]