撮影サイズとプレビュー領域のアスペクト比を同じにする|Android開発
撮影サイズと同じアスペクト比でプレビュー領域を作成するサンプルです。
こうすることで、見た目と同じ領域の画像が撮影されます。
レイアウト抜粋
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/camera_preview_root">
<SurfaceView
android:id="@+id/camera_surface"
android:layout_gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
SurfaceView のサイズ計算
Fragment
クラスの場合のサンプルです。
撮影サイズはportraitで撮影した時のサイズを利用します。
@Override
public void surfaceCreated(SurfaceHolder holder) {
SurfaceView surfaceView = (SurfaceView) getActivity().findViewById(R.id.camera_surface);
View root = getActivity().findViewById(R.id.camera_preview_root);
int degrees = ディスプレイ回転度
int pictureWidth = 撮影サイズ幅
int pictureHeight = 撮影サイズ高さ
Size changeSize;
Size viewSize = new Size(root.getWidth(), root.getHeight());
if (degrees == 90 || degrees == 270) {
changeSize = calculateViewSize(pictureHeight, pictureWidth, viewSize);
} else {
changeSize = calculateViewSize(pictureWidth, pictureHeight, viewSize);
}
ViewGroup.LayoutParams layoutParams = surfaceView.getLayoutParams();
layoutParams.width = changeSize.getWidth();
layoutParams.height = changeSize.getHeight();
surfaceView.setLayoutParams(layoutParams);
}
/**
* 幅と高さと同じアスペクト比かつ、maxSize に収まる View のサイズを取得する.
* @param width アスペクト比の計算に使用する幅.
* @param height アスペクト比の計算に使用する高さ.
* @param maxSize 最大の矩形サイズ.
* @return View サイズ.
*/
protected Size calculateViewSize(int width, int height, Size maxSize) {
int h = maxSize.getWidth() * height / width;
if (h % 2 != 0) {
h--;
}
if (maxSize.getHeight() < h) {
int w = maxSize.getHeight() * width / height;
if (w % 2 != 0) {
w--;
}
return new Size(w, maxSize.getHeight());
}
return new Size(maxSize.getWidth(), h);
}
ディスプレイ回転度の計算
Camera実装時によく使う処理のサンプル|Android開発