Android作業ログ

=前置き=

 今回も色々とあったのでメモ。

=自前でスライド(スクロール)=

 自前でonTouchEventからスクロールを作ろうとしたものの、たまに上手くスライドしない時があった。

 そこで複雑なタッチイベントを取得する - Androidプログラマへの道 〜 Moonlight 明日香 〜を参考にGestureDitectorを使ったところうまくいった。
 具体的には「onScrollで押しっぱなし時の移動」「onFlingで慣性移動」をすればOKだった。onFlingのvelocityは「ドット/秒」という単位っぽい。

=自前でダイアログっぽいもの(半透明Activity)=

 http://team-hiroq.com/blog/android/transparentactivity.htmlで半透明のActivityは作れるので、あとは素人のアンドロイドアプリ開発日記テーマを設定する。 - 素人のアンドロイドアプリ開発日記の「Theme.Black.NoTitleBar.Fullscreen」のところの設定を追加すれば半透明な全体描画Activityが作れる。

=常に「メディアの音量」を制御=

 今回のゲームはBGMがなく、そのままだと音が鳴っている間しか「メディアの音量」は調整できないため、SEが鳴っている間しかゲーム用の音量が調整できない。(着信音量になってしまう)

 そこで、http://kokuzuki.blogspot.com/2011/06/android_04.htmlを参考に、全てのActivityに設定を加えた。

=比率を保ったまま文字列の拡大縮小=

 普通にTextViewを使って文字を表示すると、基本的に固定幅になってしまう。文章を表示する場合はそれで良いものの、ゲームなどで「CONGRATULATIONS!」みたいな表示が途中で途切れたり改行されたりすると格好悪い。

 そこでImageViewと同じようにTextViewも拡大縮小して欲しい。ざっと調べたものの、TextViewのままだと難しいようなので、ImageViewに文字列の画像を指定することで実現することにした。

 具体的には以下のようなコードにした。

//ベースの画像幅
//- 最終的には拡大縮小されるので、ここでは「文字列が収まること」「拡大時のために一定の解像度を用意すること」さえ守れれば良い
int w = 256;
int h = 64;

//使うもの
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
Paint p = new Paint();

//文字の描き方
p.setARGB(0xFF, 0xFD, 0xF2, 0x3B);
p.setTextSize(h);
p.setAntiAlias(true);
p.setTextAlign(Paint.Align.CENTER);

//位置情報
FontMetrics fm = p.getFontMetrics();
float CenterX = w/2;
float CenterY = h/2 - (fm.ascent + fm.descent)/2;

//文字の描画
bmp.eraseColor(0x00000000);
c.drawText("CLEAR!", CenterX, CenterY, p);

//画像としてセット
ImageView img= (ImageView)findViewById(R.id.res_img_result);
img.setImageBitmap(bmp);

=独自フォントを使う=

 今回はフリーフォントを使うことにしたので、フォントを差し替えたい。
 TextViewはTextViewで独自Fontを設定する方法 - yokochiの開発メモを参考に、Paintで文字列を描画する場合は数独のフォントを変えてみる - Androidアプリ開発日記を参考にしてできた。

=layout_weightによる比率の指定=

 当初は「2:2:1にしたいなら、layout_weightにそのまま設定すればOKだろう」と思って設定したがダメだった。さらに「0.4:0.4:0.2ならどうだ」と試したけどこれでもダメだった。

 layout_weightの使い方 - ASとかを見ると、想定したものとはちょっと挙動が違うようだ。

 上のリンク先を参考に考えると、2:2:1を実現する場合の2に指定する値Xは「1 - 2*X = 2 / (2+2+1)」となり、X=0.3となる。つまり0.3:0.3:0.4という指定をすれば良い。
 式の意味としては「1(=fill_parentなので割合は1) - 2(=さらに二つのfill_parentが並んでいるのでその2つ分マイナス)*X(指定する割合) = 2(=2:2:1の2) / (2+2+1)(=全体の合計)」という感じ。初見では面倒だが、慣れると単純な計算に見える。しかし直感的ではないなー。


=マーケットへのリンク=

 http://techbooster.jpn.org/andriod/application/6014/を参考にすればOK。

=予定=

 今日でひとまずゲームとしての形は整った。まだ微調整は残っているものの、リリース自体は問題なくできるレベルのはず。
 ということで、明日からは体験版やら紹介用動画やらを作っていく予定。早ければ土曜、遅くても日曜の夜には公開できると思う。