Newer
Older
SmTIAS-Capture / lib / widgets / camera_preview.dart
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);
  }
}