Camera2 TextureViewの回転(プレビューアスペクト比キープ)|Android開発
Camera2 TextureViewの回転では、プレビューをTextureView
全体に表示させるサンプルでした。そのため実際のプレビューより可視領域が狭くなる場合があります。
今回はプレビューの可視領域を全て表示する(プレビューのアスペクト比をキープ)サンプルになります。
この場合はTextureView
の上下または左右に何も描画されない領域が出来ます。
サンプル
void configureTransformKeepAspect(TextureView textureView, int previewWidth, int previewHeight) {
int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
Matrix matrix = new Matrix();
RectF viewRect = new RectF(0, 0, textureView.getWidth(), textureView.getHeight());
RectF bufferRect = new RectF(0, 0, previewHeight, previewWidth);
PointF center = new PointF(viewRect.centerX(), viewRect.centerY());
if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {
bufferRect.offset(center.x - bufferRect.centerX(), center.y - bufferRect.centerY());
matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
float scale = Math.min(
(float) textureView.getWidth() / previewWidth,
(float) textureView.getHeight() / previewHeight);
matrix.postScale(scale, scale, center.x, center.y);
matrix.postRotate(90 * (rotation - 2), center.x, center.y);
} else {
bufferRect.offset(center.x - bufferRect.centerX(), center.y - bufferRect.centerY());
matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);
float scale = Math.min(
(float) textureView.getWidth() / previewHeight,
(float) textureView.getHeight() / previewWidth);
matrix.postScale(scale, scale, center.x, center.y);
matrix.postRotate(90 * rotation, center.x, center.y);
}
textureView.setTransform(matrix);
}