我正在尝试将ImageFilter的序列应用到当前绘制的Canvas层。
canvas.drawCircle(...)
canvas.drawCircle(...)
// TODO Apply ImageFilter 1: Blur
// TODO Apply ImageFilter 2: Blur again有什么简单的方法吗?我可能错过了一些简单的方法,但我什么也找不到.
我尝试过的事情:
我知道我可以在ImageFilter中指定组合的Paint,但这是行不通的--我希望在绘制所有形状之后,将它们依次应用于每个形状,而不是分别应用于每个形状。
saveLayer似乎是实现我所需要的最接近的,但根据docs,它只应用ColorFilter。他们还说这有点低效。
saveLayer(null, Paint()..colorFilter = filter2)
saveLayer(null, Paint()..colorFilter = filter1)
..
canvas.draw
canvas.draw
...
restore()
restore()谢谢!
发布于 2021-11-09 22:42:49
作为将来的参考,我能够通过使用RenderBox (例如,LeafRenderObjectWidget)达到预期的效果。
RenderBox有一个油漆方法:
@override
void paint(PaintingContext context, Offset offset) {
context.pushLayer(
ColorFilterLayer(colorFilter: ColorFilter.matrix(...)),
(PaintingContext context2, Offset offset2) =>
context2.pushLayer(
ImageFilterLayer(imageFilter: ui.ImageFilter.blur(...)),
(PaintingContext context3, Offset offset3) =>
simulation.draw(context3.canvas),
offset2),
offset);这并不是说simulation.draw(context3.canvas)将在画布中绘制,后面跟着模糊的ImageFilter,然后是ColorFilter。任何数量的Layers都可以添加,但是语法还是有点痛苦。如果需要,可以通过一些努力加以简化:
/// Returns the painter with the given layer applied.
PaintingContextCallback withLayer(
ContainerLayer layer, PaintingContextCallback painter) {
return (PaintingContext context, Offset offset) =>
context.pushLayer(layer, painter, offset);
}
...
final List<ContainerLayer> layers = [...];
var painter = ...
for (final layer in layers) {
painter = withLayer(layer, painter);
}
painter(context, offset);https://stackoverflow.com/questions/69899255
复制相似问题