カテゴリ:Android( 43 )

回転入力を作ってみた。

ドラッグなどの標準操作と、スマフォ特有のフリック入力やピンチ入力を実装した。

というわけで、次に必要になる回転入力を作ってみた。

画面上にジョグダイアルが表示されて、画面上で指をくるくるとドラッグすると、
ジョグダイヤルも回る。

ジョグダイヤル上でまわす必要はなく、画面上どこでまわしても、
まわす半径が大きくても小さくてもOK、逆回転もできる。

意外に楽にできた。

どこに必要な操作かというと、アイテムの購入数とか、
数字を入力する必要がある部分で使う。

コンシューマーゲーム機だと、左右キー押しっぱなしでリピート入力すればいいんだけどね。

スマフォ系はタッチ間がないので、できるだけ指を動かす、
そして、画面上どこでも入力してもOK、というコンセプトで作成中。

できれば指一本で操作させたいところだけど、
ピンチ操作が非常に便利なんだよなー。
[PR]
by miries | 2012-10-06 00:32 | Android

ProgressDialogを使ってみた。

ダイアログ系はアプリ制作には必須なのだが、今まで触ってなかったので、
同じく触っていなかったキー周りと合わせて使ってみた。

バックキーを押したら、ProgressDialogが表示される、というだけのもの。
手持ちのAndroid SDK逆引きハンドブックにも丁寧に書かれているし、
ネットでもガンガンサンプルが引っかかるので、ここではコードは省略。

で、使った感想は、

「使 い に く い」

いや、実装は簡単ですぐに表示できるので、その点は楽であるが、
使い勝手がすこぶる悪い。

そもそも、この手のダイアログは、一回使ったら終わり、というものではない。
であるのに、一度、dismiss()でメッセージを消すと、もう一度 show()をすると、
アニメーションが止まっているのだ。

エラーになるわけでもなく、止まったアニメーションが表示されるだけ。
2回目以降もアニメーションをさせるためには、

progressDialog = new ProgressDialog();

から始めないとダメなのだ。

最初にダイアログのインスタンスを生成しておいて、
後は、show()とdismiss()を繰り返すだけ、という風になぜできないのか?
[PR]
by miries | 2012-10-01 13:01 | Android

カメラ撮影とビュー

ようやく、カメラで撮影する機能を使ったアプリが動いた。

ちなみに今作っているゲームアプリには全く関係がなく、
単にAndroidの機能をテストしたかっただけ。

すでに先人が色々なテスト結果を記録・公開してくれているので、
割とすんなりできた方だろう。


というわけで、いくつか躓いたポイントを備忘録として書いておく。

○SurfaceHolderのタイプは、SURFACE_TYPE_PUSH_BUFFERSで無いとエラー。
 カメラのプレビューを表示するためには、この設定じゃないとダメなのだが、
 この設定はCanvasがリードオンリーになってしまう。
 なので、プレビューの上に何か描いたりすることができない。
 (この設定は、Android3.1で廃止になったらしいが…)

 これを回避する方法が少なくとも2つある。

○SURFACE_TYPE_NORMALを使う
 これで描くことができるようになるらしい。
 のだが、プレビューで取ってこれる画像データが、
 そのままでは使えないヘッダなしの生データらしく、
 使うためには変換をかまさないといけないとのこと。
 変換メソッドを公開してくれている人もいたけど、面倒なのでパス。

○SurfaceViewを重ねる
 一番下にカメラのプレビューを置き、その上に自由に描けるビューをおけばいいじゃん。
 ということで、2重ビュー方式を採用。
 「ビューを重ねることは、やってはいけないらしい」という記述も見かけたが、華麗にスルー。
 できるんだからいいジャン。

 が、ここでも、問題は発生。
 カメラのプレビューは決められたサイズを設定しないとエラーで落ちる。
 この決められてサイズに、端末の液晶サイズがあるとは限らないのだ。
 その場合、カメラのプレビューは、画面サイズに合わせるため、
 引き伸ばされたりして、実際の景色とは異なる画角になる。
 そこに画像を合成したら、プレビューとは異なる合成になってしまった。

 仕方が無いので、少し小さめのプレビューにして、余白は黒で塗りつぶし、
 プレビューと撮影の画角を合わせた。

 ここまでくれば出来たも同然なのだが、最後に1つ。
 上に重ねるビューは、背景が透明でないとダメなのだが、
 一度何か描くと、透明に戻らないのだ。
 合成する画像を切り替えていくと、画面にだんだんゴミが残っていくのだ。
 これも、先人の解説で解決。
 透過色で塗りつぶす際の、引数を省略せずに設定する必要があるそうだ。

 c.drawColor(0 ,android.graphics.PorterDuff.Mode.CLEAR );

 これで、透明色でクリアできた。
 完璧。
[PR]
by miries | 2012-09-27 12:16 | Android