feb19.jp blog - life is creative!

SWFWheelを使う

ブックマークに追加する tags:     

SWFWheelを使う

SWFWheel(旧HigeWheel)というMacでもマウスホイールイベントを受け取れるようにするオープンソースのASライブラリのサンプルと解説です。

(2.4 8:52内容を大幅に更新しました。SWFObject非依存でした。すばらしい。)

Adobe MAX 2009はSparkProjectの講演で知ったライブラリ。今まではMacMouseWheelというライブラリを使っていましたが、Window版Safari 3に非対応だったり微妙に不安定だったので乗り換えてみました。


そもそもなぜこのようなライブラリが必要か?

マウスのホイールを利用してなんらかの動作をFlashでおこなせたい場合、AS3ならばMouseEvent.MOUSE_WHEELというイベントが起きるかを監視(addEventListener)すればいいのですが、Macでは今までマウスホイールというデバイスがAppleの公式?で存在しなかったためか、このイベントが取得できないという事態になっていました。(ちなみにFlash Player 10.0.2.54ではスタンドアロン版に限りMac OS Xでもホイールイベントが取得できる模様)

つまり、基本的にMac上のFlashPlayerでマウスホイールイベントを受け取る手段が無かったのです。

そこでJavaScriptでマウスホイールの動作を監視し、FlashとJavaScriptで通信を行う事で、MacでもFlashからマウスホイールの動作を監視することができるようになりました。それが、MacMouseWheelという素敵ライブラリで、pixelbreakerさんが制作して2008年に公開されました。

しかしこのライブラリ、pixelbreakerさんがMacユーザーだからか?Windowsで起きる挙動に関してはあまりご熱心に対応されていない?ようで、Windows版のSafariなどにはなかなか対応してくれませんでした。(あとJavaScriptにもエラーがあったり不安定だったりもろもろいまいち)

そんな折に、Humming Via Kitchenのsoundkitchenことnobuさん(自分ことfeb19もnobuだったりして)がMacMouseWheelを改良し、HTMLにJSファイルをロードさせる必要を無くし、SWFObjectに依存しないようにし、クロスプラットフォームの検証・対応も行ったHIGEWheelを開発。名称を変更してSWFWheelという今に至る、という感じのようです。オープンソースって素敵ですね。

というわけで、先日とあるプロジェクトで使わせていただきました。ありがとうございました。今後も使わせていただきます。今の所当方問題ないようです(Windows XP用 IE6, IE7, FireFox 3, Safari3, Mac OS X Leopard Safari 3, FireFox 3)。


使い方とサンプル

使い方はオフィシャルなページに書かれている事が実は全てで、特筆すべき点は無いのですが、一応下記にHTMLの例を示します。ここではSWFObjectを使っています。

全画面のフルFlashページにするとして、以下のようなHTMLを書きます。一応あえてXHTML 1.0 Strict/UTF8で。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title></title>
<meta name="keywords" content="" lang="ja" />
<meta name="description" content="" lang="ja" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="JavaScript" />
<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript" src="js/swfaddress.js"></script>
<script type="text/javascript">
	var vars = {};
	var params = { scale:"noscale", menu:"false", allowScriptAccess:"samedomain", allowFullScreen:"true" };
	var attributes = { id:"flashContent", name:"flashContent" };
	swfobject.embedSWF("index.swf", "flashContent", "100%", "100%", "9.0.45", "js/expressInstall.swf", vars, params, attributes );
</script>
<style type="text/css">
	/* hide from ie on mac \*/
	html {
		height: 100%;
		overflow: hidden;
	}
	
	#flashContent {
		height: 100%;
	}
	/* end hide */
	body {
		position: absolute;
		width: 100%;
		height: 100%;
		margin: 0;
		padding: 0;
	}
</style>
</head>
<body>
<div id="flashContent"></div>
</body>
</html>

このとき、JavaScriptとFlashを通信させるため、allowScriptAccessを"always"か"samedomain"にして、許可してやるのがミソ。

あと変数attributeで示しているように、idとnameを両方指定することが必要。

ASはこんな感じ。

package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	
	import org.libspark.ui.SWFWheel;
	
	public class MouseWheelTest extends Sprite
	{
		private var sp:Sprite;
		public function MouseWheelTest()
		{
			sp = new Sprite();
			sp.graphics.beginFill(0xff0000);
			sp.graphics.drawRect(0, 0, 100, 100);
			sp.graphics.endFill();
			addChild(sp);
			
			SWFWheel.initialize(this.stage);
			
			this.stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelHandler);
		}
		private function mouseWheelHandler(e:MouseEvent):void
		{
			trace(e.delta);
			sp.y += e.delta;
		}
	}
}

注目すべきは、HTMLでswfwheel.js的なファイルを読み込む必要がなく、ASでSWFWheelクラスをimportして、initializeメソッドでstageを指定してやれば、マウスホイールイベントを発信してくれるようになるということ!

//この部分
SWFWheel.initialize(this.stage);

つまりステージをSWFWheel.asに関連付けるだけ!

というわけで、これらのフルセットはこちらSWFObjectと、SWFWheel、ついでにSWFAddressも含めています。

こんな感じで動きます


せっかくFlashは殆どの部分でWindows、Mac、そしてLinuxなどOS間で差異がない挙動をしてくれるすばらしいテクノロジーだと思うので、後少しの差異の部分をAdobe含め自分たちFlashクリエイターが埋めていってあげてやりたいと思う次第であります。

ちなみにHTMLやCSS、JavaScriptについて、自分はそんなに強くないので、もっとうまいやり方があるようでしたらコメントください。

2009年02月04日02:04

Webデザインブログ

「SWFWheelを使う」の関連エントリー

 iTunes Store(Japan)

コメントを投稿

トラックバック

このエントリーのトラックバックURL:
http://feb19.jp/mt/mt-tb.cgi/167

この一覧は、次のエントリーを参照しています: SWFWheelを使う:

» SWFWheelを使ってみる 送信元 TONPOOBLOG
AS3から実装された、マウスホイールを検知するMouseEvent.MOUSE_WHEELイベントはMacでは動作しない、というのは知っていて、その問題を... [詳しくはこちら]

» SWFWheelを使ってみる 送信元 TONPOOBLOG
AS3から実装された、マウスホイールを検知するMouseEvent.MOUSE_WHEELイベントはMacでは動作しない、というのは知っていて、その問題を... [詳しくはこちら]

Navigation

古:auのデータカード「W06K」をMacBook Proで使う
新:USB加湿器
トップページ

Recently Entries
Mac でファイルの関連付けを変える(Mac で AIR アプリがアップデート出来ないを解決する方法)
ファイルを右クリックして「情報を見る」を選び、表示されたウィンドウの...
Mac OS X 10.6 Snow Leopard から入ってるフォント「Menlo」がコーディング作業にいい感じ
Xcode でコード書いているとき、Eclipse でコード書くより...
AIR で JSON 形式ファイルの入出力
AIR 祭り開催中。今回はファイル入出力。AS3 で扱っている Ob...
Adobe CS5 ティザーサイトオープン
カウントダウンが始まっています。いよいよ CS5 ですね。globa...
AIR でファイルがドラッグアンドドロップされたことを NativeDragEvent で検知する
最近また AIR が楽しい気がして触っているのですが、 Google...
iPhone アプリ "iBeat - BPM Counter" を発売しました & iPhone インタラクションデザインについて
BPM 計測アプリです。既に似たようなアプリはいくつか発売されている...
AS3 の演算子 ||= について
AS3 だけでつかえるものではないのですが、AS3 での動作を確認し...
iPhone SDK 「カテゴリ」について+NSString の空白文字を除去する
Objective-C では、高位のフレームワークで、低位のフレーム...
Flash CS4 で Flex SDK (mx パッケージ、クラス) を使う
Flex 用のライブラリとかを見ると mx パッケージとか使われてい...
Flash CS5 を予習 ~Text Layout Framework (TLF) 編~
Text Layout Framework (TLF) を使って、F...