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