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