dart - Flutter:刮刮卡

标签 dart flutter

这里是 react-native 中的刮刮卡示例,我想在 Flutter 中实现,但我没有任何方法可以做到这一点。我尝试使用 blendMode 但它不起作用,甚至在 flutter 中的 CustomPaint 中也没有给出明确的功能。 https://github.com/aleksik/react-scratchcard . enter image description here

 Future<Null> main() async {
  runApp(MaterialApp(home: Scaffold(body: new Roller())));
}

class Roller extends StatefulWidget {
  @override
  _ScratchCardState createState() => new _ScratchCardState();
}

class _ScratchCardState extends State<Roller> {
  ui.Image _image;
  String _urlImage = 'assets/BedRoom.png';

  List<Offset> _points = <Offset>[];
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    super.initState();

    load(_urlImage).then((j) {
      _image = j;
      print('image:${_image}');
    });
  }

  Future<ui.Image> load(String asset) async {
    ByteData data = await rootBundle.load(asset);

    ui.Codec codec = await ui.instantiateImageCodec(
      data.buffer.asUint8List(),
    );
    ui.FrameInfo fi = await codec.getNextFrame();
    return fi.image;
  }

  void _onPanStart(DragStartDetails dt) {
    print('drag start ');
    setState(() {

    });
  }

  Offset _localPosition;
  void _onPanUpdate(DragUpdateDetails details) {
    setState(() {
      RenderBox object = context.findRenderObject();

      _localPosition = object.globalToLocal(details.globalPosition);
      _points = new List.from(_points)..add(_localPosition);
    });
  }

  _onPanEnd(DragEndDetails dt) {
    _points.add(null);
  }

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

  Widget _scale(BuildContext context) {
    return GestureDetector(
      onPanStart: _onPanStart,
      onPanUpdate: _onPanUpdate,
      onPanEnd: _onPanEnd,
      onDoubleTap: () {
        setState(() {
          _points.clear();
        });
      },
      child: Container(
        child: CustomPaint(
          painter: ScratchCard(
              imagePath: _image, points: _points,),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _scale(context),
    );
  }
}

class ScratchCard extends CustomPainter {
  final ui.Image imagePath;
  List<Offset> points;
  ScratchCard({Key key, this.imagePath, this.points}) : super();
  Paint _paint = Paint();

  Rect rect, inputSubrect, outputSubrect;
  Path path = new Path();
  Paint paint1 = new Paint();
  @override
  void paint(Canvas canvas, Size size) {
    _paint.blendMode = BlendMode.src;
    if (imagePath != null)
      canvas.drawImage(imagePath, Offset(10.0, 100.0), _paint);
    Paint paint = new Paint()
      ..color = Colors.white
      ..strokeCap = StrokeCap.round
      ..strokeWidth = 30.0;
    _paint.blendMode = BlendMode.clear;
    for (int i = 0; i < points.length - 1; i++) {
      if (points[i] != null && points[i + 1] != null) {
        canvas.drawLine(points[i], points[i + 1], paint);
        path.reset();
      }
    }
  }

  @override
  bool shouldRepaint(ScratchCard oldDelegate) {
    return true;
  }
}

最佳答案

我在 Flutter 中创建了一个刮刮卡库,它同时支持颜色和图像可抓取叠加层。你可以从https://pub.dev/packages/scratcher得到它非常欢迎反馈!

例子:

Scratcher(
  brushSize: 30,
  threshold: 50,
  color: Colors.red,
  onChange: (value) { print("Scratch progress: $value%"); },
  onThreshold: () { print("Threshold reached, you won!"); },
  child: Container(
    height: 300,
    width: 300,
    child: Text("Hidden text"),
  ),
)

Preview

关于dart - Flutter:刮刮卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51945339/

相关文章:

firebase - 如何将 Firestore 文档列表打印到控制台?

dart - 在 flutter 中编码时如何在 BottomNavigationBar 中显示超过 3 个项目

flutter - 如何全局更改 OutlineButton 的边框颜色和宽度?

flutter - 如何根据屏幕大小调整 flutter 小部件的大小?

dart - 我可以使用 ListTile 中的 onTap 转到新屏幕吗?

json - Flutter - 没有实例 getter 'lenght' 错误

dart - 如何在 Flutter 中设置主屏幕的背景颜色?

dart - 一个如何更新ListView子级?

android - 在后台上传

redux - 使用ViewModel时导航到新屏幕并传递redux存储状态