Отсечение изображений с использованием png в флаттере? - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь добиться эффекта, показанного на изображении внизу этого вопроса, по сути, у меня есть изображение орка (квадрат) и png для темного облака / дыма, которые я хочу использовать в качестве маски для своего изображения орка.

До сих пор я нашел варианты обрезать изображения, используя кривые Безье , но ничего при использовании других изображений в качестве маски.Это достижимо?

enter image description here

1 Ответ

0 голосов
/ 05 июня 2018

Вы, конечно, можете сделать это с CustomPainter.Обратите внимание, что во Flutter есть два разных класса с именем Image.Нормальный виджет;другой (часть пакета ui) ближе к растровому изображению.Мы будем использовать последний.Я положил два изображения в папку с активами (милый котенок и фон с прозрачной дырой).Здесь показано, как загрузить графику из ресурсов, преобразовать их в растровые изображения и как нарисовать их в Canvas.Конечным результатом является котенок, показывающий сквозную дыру.

import 'dart:ui' as ui;
import 'dart:typed_data';
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;

class ImageOverlay extends StatefulWidget {
  @override
  State createState() => new ImageOverlayState();
}

class ImageOverlayState extends State<ImageOverlay> {
  ui.Image kitten;
  ui.Image hole;

  @override
  Widget build(BuildContext context) {
    return new SizedBox(
      width: 500.0,
      height: 500.0,
      child: new CustomPaint(
        painter: new OverlayPainter(hole, kitten),
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    load('assets/hole.png').then((i) {
      setState(() {
        hole = i;
      });
    });
    load('assets/kitty.jpg').then((i) {
      setState(() {
        kitten = i;
      });
    });
  }

  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;
  }
}

class OverlayPainter extends CustomPainter {
  ui.Image hole;
  ui.Image kitten;

  OverlayPainter(this.hole, this.kitten);

  @override
  void paint(Canvas canvas, Size size) {
    if (kitten != null) {
      canvas.drawImage(kitten, Offset(0.0, 0.0), new Paint());
    }
    if (hole != null) {
      canvas.drawImage(hole, Offset(0.0, 0.0), new Paint());
    }
  }

  @override
  bool shouldRepaint(OverlayPainter oldDelegate) {
    return hole != oldDelegate.hole || kitten != oldDelegate.kitten;
  }
}

При рисовании изображений на холсте вам, возможно, придется иметь дело с Transforms, чтобы правильно масштабировать изображения.

У меня не было шансачтобы попробовать, но вы пробовали Stack с двумя (виджет) Image s, расположенными друг над другом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...