import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'package:smtias_capture/models/preview_region.dart'; import 'package:smtias_capture/widgets/oriented_preview.dart'; import 'package:smtias_capture/widgets/region_crop.dart'; /// カメラのライブプレビューを表示するウィジェット. /// /// [region] が指定された場合,**表示向きを適用したプレビューの画面座標** /// (0.0–1.0)で矩形にクロップして拡大表示する(WYSIWYG / [RegionCrop]). /// 撮影画像の出力には影響しない. class CameraPreviewWidget extends StatelessWidget { const CameraPreviewWidget({ super.key, required this.controller, this.region = PreviewRegion.full, }); final CameraController controller; /// プレビュー表示のクロップ領域(表示後の画面座標 0.0–1.0). final PreviewRegion region; @override Widget build(BuildContext context) { if (!controller.value.isInitialized) { return const Center(child: CircularProgressIndicator()); } final previewSize = controller.value.previewSize; if (previewSize == null) { return const Center(child: CircularProgressIndicator()); } // カメラのアスペクト比(プレビューは横長で返るので反転) final cameraAspect = previewSize.height / previewSize.width; // 表示向きを適用したフルプレビュー(撮影者が見る向き=クロップ元). final oriented = OrientedPreview( child: Center( child: AspectRatio( aspectRatio: cameraAspect, child: CameraPreview(controller), ), ), ); return RegionCrop(region: region, child: oriented); } }