concoquo

FlashでiPhoneアプリ作りました

iPhoneアプリ KulerClock

拙作iPhoneアプリ「KulerClock」がApp Storeに並んでます。

Kuler」というWebサービスから色を引っ張ってきてグラフィカルに表示するだけの習作レベルのものでごめんなさい。

KulerClock for iPhone

さらに本当は今申請してるマイナーアップデートが通ってからと思ったのですが、時間がかかってしまっているのでもういいやと…。
このアプリはAdobe Flash CS5の新機能であるPackager for iPhone®で作られています。3Gでもそれほどストレスなく動くと思います。3GSならさくさく動いてるはず。

アプリでは二本指タップでテーマが変更されますが、右のはダブルクリックで変更されるようになってます。あとメールボタンは該当テーマへのリンクに変更してあります。iPhoneデバイス固有の機能部分をCS4で変更しただけで基本的にはアプリと同じものです。
クリックしたりダブルクリックしたり上下に引っ張ったりしてみてください。

本来ならXcodeを使ってObjective-Cでしか作れなかったiPhone向けアプリですが、幅広いユーザを抱えるFlashというプラットフォームでの開発が出来るようになります。Macのみだった開発環境がWindowsでも行えるというメリットもありますね。今回作ったアプリをちょこっと手直ししたものが普通にWebで動きます。その逆もまた然り、と考えるとすごい。

Get Adobe Flash player

と、この革命的なPackager for iPhone®機能ですが

  • とにかく処理が重い
  • ファイルサイズがでかい
  • UIKitのパーツが使えない
  • 使える機能に制限がある

など、、不満な点も多々あるのですが、まだベータ段階ですし!
何よりもFlashで作ったものがiPhoneで動くというメリットの方が大きいに決まってます。また多少無理なことがあっても、Flasherは文字通り変態的な人たちが多いのでたくましく自力でなんとかしてくだろう、なんてことも思ったりします。

以下、思ったこと

ライブラリは重い(多分)

普段はアニメーションにTweenerを使ってますが、重くて使えないだろうと思った(試してない)ので自前の簡易ライブラリを使いました。とにかく処理を軽くすることを念頭において余計な機能を省きました。汎用的ではないですし、改善の余地がまだまだあります。

SharedObjectは普通に使える

読み込んだカラーテーマのデータや時計の表示/非表示をアプリ終了時にSharedObjectに保存しています。

import flash.desktop.NativeApplication;
private var so:SharedObject;

//起動時
public function KulerClock(){
  NativeApplication.nativeApplication.addEventListener( Event.EXITING, onExit);//
  so = SharedObject.getLocal("com.abakane.KulerClock");
}

//終了時
private function onExit( e:Event ):void{
	NativeApplication.nativeApplication.removeEventListener( Event.EXITING, onExit);//
	so.data['colorAry'] = colorAry;
	so.data['clockVisible'] = clockVisible;
	so.data['version'] = VERSION;
	so.flush();
}

終了時にちゃんとremoveEventListenerしないとonExitが複数回実行されてしまう可能性があるみたいです。環境次第かもしれませんが、自分はこれでハマりました。

メールとかブラウザとか

これもnavigateToURLとURLRequestの組み合わせが普通に使えます。

import flash.net.URLRequest;
var str:String = "mailto:?subject=Adobe%20Kuler&body="
navigateToURL( new URLRequest(str) );

TouchEventとMouseEvent

MouseEventが普通に使えるのでTouchEventは使いませんでしたが、違いを把握してません。。

マルチタッチ

カラーテーマの変更に二本指タッチを採用してみました。(目新しさで)
すでに一本タッチしてる状態で二本目をタップするとトリガーされるみたいです。ゆっくりやっても動作します。

import flash.ui.MultitouchInputMode;
import flash.events.GestureEvent;

Multitouch.inputMode = MultitouchInputMode.GESTURE;
addEventListener( GestureEvent.GESTURE_TWO_FINGER_TAP, onTwoFingerTap);

キャッシュ機能

挙動とか効果とかまだ計りきれてません。使い方次第で軽くなることは間違いないんですが、エッジがジャギってしまうので画像を用意したほうがいい場合もあるかも。
今回のアプリではアンチエイリアスがかかるデザインをしてないので、キャッシュしまくって問題がないのはラッキーでした。

cacheAsBitmapMatrix = new Matrix();
cacheAsBitmap = true;

ほとんど普段使っているAS3をそのまま使えたのが感動でした。Event、MouseEvent、URLLoader、Date、XML、意識しなくてもどれも同じように扱えるなんて…夢のようです。iPhone上でボール転がしてるだけで感動してる自分がいました。

そして作ってみて思ったのはSimple Metronomeすごい!って事。すでにFlash製のiPhoneアプリは30個弱出てるらしいですが3Gで見てスムーズに動くもの自体があまりないです。それを一つのアプリとしてちゃんと機能させていながら、しかも日本第一号で実現してるのはやっぱりすごいなぁと。

Flasherでまだの人は急いでiPhone Developer Programに登録したほうがいいですよ!
ちなみにipaを吐き出したらその先は従来のアプリと同じ流れです。正直めんどくさい!