Androidの最近のブログ記事

宣伝用画像.jpg
周囲の人には「やっとか」と言われましたが、細々と作っていたアプリをリリースしました。
パッと見、オセロっぽいボードゲームです。
ゲームのルール自体はSPOTというファミコンやゲームボーイ向けに発売されていたものから流用しています。

http://pots.linnet.jp/


ゲームの詳しい内容は上記の紹介ページを見ていただくとして、少し裏側の話を。

OpenGLはちょっと大変そう、SurfaceViewはHTMLのCanvasとほぼAPIが同じという理由でSurfaceViewで作り始めましたが、それでもAPIが生々しいため、ActionScriptっぽく書けるSurfaceViewのラッパークラスから作り始めてしまったため、時間が掛かってしまいました。

Androidは画面の解像度のバリエーションが多いため、画像類は極力、ベクターで扱いたいと思ったのもSurfaceViewの選定理由の一つです。
SurfaceViewは読み込んだフォントをそのまま表示できるため、最近のウェブサイトで使われるアイコンフォントと同じようにゲーム内で使用するグラフィックをアイコンとしてまとめて読み込んでいます。
フォントですので、単色となってしまいますが、キャラクターなどを使用する予定はなかったため、特に気にはなりませんでした。
そのため個々のパーツは、画面サイズを基準とした相対値サイズ、座標を指定できています。


最終的にはシーン管理やアニメーション機能なども組み込んだフレームワーク的なものになり、ある程度、形になり始めてからはかなり楽になりましたが。

今回、作ったフレームワーク的なものは、落ち着いてからコードを整理してgithub辺りにアップしようかと思っています。多分、需要がないのだと思いますが、SurfaceView関連のライブラリをあまり見かけないので。


Android小ネタ

FontMetricsで取得できるパラメータ類はgetFontMetrics()した時の値を返すので、後で文字サイズを変更すると正しい値が取得できないらしい。

以下のコードだと文字サイズが20の場合のパラメータが返ってくる。

Paint textPaint = new Paint();
textPaint.setTextSize(20);
FontMetrics fontMetrics = textPaint.getFontMetrics();
textPaint.setTextSize(100);
Log.d("Font", fontMetrics.descent + "" + fontMetrics.ascent);

文字サイズを変更した場合は再度、getFontMetrics()する必要があるみたい。

マニフェストのエラー

久々にAndroidをいじろうとSDKのアップデートをしたら、過去のプロジェクトもコンパイルできなくなった。
「まず、エラー直してね」的なアラートが出るんだけど、どこにもエラーマークがないので途方に暮れながら、Eclipseの問題タブをクリックしたら、「hould explicitly set android:allowBackup to true or false (マニフェストのバックアップ関連のパラメータを設定してね)」的なメッセージがあったので、とりあえずfalseに設定したらコンパイル出来た。

ちょっと前に触った時は設定してなくてもコンパイル出来たと思うんだけどな。

Androidアプリでの色深度

Androidアプリを作っていてアルファチャンネルのあるグラデーションを含むビットマップがどうしてもキレイに描画されず(縞々に見える)、しばらく悩んでいた問題が解決したのでメモ。

結論から先にまとめると
SurfaceView内でフルカラーを描画したい場合は、SurfaceHolderに色深度を指定する必要があるようです。

SurfaceViewを継承したクラスのコンストラクタあたりで

getHolder().setFormat(PixelFormat.RGBA_8888);

のように書きます。


Androidアプリでビットマップを取り扱う際に色深度を指定できるのですが

 ARGB_8888:アルファチャンネル付き32ビット
 ARGB_4444:アルファチャンネル付き16ビット
 RGB_565:アルファチャンネル無し16ビット

グラデーションの面積が広いグラフィックやクオリティ重視の写真データなどを表示する場合はARGB_8888がマストになると思います。
Photoshopなどでノイズを乗せるとキレイに描画されるらしいのですが、画像によっては正しく表示されないようです。「ノイズを乗せる」のは簡易的にディザリングを行うことが目的だと思うのですが、アルファチャンネル付きのグラデーションには効果がありませんでした。



Androidの色深度についての解説は以下のページが詳しいですが、ビットマップデータを読み込む際にオプションを設定する必要があります。




SurfaceViewクラスは描画するエリアに色深度を設定する必要があるため、SurfaceHolderに設定する事になります(Android2.3以降はViewクラスはデフォルトで32ビットカラーらしいのですが)。

ただ、32ビットカラーのビットマップはメモリの使用量が大きく、描画のフレームレートも落ちるため、多用するとアプリごと落ちることもあるようです。
カメラアプリなどはビットマップの取り扱いが難しそうですね。


6月18日に行われた「CSSnite LP16 スマートフォン特集」に行ってきたのでメモ。


○Android OSと現状のデバイス総まとめ(あんざい ゆき)
・Androidは世界全体でで毎日40万台売れてるらしい(ギャラクシーSが売り上げ総数60万台、IS03が40万台らしい)
・iPhoneと違い端末の種類が桁違いなので、家電量販店で動作確認するのがオススメとのこと
・PC上にAndroid実機の画面を表示するAndroid Screen Monitor(http://www.adakoda.com/adakoda/android/asm/)が便利

○切っても切り離せないAndroidアプリとクラウドとの連携(華井雅俊)
・C2DM(Cloud to Device Messaging)はインテント
・ライブラリがあるので比較的に容易に実装できるとのこと

○Android技術者とのデザイナーとのハッピーな出会い(杉本 札彦)
・自作Android端末を作成したらしい
・ポイント為替をAndroidで実現したいとのこと

○そうだったのか!AIR for Android(岡田 昇三)
・Twitterのコメントがニコニコ動画のように表示されるスライドが印象的
・機能面ではJavaによるアプリ開発と比較すると足かせがある(特にインテント、ウィジェット、ホームスクリーン周り)
・速度はそれなりに出るとのこと

○iPhone・AndroidアプリのUI・挙動はどこが違う?(石野和明)
・バックボタン、メニューボタンが大きな違い。Androidは画面上のボタン数を減らす事が出来る。ただし、タブレット端末が悩みどころとのこと(縦持ちが標準だったり、横持ちが標準だったり)

○Android向けサイトのはまりポイントと脱出法(執行 大介)
・ドロイドフォントは「海」、「直」などの文字が微妙に正しくないらしい
・ボールド指定は効かない
・数字の羅列は電話番号扱いされる上、機種によっては数字が桁数を無視して数字がつながっているだけでも反応するらしい。専用のメタタグを記述して回避する
・タップハイライトカラーを指定したAタグ内でトランスフォームすると表示に不具合が出る。背景色を透明にして回避する
・CSS3使用時にはベンダープレフィックスをつけること
・Androidでは動画はFlashを使用するのもアリ
・Androidは文字入力画面になる際にもresizeイベントが発生する
・TouchMoveイベントは端末によって挙動が異なるため、当てにならない

○Android向けサイト制作のあれこれ:viewportについて(高津戸 壮)
・オススメは「width=device-width, minimum-scale=1, maximum-scale=1」(今のところ、jQuery Mobileがこうなってる)


○Androidサイト制作に jQuery Mobileを活用しよう(たにぐち まこと)
・jQuery Mobileは画面表示用のライブラリ
・jQuery MobileのヘルプページのURLから「#」を取るとHTMLソースが見られるので、参考に