カメラ撮影とビュー

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

ちなみに今作っているゲームアプリには全く関係がなく、
単に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


<< F-10Dのドット抜け バックアップはきちんとネ >>