カメラプレビューを任意のサイズに

By | 2013年9月8日

Androidのカメラを使う際、SurfaceViewのサイズとカメラのプレビューサイズが異なると映像が歪んでしまいます。
SurfaceViewの描画は他のViewと異なるため、デザイン上の面倒な要因なのですが、入れ子とネガティブマージンを使う事で解決できます(※)のでご紹介します。
※最初に言っておきますが万能では無いです。一部端末で上手く行かないのでご注意下さい。

サンプルソースをgithubにアップしてます。> https://github.com/cda244/AndroidCameraSize

●まず配置する
例として、画像1の様に 540×960 のプレビューサイズを、 400×400 にトリミングするケースを考えます。

画像1 サイズ確認

画像1 サイズ確認

何も設定しないと画像2の様に比率を無視して潰れてしまいます。

画像2 歪んだプレビュー

画像2 歪んだプレビュー

1つの解決方法として、縦と横の縮小率のうち小さい方を使うことで歪む事無く 400×400 のエリアに表示する事ができますが、画像3の様に余白が出来てしまいます。

画像3 全体を表示

画像3 全体を表示

●入れ子とネガティブマージンで解決
まず SurfaceView を入れ子にし、親のViewのサイズを 400×400 にします。
次に、SurfaceView の設定ですが、縦と横の縮小率では大きい方を使います。今回の例だと縦が 400 を超えるため、実行するとやはり画像2の様に潰れてしまいます。

そこで、画像4の様に、縦の差分を上方向のネガティブマージンとして指定すると、本来のプレビュー画像の上が切れてしまうものの、400×400 のエリア一杯に歪む事無く表示されます。

画像4 マージン分、上が切れるが歪まず表示される

画像4 マージン分、上が切れるが歪まず表示される

●注意点
冒頭に※で書きましたが、この方法は万能ではありません。
106shでテストしたところ、DDMSのキャプチャでは問題無いのですが、実機ではネガティブマージン分、上にも表示されてしまいました(SurfaceView の上にはみ出る余白が十分無い場合は問題ない)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です