AndroidのCamera2を使ってSurfaceViewにプレビューを表示する方法を前の記事で紹介しましたが、ここではプレビューサイズを調整する方法を紹介します。というのも、アプリで正方形のカメラプレビューを作りたく試行錯誤したのですがなかなか上手くいかず、プレビューが縦横歪んでしまったり小さくなってしまったりとかなり苦戦したため。

プレビューサイズの考え方と設定方法

一旦正方形は置いておいて、以下の流れで基本的にはプレビューサイズを設定できます。ポイントとしては、カメラはスマホを横持ちにする前提になっているようで、縦持ちの場合はwidthとheightを逆にしてパラメータ設定する必要があるということです。

①getOutputSizezでカメラデバイスが対応している出力サイズを取得してここからサイズを選ぶ(横向きが基準のため、xが長い)

StreamConfigurationMap configs = manager.getCameraCharacteristics(cameraId).get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] size = configs.getOutputSizes(ImageFormat.JPEG);

②SurfaceViewのLayoutsizeを設定する(横幅と縦幅の比は①で選択したサイズの比に合わせる)

ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) surfaceView.getLayoutParams();
lp.width = xxx; //横幅
lp.height = xxx; //縦幅
surfaceView.setLayoutParams(lp);

③SurfaceViewのFixedSizeを設定する(縦持ちの場合はwidthとheightを逆に指定する)

SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
surfaceView.getHolder().setFixedSize(lp.height, lp.width);

正方形プレビューの作り方

まず、SurfaceViewのプレビューサイズだけを調整しても正方形は作れませんでした。カメラデバイスの出力サイズ(getOutputSizesで取得できるサイズのリスト)に正方形はないため、無理にFixedSizeやLayoutsizeを正方形にしてもプレビューが歪んでしまいます。

結局、SurfaceViewの上に正方形になるようImageViewなどを被せることで正方形のプレビューを実現できました。