メイン

2008年06月19日

ジョークアプリ AIRSlash を作ってみた

AIRコンテスト(略してエアコン)にネタで出したジョークアプリが当然かすりもしなかったわけですが、せっかくなので晒すことにします。

AIRSlash







AIRのロゴマークが手裏剣よろしく飛び交う中に画像ファイル(JPG, GIF, PNG)をドラッグ&ドロップすると縦横無尽に切り裂いて、ゴミ箱に飛ばしてくれます。
差し詰めシュレッダー式ゴミ箱。
切り裂かれた破片がしっかりと画像ファイル(PNG)として生成されるという無意味さ爆発!
AIRで作る意味全くないと言われればそれまでですが、ロゴが斬撃系飛び道具に見えてしょうがなかったのでつい・・・

ちなみに交点の計算は一切してません。
画像処理って楽しいよね。


[追記]
窓の杜でとりあげていただきました。

2007年06月15日

AIRのドラッグ&ドロップ起動について調べてみた

任意のファイルをAIRアプリのアイコン上にドラッグ&ドロップして起動した時に、そのドロップされたファイル情報を取得する方法について調べてみました。


AIRアプリの起動情報に関しては flash.system.Shell クラスが把握していますが、プロパティとして直接参照はできません。
その代わりに flash.events.InvokeEvent から参照することができます。

どのタイミングでもいいようですが、起動時に必要になることが多いため applicationComplete に設定したメソッド内に以下のように記述しておくことにします。

Shell.shell.addEventListener( InvokeEvent.INVOKE, onInvoke );


そしてイベントハンドラを以下のように記述します。

private function onInvoke( e:InvokeEvent ):void {
for ( var i:uint = 0; i < e.arguments.length; ++i ){
var file:File = new File( e.arguments[ i ] );
}
var currentDir:File = e.currentDirectory;
}


InvokeEvent の arguments プロパティは、起動時に渡されたファイルのフルパスを格納した配列引数の配列です。
コマンドラインからの実行により任意の引数を渡すことができますが、デフォルトでは何も指定されていないためファイルをドロップした場合はファイルのフルパスのみが格納されます。

たとえばショートカットの設定に /a というコマンドを自前でつけてしまうと、arguments の先頭要素が /a という文字列になり、その後にドラッグ&ドロップ起動時のドロップしたファイルのフルパスが続くことになります。

このフルパスはあくまで文字列なので、実際にファイルを読むためには File インスタンスをパス情報から自前で生成する必要がありますが、コマンドラインから実行された時のことを考慮して有効なパスかどうか念のため確認した方がよさそうです。
ディレクトリをドロップした場合はディレクトリのフルパスのみが渡され、ディレクトリ内の全ファイルが配列に格納されるわけではありません。


currentDirectory プロパティは、起動パス情報を持つ File インスタンスです。
設定ファイルなど AIR アプリの格納ディレクトリ下に置く場合には、ここから参照すればよさそうですが、たまに正確な情報を返さないことがあるようなのでもう少し探ってみます。


ドロップ起動に対応するアプリが作れるなら、やれることが大幅に増えますね。

----追記----
arguments プロパティの説明について若干誤りがあったので書き直しました。
ドラッグ&ドロップ起動だけでなく、隠しコマンド起動をつけられるということですね。

2007年06月13日

AIRにドラッグ&ドロップできるものについて調べてみた

AIRアプリにドラッグ&ドロップするためには、NativeDragEvent.NATIVE_DRAG_DROP についてイベントリスナ登録する必要があります。
そこで登録したイベントハンドラが呼ばれる際に引数として渡される NativeDragEvent インスタンスに transferable というプロパティ(TransferableDataインスタンス)があり、そこにドラッグしたデータの情報が全て格納されています。


せっかくなのでどういったものをドラッグすると、どういったデータが AIR に渡されるか調べてみました。

■Firefoxで表示した Web ページのリンクテキストをドラッグした場合

1.TransferableFormats.URL_FORMAT
 リンク先URL

2.TransferableFormats.TEXT_FORMAT
 リンク先URL+テキスト


■Firefoxで表示した Web ページの画像(リンクなし)をドラッグした場合

1.TransferableFormats.URL_FORMAT
 画像URL

2.TransferableFormats.BITMAP_FORMAT
 画像をビットマップデータ化したもの

3.TransferableFormats.FILE_LIST_FORMAT
 おそらくビットマップ化する際に格納したらしき画像ファイル
 格納先 C:\Documents and Settings\{username}\Local Settings\Temp

4.TransferableFormats.TEXT_FORMAT
 画像URL+代替テキスト


■Firefoxで表示した Web ページの画像(リンクあり)をドラッグした場合

1.TransferableFormats.URL_FORMAT
 リンク先URL

2.TransferableFormats.BITMAP_FORMAT
 画像をビットマップデータ化したもの

3.TransferableFormats.FILE_LIST_FORMAT
 おそらくビットマップ化する際に格納したらしき画像ファイル
 格納先 C:\Documents and Settings\{username}\Local Settings\Temp

4.TransferableFormats.TEXT_FORMAT
 リンク先URL+代替テキスト


■PC上のファイルとディレクトリをまとめてドラッグした場合

1.TransferableFormats.FILE_LIST_FORMAT
 ファイルとディレクトリそれぞれのFileインスタンスを格納した配列


■Flashオーサリング環境のステージに配置されているムービークリップをドラッグした場合

1.TransferableFormats.BITMAP_FORMAT
 ムービークリップをビットマップデータ化したもの


■Flashオーサリング環境のステージに配置されているテキストをドラッグした場合

1.TransferableFormats.BITMAP_FORMAT
 テキストをビットマップデータ化したもの


WebページについてはFirefoxで確認しましたが、IEではリンクをドラッグできなかったため割愛しました。
Win版Safariでも若干挙動が異なるようです。

Flashオーサリング環境の配置シンボルについては複数まとめてドラッグすると多少縮小されてしまうのがよく分からない仕様ですが、ビットマップ化された状態とはいえ何か面白いものが作れそうです。

2007年06月12日

PrintScreenした画像をAIRで表示させてみる

前回のエントリではクリップボードの文字列データを問題なく拾えることが分かったので、次は PrintScreen でキャプチャしたデスクトップの画像を AIR アプリ内に表示できるかどうか試してみました。

前回言及したクリップボードアクセス用クロージャ内に以下のように記述することでビットマップデータが拾えます。
サンプルなのでエラーチェックとかそういうのは省略。

var data:TransferableData = ClipboardManager.data;

if ( data.formats[0] == TransferableFormats.BITMAP_FORMAT ){
var bd:BitmapData = data.dataForFormat( TransferableFormats.BITMAP_FORMAT ) as BitmapData;
}

で、実行したら

air_printscreen.png

あれ?
.icoしか拾ってなかったりする?
どういう構造になってんだろ。。。某ウイルスもどきが作られないように対策でもしたのかなと勘ぐってみました。
キャプチャ画像をクリップボードから直接あれこれするアプリは今のところは作れないようです、残念!

2007年06月11日

クリップボードのデータを拾ってみる

Adobe Apollo が正式名称 AIR として公開されました。
同時に FlexBuilder3 のパブリックベータ版も公開されたので、追加された機能をふんだんに使った AIR アプリが続々と出てくると思います。


今回新たに追加された機能の中で特に注目すべきはデータベースモジュールでしょう。
flash.data パッケージ以下に SQL 関連クラスがごっそり入っていますが、ざっと目を通しただけでもかなり充実している模様。
このタイミングで入ってくるとは思っていなかったのですが、先日公開された Google Gears でローカルデータベースの機運が高まりつつあるので、それに合わせてきた感じがしないでもありません。

とにかく弄ってみたい機能が目白押し。
前々から気になっていたドラッグアンドドロップやクリップボード管理のドキュメントを真っ先にチェックしてみました。
たとえばクリップボードのデータを拾うには以下のように書きます。


ClipboardManager.accessClipboard( onAccessClipboard );


private function onAccessClipboard():void {
var data:TransferableData = ClipboardManager.data;
var text:String = data.dataForFormat( TransferableFormats.TEXT_FORMAT ) as String;
}

いつでもクリップボードのデータにアクセスできるわけではなく、処理を記述したクロージャメソッドを引数として ClipboardManager.accessClipboard メソッドを実行することで初めてアクセスできるようになります。

データは TransferableData 型としてClipboardManager.data に格納されていますが、中身がテキストだったり画像データだったりするので dataForFormat メソッドによってフォーマット指定する必要があります。


また、逆にクリップボードに文字列データをペーストする場合は上記のクロージャ内に


var data:TransferableData = new TransferableData();
data.addData("hoge", TransferableFormats.TEXT_FORMAT );
ClipboardManager.data = data;

といった処理を記述します。


ヘルプにわざわざクロージャと書かれているのが気になったのですが、任意の文字列をクリップボードにペーストしようとする際に ClipboardManager.accessClipboard の引数に直接指定ができないので、下記のようなクロージャ生成メソッドを用意してねという意味なんだと思います。

ClipboardManager.accessClipboard( pasteString("hoge") );
private function pasteString( str:String ):Function {
	return function():void {
		var data:TransferableData = new TransferableData();
		data.addData( str, TransferableFormats.TEXT_FORMAT );
		ClipboardManager.data = data;
	}
}