Newer
Older
MiniTias / lib / widgets / camera_preview.dart
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

/// カメラのライブプレビューを全画面で表示するウィジェット.
///
/// フロントカメラの映像を鏡像(左右反転)で表示する.
class CameraPreviewWidget extends StatelessWidget {
  const CameraPreviewWidget({super.key, required this.controller});

  final CameraController controller;

  @override
  Widget build(BuildContext context) {
    if (!controller.value.isInitialized) {
      return const Center(child: CircularProgressIndicator());
    }

    return LayoutBuilder(
      builder: (context, constraints) {
        final previewSize = controller.value.previewSize;
        if (previewSize == null) {
          return const Center(child: CircularProgressIndicator());
        }

        // カメラのアスペクト比(プレビューは横長で返るので反転)
        final cameraAspect = previewSize.height / previewSize.width;
        final screenAspect = constraints.maxWidth / constraints.maxHeight;

        // 画面いっぱいに表示するためのスケール
        final scale = cameraAspect > screenAspect
            ? constraints.maxHeight / (constraints.maxWidth / cameraAspect)
            : constraints.maxWidth / (constraints.maxHeight * cameraAspect);

        return ClipRect(
          child: Transform(
            alignment: Alignment.center,
            // X 軸を反転(鏡像),Y 軸を反転(上下逆転)
            transform: Matrix4.diagonal3Values(-scale, -scale, 1.0),
            child: Center(
              child: AspectRatio(
                aspectRatio: cameraAspect,
                child: CameraPreview(controller),
              ),
            ),
          ),
        );
      },
    );
  }
}