【问题标题】:Camera preview stretched in flutter相机预览在颤动中拉伸
【发布时间】:2021-06-24 10:29:08
【问题描述】:

我已将相机预览设置为全屏以满足特定的 UI,但是相机是全屏的,但它非常拉伸。

我哪里出错了?

final size = MediaQuery.of(context).size;
    final deviceRatio = size.width / size.height;
    return Stack(children: <Widget>[
      Center(
        child: Transform.scale(
          scale: controller.value.aspectRatio / deviceRatio,
          child: new AspectRatio(
            aspectRatio: controller.value.aspectRatio,
            child: new CameraPreview(controller),
          ),
        ),
      ),
    ]);
  }

我在下面附上了一张照片。如您所见,与按钮相比,它非常模糊和拉伸。

编辑:这是我收到的错误:

NoSuchMethodError: The Method '[]' was called on Null.
Receiver: null
Tried calling: [](0)

编辑 - 这是完整的相机页面,

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'dart:async';

import 'MyApp/main.dart';

List<CameraDescription> cameras;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  cameras = await availableCameras();
  runApp(MyApp());
}

class Camera extends StatefulWidget {
  Function setData;
  Camera({Key key, this.setData}) : super(key: key);

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

class _CameraScreenState extends State<Camera> {
  CameraController controller;
  List cameras;
  int selectedCameraIndex;
  String imgPath;
  var image;

  @override
  void initState() {
    super.initState();
    controller = CameraController(cameras[0], ResolutionPreset.max);
    controller.initialize().then((_) {
      if (!mounted) {
        return;
      }
      setState(() {});
    });
  }

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (!controller.value.isInitialized) {
      return Container();
    }
    return MaterialApp(
      home: CameraPreview(controller),
    );
  }
}

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您的屏幕分辨率不一定与您的相机分辨率匹配,您应该使用相机的分辨率和纵横比来获得正确的图像。

    看看初始化后可以从CameraValue获取的aspectRatio属性。


    更新:

    实际上,您甚至不需要aspectRatio。您可以直接使用DevicePreview。如果父小部件是全屏的,则预览也将是全屏的。例如。 camera包中的官方示例是这样渲染的:

    示例代码:

    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:camera/camera.dart';
    
    List<CameraDescription> cameras;
    
    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      cameras = await availableCameras();
      runApp(CameraApp());
    }
    
    class CameraApp extends StatefulWidget {
      @override
      _CameraAppState createState() => _CameraAppState();
    }
    
    class _CameraAppState extends State<CameraApp> {
      CameraController controller;
    
      @override
      void initState() {
        super.initState();
        controller = CameraController(cameras[0], ResolutionPreset.max);
        controller.initialize().then((_) {
          if (!mounted) {
            return;
          }
          setState(() {});
        });
      }
    
      @override
      void dispose() {
        controller?.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        if (!controller.value.isInitialized) {
          return Container();
        }
        return MaterialApp(
          home: CameraPreview(controller),
        );
      }
    }
    

    【讨论】:

    • 但是您不应该缩放它以匹配您的屏幕尺寸,因为它们可能完全不同。您可以离开 CameraPreview 小部件。看看camera package readme 中的例子:已经是全屏了。
    • 我以正确的方式进行营销,因为这应该可以正常工作,但是,我对正在发生的事情进行了编辑。如果你能复习,那就太棒了。
    • _CameraScreenState 中删除List cameras;,因为它会影响文件顶部定义的List&lt;CameraDescription&gt; cameras;
    • 所以你需要全屏呈现,并且不能用Container改变预览视图的大小?
    • 我找到了一种用这种方法调整相机大小的方法:stackoverflow.com/questions/51348166/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多