简体   繁体   English

Flutter 如何在摄像头上绘制可按压矩形?

[英]Flutter how to draw pressable rectangle on camera feed?

I'm using camera plug-in to get the camera feed.我正在使用camera插件来获取相机供稿。 Every 10 seconds, I generate 4 values (x,y,w,h) and draw a rectangle (only the border, the inside is transparent) on the screen (with random text).每 10 秒,我生成 4 个值(x,y,w,h)并在屏幕上绘制一个矩形(只有边框,内部是透明的)(带有随机文本)。 If the user clicks on this box, it disappears.如果用户单击此框,它就会消失。

It looks something like this image.它看起来像这张图片。 (x,y,w,h) and the text are randomly generated. (x,y,w,h)和文本是随机生成的。

在此处输入图像描述

Is this possible to do this using camera plugin?这可以使用camera插件来做到这一点吗? Or is there another package that already does this?或者是否有另一个 package 已经这样做了?

Camera plugin does not have any feature to draw over the preview, but you can make something like that with Stack widget and containers.相机插件没有任何可以在预览上绘制的功能,但是您可以使用 Stack 小部件和容器进行类似的操作。

Here's a quick and dirty example, but hopefully will give you the idea:这是一个快速而肮脏的例子,但希望能给你这个想法:

class CameraApp extends StatefulWidget {
  @override
  _CameraAppState createState() => _CameraAppState();
}

class _CameraAppState extends State<CameraApp> {
  CameraController controller;

  // Holds the position information of the rectangle
  Map<String, double> _position = {
    'x': 0,
    'y': 0,
    'w': 0,
    'h': 0,
  };

  // Whether or not the rectangle is displayed
  bool _isRectangleVisible = false;

  Future<void> getCameras() async {
    final cameras = await availableCameras();
    controller = CameraController(cameras[0], ResolutionPreset.medium);
    controller.initialize().then((_) {
      if (!mounted) {
        return;
      }
      setState(() {});
    });
  }

  // Some logic to get the rectangle values
  void updateRectanglePosition() {
    setState(() {
      // assign new position
      _position = {
        'x': 0,
        'y': 0,
        'w': 0,
        'h': 0,
      };
      _isRectangleVisible = true;
    });
  }

  @override
  void initState() {
    getCameras();
    super.initState();
  }

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

  @override
  Widget build(BuildContext context) {
    if (!controller.value.isInitialized) {
      return Container();
    }
    return Stack(
      children: [
        AspectRatio(
          aspectRatio: controller.value.aspectRatio,
          child: controller == null ? Container() : CameraPreview(controller),
        ),
        if (_isRectangleVisible)
          Positioned(
            left: _position['x'],
            top: _position['y'],
            child: InkWell(
              onTap: () {
                // When the user taps on the rectangle, it will disappear
                setState(() {
                  _isRectangleVisible = false;
                });
              },
              child: Container(
                width: _position['w'],
                height: _position['h'],
                decoration: BoxDecoration(
                  border: Border.all(
                    width: 2,
                    color: Colors.blue,
                  ),
                ),
                child: Align(
                  alignment: Alignment.topLeft,
                  child: Container(
                    color: Colors.blue,
                    child: Text(
                      'hourse -71%',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
            ),
          ),
      ],
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM