Camera2 TextureViewの回転(プレビューアスペクト比キープ)|Android開発

      2018/06/15

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);
}

 - Android