2009年10月28日(水) 12:53 | posted by shin2 | Comments [0]

ExternalInterfaceを使ってみた。

Flashでマウスの位置を参照して、画像を無限ループスクロールさせた時に、ブラウザウィンドウからフォーカスを外すと、凄いスピードで動くのでこれを何とかしたいと思った。

JavaScriptでブラウザウィンドウからフォーカスがアウトされた時と、フォーカスされた時を検出して、ExternalInterface.addCallbackを使ってFlash側の関数を操作すれば何とかできそうだ。

ExternalInterfaceはFlashからJavaScriptの関数・JavaScriptからFlash内の関数をコントロール出来るクラスみたい。
まずはフォーカスが切り変わるごとに、Flash上のテキストフィールドの文字を切り替えることを試してみる。

■HTML
swf表示の部分のallowscriptaccessは:”always”にする。(HTML上のJavaScriptを呼び出せるようにするかどうか)
swf読み込み部分のobjectのid、param・embedのnameはblur_testとする。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>onfocus onblur test</title>
<script language="javascript">AC_FL_RunContent = 0;</script>
<script src="AC_RunActiveContent.js" language="javascript"></script>
<script type="text/javascript">
	//フォーカス切り替えごとに実行される関数
	function xChangeText(bFocusMode) {
		getMovieName("blur_test").callChangeText(bFocusMode);
	}
	function getMovieName(movieName) {
		if (navigator.appName.indexOf("Microsoft") != -1) {
			return window[movieName]
		} else {
			return document[movieName]
		}
	}
</script>
</head>
<body onblur="xChangeText(false)" onfocus="xChangeText(true)">
 
</body>
</html>

■Flash
ステージにインスタンス名 test_tf のテキストフィールドの文字を切り替える。

import flash.external.ExternalInterface;
//フォーカス切り替えごとにJavaScript側から呼ばれる
function xChangeText(bFocusMode:Boolean):Void {
	var str:String;
	if (bFocusMode) {
		str = "フォーカスされています。";
	} else {
		str = "フォーカスアウトされました。";
	}
    test_tf.text = str;
}
//JavaScriptから呼べるように登録する
ExternalInterface.addCallback("callChangeText", null, xChangeText);

これでFlash上の文字を切り替えることができたので、この要領でフォーカスが外れた時にスクロールが止まるようにすれば、今回の問題は解決しそうだ(未確認)。

※はじめbodyタグにonloadでテストの実行をしようとしたが動作しなくてハマッた。
理由はswfファイル読み込みよりも前の段階にonloadを記述していたからみたいだ。読み込んでないswfにアクセスはできねーってことかい。(そりゃそうだ)

[この記事へのトラックバックURL]
http://www.mujuu.org/weblog/web_memo/222/trackback

COMMENTs