코딩하는 제리

[Flutter/Project](Instagram Clone) camera preview 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) camera preview

JerryCho 2021. 1. 29. 12:28

 

 


flutter-ko.dev/docs/cookbook/plugins/picture-using-camera

 

카메라 사진 찍기

사진을 찍거나 영상을 촬영하기 위해 디바이스의 카메라를 사용하는 많은 앱들이 있습니다.이러한 목적을 위해 Flutter는 [`camera`]({{site.pub-pkg}}/camera) 플러그인을 제공합니다. `camera` 플러그인을

flutter-ko.dev


소스코드 및 pubspec.yaml

// widgets/take_photo.dart

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter_project_IJ/constants/screen_size.dart';
import 'package:flutter_project_IJ/widgets/my_progress_indicator.dart';

class TakePhoto extends StatefulWidget {
  const TakePhoto({
    Key key,
  }) : super(key: key);

  @override
  _TakePhotoState createState() => _TakePhotoState();
}

class _TakePhotoState extends State<TakePhoto> {
  CameraController _controller;
  Widget _progress = MyProgressIndicator();

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<CameraDescription>>(
        // availableCameras 사용할 수 있는 카메라 정보를 가져옴
        future: availableCameras(),
        builder: (context, snapshot) {
          return Column(
            children: [
              Container(
                color: Colors.black,
                height: size.height / 3 * 2,
                width: size.width,
                child:
                    (snapshot.hasData) ? _getPreview(snapshot.data) : _progress,
              ),
              Expanded(
                child: OutlineButton(
                  onPressed: () {},
                  shape: CircleBorder(),
                  borderSide: BorderSide(
                    color: Colors.black12,
                    width: 20,
                  ),
                ),
              )
            ],
          );
        });
  }

  Widget _getPreview(List<CameraDescription> cameras) {
    // cameras[0] 첫번째 카메라
    // ResolutionPreset.veryHigh 사용할 사진 해상도
    _controller = CameraController(cameras.first, ResolutionPreset.veryHigh);

    return FutureBuilder(
        future: _controller.initialize() /*컨트롤러 초기화*/,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            // Future가 완료되면, 프리뷰를 보여줌.
            return ClipRect(
              // OverflowBox로 넘어간 부분을 제거.
              child: OverflowBox(
                // BoxFit으로 맞춘 나머지 부분을 밖으로 넘어가게 함.
                alignment: Alignment.center,
                child: FittedBox(
                  // 가로사이즈에 맞춤.
                  fit: BoxFit.fitWidth,
                  child: Container(
                    width: size.width,
                    child: CameraPreview(_controller),
                  ),
                ),
              ),
            );
          } else {
            // 로딩 이미지
            return _progress;
          }
        });
  }
}
Comments