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