- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好,谁能告诉我为什么这个掩蔽尝试的背景是黑色的。这一定很接近,但我就是无法杀死背景。我看到其他人提到 saveLayer(rect, paint)
是这里的关键,因为它将整个 Canvas 矩形插入掩蔽操作。 This question (无屏蔽操作)和this one (没有实际答案)是相似的,但对我没有用。
main.dart
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ui.Image mask;
ui.Image image;
@override
void initState() {
super.initState();
load('images/squircle.png').then((i) {
setState(() {
mask = i;
});
});
load('images/noodlejpg.jpg').then((i) {
setState(() {
image = i;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(backgroundColor: Colors.blue, title: Text('I am a title')),
body: SafeArea(
child: SizedBox(
width: 200.0,
height: 200.0,
child: CustomPaint(painter: OverlayPainter(mask, 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;
}
}
class OverlayPainter extends CustomPainter {
ui.Image mask;
ui.Image image;
OverlayPainter(this.mask, this.image);
@override
void paint(Canvas canvas, Size size) {
var paint = new Paint();
paint.isAntiAlias = true;
if (image != null) {
var rect = Rect.fromLTRB(0, 0, 200, 200);
Size outputSize = rect.size;
Size inputSize = Size(image.width.toDouble(), image.height.toDouble());
final FittedSizes fittedSizes =
applyBoxFit(BoxFit.cover, inputSize, outputSize);
final Size sourceSize = fittedSizes.source;
canvas.save();
final Rect sourceRect = Alignment.center.inscribe(
sourceSize,
Offset.zero & inputSize,
);
canvas.drawImageRect(image, sourceRect, rect, paint);
canvas.restore();
}
if (mask != null) {
var rect = Rect.fromLTRB(0, 0, 200, 200);
Size outputSize = rect.size;
Size inputSize = Size(mask.width.toDouble(), mask.height.toDouble());
final FittedSizes fittedSizes =
applyBoxFit(BoxFit.cover, inputSize, outputSize);
final Size sourceSize = fittedSizes.source;
canvas.saveLayer(rect, Paint()..blendMode = BlendMode.dstIn);
final Rect sourceRect = Alignment.center.inscribe(
sourceSize,
Offset.zero & inputSize,
);
canvas.drawImageRect(mask, sourceRect, rect, paint);
canvas.restore();
}
}
@override
bool shouldRepaint(OverlayPainter oldDelegate) {
return mask != oldDelegate.mask || image != oldDelegate.image;
}
}
面条jpg.jpg
松鼠.jpg
结果
最佳答案
作为没有任何 CustomPainters 的选项
import 'dart:typed_data';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: SafeArea(
child: Center(
child: SizedBox(
width: 300,
height: 300,
child: MaskedImage(asset: 'images/noodlejpg.jpeg', mask: 'images/circle.png'),
),
),
),
),
);
}
}
class MaskedImage extends StatelessWidget {
final String asset;
final String mask;
MaskedImage({@required this.asset, @required this.mask});
@override
Widget build(BuildContext context) {
return LayoutBuilder(builder: (context, constraints) {
return FutureBuilder<List>(
future: _createShaderAndImage(asset, mask, constraints.maxWidth, constraints.maxHeight),
builder: (context, snapshot) {
if (!snapshot.hasData) return const SizedBox.shrink();
return ShaderMask(
blendMode: BlendMode.dstATop,
shaderCallback: (rect) => snapshot.data[0],
child: snapshot.data[1],
);
},
);
});
}
Future<List> _createShaderAndImage(String asset, String mask, double w, double h) async {
ByteData data = await rootBundle.load(asset);
ByteData maskData = await rootBundle.load(mask);
Codec codec = await instantiateImageCodec(maskData.buffer.asUint8List(), targetWidth: w.toInt(), targetHeight: h.toInt());
FrameInfo fi = await codec.getNextFrame();
ImageShader shader = ImageShader(fi.image, TileMode.clamp, TileMode.clamp, Matrix4.identity().storage);
Image image = Image.memory(data.buffer.asUint8List(), fit: BoxFit.cover, width: w, height: h);
return [shader, image];
}
}
关于flutter - 使用 Custom Painter 在 Flutter 中遮盖两个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60468768/
我创建了一个 Painter 类,它应该在屏幕上绘制一个圆弧,但是当键盘聚焦在一个 TextField 上时它会升高。删除 SingleChildScrollView 解决了这个问题,但它显示了 n
我知道 painter.setWindow 是如何工作的。例如,如果我将小部件最大化,那么我在该小部件中绘制的内容也会以相同的比例变大。 但我不明白 painter.setViewport 究竟做了什
我想知道是否有一种方法可以将一堆形状绘制为自己的对象,以便当用户想要缩放、更改颜色或旋转时,所有形状都会相应调整? 然后我希望将这组形状放置在 QGraphicsView 上预定的 x,y 坐标处并具
我有一些数据会不断变化。我通过 QPainter 将这些数据绘制成一行,并想通过 QTimer 进行动态更新(每秒更新一次),但数据只会在我关闭绘画窗口时更新,它不会在窗口中实时更新。我哪里错了??这
我正在开发一款名为“Pogo Painter”的迷你游戏,我需要一些数学解决方案。下面是一张图片(用 Paint 制作)来说明它的全部内容。 四名不同颜色的玩家必须占据方 block 才能获得分数。迷
我的任务: 创建一个程序来仅使用基元(如三角形或其他东西)复制图片(作为输入给出)。该程序应使用进化算法来创建输出图片。 我的问题: 我需要发明一种算法来创建种群并检查它们(它们与输入图片的匹配程度
我想在 Qt 中非常有效地绘制基本的 2D 形状(正方形),因此我继承了 QOpenGLWidget 如下: WatorOpenGLWidget.hpp #include #include #in
我正在创建一个继承自 NimbusLookAndFeel 的外观,让我知道如何注册我自己的组件以使用它们的自定义 Painter。 例如,像这样的 ButtonPainter 类的 JButton 曾
我需要了解如何更改创建自己的 Painter 方法的 JPanel 颜色的逻辑。我创建了一个示例项目用于说明; 问题:按钮操作中的直接颜色更改代码不会更改任何内容。 问题 1) 重写 paintCom
我创建了 QToolBar 的子类,使上下文工具栏与 QGraphicsItem 相关联。 我想要添加的是一个小三角形指向我的工具栏弹出的位置。我知道 QPainter 不能在 QToolBar 之外
我已经将图像存储在板本地目录(/home/images/system/image.png) 对于 painter.drawimage 函数,将 Qpoint 和 Qimage 作为参数传递。 pain
使用画家,可以使用 fragment 在 ImageBitmap 上绘制 val imageBitmap: ImageBitmap = imageResource(id = R.drawable
In the picture language in SICP我无法理解 transform-painter 过程的工作原理: (define (transform-painter painter o
我在我的挥杆应用程序中使用 Nimbus 外观。 我设置了 UIDefaults 的主要和次要属性的外观和感觉。 颜色是对的。现在我有一个问题,组件的画家使用颜色,这些颜色是在更新颜色主题之前定义的。
我正在努力学习如何使用绘图功能。到目前为止,我已经能够使用 QPainter 类在 QWidget 上绘制一些圆圈,如下所示: 我在 MainWindow.h 中添加了: virtual void
我在这里指的是图形中使用的画家算法。我有一些代码,其中我使用它们的中点从前到后绘制多边形来判断它们离视点有多远。我知道这不适用于重叠的多边形或彼此相交的多边形,但这在所有其他情况下都有效吗?这在多边形
我正在使用 Java 从头开始制作 3D 渲染器,没有外部库。当我尝试优化时,我想知道画家算法是否比 Z 缓冲更快的一般/平均答案。假设我正在渲染一个相同的立方体,这样会更快。但我不希望相交的多边
我正在为给定字符绘制字形轮廓,使用: QString myfname="FreeMono.ttf"; QRawFont *myfont=new QRawFont(myfname,324,QFont::
由于某种原因,Stack 小部件没有显示带有 CustomPaint 的 Container。 但是,如果从 Stack 中删除,它可以正常工作。我在这里错过了什么? class _DemoNavBa
你好,谁能告诉我为什么这个掩蔽尝试的背景是黑色的。这一定很接近,但我就是无法杀死背景。我看到其他人提到 saveLayer(rect, paint) 是这里的关键,因为它将整个 Canvas 矩形插入
我是一名优秀的程序员,十分优秀!