AIR勉強中 - Eseclock
2009.04.08
前回のSpark勉強会に参加したときに、yossyさんがライブラリ作成からSparkProjectにコミットするまでをライブコーディングしながら説明してくれました。
そこで作成したのが、UNIQLOCK的な何かが作れるライブラリ「Eseclock」です。 使い方は、
1.EseClockクラスを継承する。
2.createContentsメソッドをオーバーライドして、引数にDisplayObjectを指定する。
これだけで、6秒後にDisplayObjectが5秒間表示されます。
今回僕は、AIRを勉強中なので、Eseclockにテキストファイル、画像ファイルをドロップすると、AIR内で保存されて、ランダムに表示されるというものを作りました。
alumicanさんが拡張したアニメーション版を拝借してAIRに実装しました。 ソースのコアな部分は以下。Eseclockクラスを拡張したAirEseclockの中身です。
//対応する拡張子の登録
public static const TEXT_FILE_FORMAT:Array = [".txt",".as",".xml"];
public static const BITMAP_FILE_FORMAT:Array = [".jpg", ".JPG",".jpeg",".JPEG", ".png",".PNG", ".gif",".GIF"];
//表示するDisplayObjectを格納する配列
public var _showContentsArray:Array = [];
//Eseclockの背景色
private var _color:uint;
//ドラッグ先のDisplayObjectContainer
private var _container:DisplayObjectContainer;
//コンストラクタ
public function AirEseclock(container:DisplayObjectContainer)
{
_container = container;
//ドラッグを始めるためのイベントを追加
_container.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, _onDragEnter);
//ドロップのイベント追加
_container.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, _onDragDrop);
//Eseclockの背景色を決める
_color = uint(Math.random() * 0xffffff);
//Eseclockのコンストラクタ実行
super(_color,0xffffff,_container.width,_container.height);
}
private function _onDragEnter(e:NativeDragEvent):void
{
//Clipboardクラスのインスタンス作成
var cb:Clipboard = e.clipboard;
if(
//ドラッグするものがBitmapだったら
cb.hasFormat(ClipboardFormats.BITMAP_FORMAT)||
//ドラッグするものがファイルだったら
cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)||
//ドラッグするものがhtmlテキストだったら
cb.hasFormat(ClipboardFormats.HTML_FORMAT)||
//ドラッグするものがリッチテキストだったら
cb.hasFormat(ClipboardFormats.RICH_TEXT_FORMAT)||
//ドラッグするものがテキストだったら
cb.hasFormat(ClipboardFormats.TEXT_FORMAT)||
//ドラッグするものがURLだったら
cb.hasFormat(ClipboardFormats.URL_FORMAT))
{
//読み込みを許可する(ドラッグを許可
NativeDragManager.acceptDragDrop(_container);
}else {
//読み込めないので何かエラー文でも出す
trace("読み込めないYo!!")
}
}
private function _onDragDrop(e:NativeDragEvent):void
{
//Clipboardクラスのインスタンス作成
var cb:Clipboard = e.clipboard;
//今回の実装では、ファイルの読み込みしか対応していません
if(cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
//複数のファイルをドラッグしても配列で返ってくる
var array:Array = cb.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
//配列内のファイルを調べる
for each(var file:File in array) {
//ローカルのアドレが帰ってくるのでコンテンツにコンバートする
convertContent(file.nativePath);
}
}
}
private function convertContent(str:String):void
{
//Textファイルかチェック
var l:uint = TEXT_FILE_FORMAT.length;
for (var i:int = 0; i < l; i++)
{
if (str.lastIndexOf(TEXT_FILE_FORMAT[i])!=-1) {
//strを右から捜査して、Textの拡張子と一致したら
//loadTextメソッドは、UrlLoaderクラスを利用して_showContentsArrayプッシュされます
loadText(str);
}
}
//Bitmapファイルかチェック
l = BITMAP_FILE_FORMAT.length;
for ( i = 0; i < l; i++)
{
if (str.lastIndexOf(BITMAP_FILE_FORMAT[i])!=-1) {
//strを右から捜査して、Bitmapの拡張子と一致したら
//loadBitmapメソッドは、Loaderクラスを利用して_showContentsArrayプッシュされます
loadBitmap(str);
}
}
}
この後は、_showContentsArrayの中にコンテンツがたまっていくため、それをランダムで表示している感じです。
現在対応している拡張子は、jpg,gif,png,txt,as,xmlの6つです。 flvや、swfも対応しようと思って、やってみたけどうまくいかなかったのでちょっと見送り。 現在のバージョンだと、画像もただ表示するだけだし、テキストは下から上に流れていくだけの状態で、あまり面白くはありません。あと音も鳴りませんので;;。
とりあえず、FlashにはないAIR特有のドラッグアンドドロップは理解できたので、おkな感じなのですが、モチベーションが続けば、もっとAIRらしいガジェットを作ってSparkにコミットしたいものです
実際、コミット方法が分からなくなってしまって、コミットできないですけどねw。
Downloadはコチラです。
AIRを初めて触ったのですが、面白いです。便利なガジェットとか作ってみようと思います。 コミット方法を思い出したらSparkにコミットしたいです。
update 2010.01.02...
[関連記事]
コメント(1) Shunsuke Ohba | 2009年4月 8日 12:15 | 返信ちなみにソースは、ぐちゃぐちゃなのでアップできません。ちゃんと作ったらアップしたいです。






