AdobeAIRでのマルチスクリーンサイズ対応

これまでiOS用のアプリしか作ってきませんでしたが、ちょっとしたきっかけでAndroid用の簡単なアプリを作ることになりました。

手馴れているのでAIRで作ることにしましたが
Androidといえば、やはり様々なスクリーンサイズ対応が問題になってきます。
ちなみにマルチスクリーンに対応して画面パーツのレイアウトが変わるようなものをリキッドレイアウトと呼ぶらしいです。
今回は簡単なリキッドレイアウトがやりたいわけですね。

Flexは画面サイズが違っていてもiPhoneのようにアスペクト比が違うだけなら(今はiPhone5もありますが)基本的に勝手にフィットさせてくれます。
フットサルボードはFlexで作りました。
iPhoneであれば解像度が違っていても無問題です。
ですが、アスペクト比が違うiPadだと想定どおりにうまくリキッドレイアウトしてくれなくて困った記憶があります。

ですので、今回は最初からFlexを使わないことにしました。
FlexFlexのSWCを含めると12MB程度ネイティブよりサイズ上乗せだというのもあります(最近は3G回線でも50MBまでのアプリならダウンロードできるようになりあまり気にならなくなってきましたが)。
AIRだけだと8MB程度です。


さて、リキッドレイアウトをやるためには、デバイスの画面サイズを取得できなければなりません。
それができれば後は適当な位置を計算してパーツを配置するだけです。
そこで結構はまりました。
この記事はそのはまりで得た知見のメモです。

結論から言ってしまうと、以下の情報源が非常に参考になります。
http://www.adobe.com/devnet/air/articles/multiple-screen-sizes.html

最終的には、resizeイベントのイベントハンドラーの中でstage.full
ScreenWidth,fullScreenHeightを取得しました。
起動して数フレームはstageのwidthとheight(fullScreenWidthとfullScreenHeightにも)には正しい値が入ってないというのは本当で、知らなければはまるポイントだと思います。
起動して数フレームで必ずresizeイベントが発行され、そのときには正しい値が入るそのとき値を取得します。
ていうか、これバグに近いですね。回避策もバッドノウハウです。

他にはCapabilities.screenResolutionX,screenResolutionYでも値がとれます。
こちらはresizeイベントを待つ必要はないようです。
ただしこちら、PC上のシミュレータで実行すると、PCの画面のサイズがとれますwww なんでやねん
まあデバイスではちゃんと動くのでしょうが、開発がやりにくいので使うのをやめました。

今回のソースは後ほどgithubで公開します。


FlexもFlashProも使わないと、ちょっとしたコンポーネントさえ無いので、使いどころが限られてきますが、アプリサイズが小さくなるという恩恵を受けます。
フットサルボードではFlexに頼りっぱなしだったのでいい勉強になりました。

個人的にはFlexを使う必要性に迫られなければFlexは使う必要ないと思います。


後、今回、スプラッシュ画面を適用したいのですが、iPhoneならFlexだとスプラッシュ用のattributeがあるし、
Flex使わなくてもDefault.pngを使えばOK。
しかし、Androidはどうもデフォルトでスプラッシュというものが存在しないらしいのです。
情報を探すと以下のように強引にやってる人もいますが、もっと簡単にやりたいですね。
http://swfhead.com/blog/?p=817
http://forums.adobe.com/thread/764981
http://forums.adobe.com/message/3691229
いい情報があったら皆さん教えてください。