首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振:如何正确地将ImageFilter应用于当前层?

颤振:如何正确地将ImageFilter应用于当前层?
EN

Stack Overflow用户
提问于 2021-11-09 13:43:48
回答 1查看 148关注 0票数 0

我正在尝试将ImageFilter的序列应用到当前绘制的Canvas层。

代码语言:javascript
复制
canvas.drawCircle(...)
canvas.drawCircle(...)

// TODO Apply ImageFilter 1: Blur
// TODO Apply ImageFilter 2: Blur again

有什么简单的方法吗?我可能错过了一些简单的方法,但我什么也找不到.

我尝试过的事情:

我知道我可以在ImageFilter中指定组合的Paint,但这是行不通的--我希望在绘制所有形状之后,将它们依次应用于每个形状,而不是分别应用于每个形状。

saveLayer似乎是实现我所需要的最接近的,但根据docs,它只应用ColorFilter。他们还说这有点低效。

代码语言:javascript
复制
saveLayer(null, Paint()..colorFilter = filter2)
saveLayer(null, Paint()..colorFilter = filter1)
..
canvas.draw
canvas.draw
...
restore()
restore()

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 22:42:49

作为将来的参考,我能够通过使用RenderBox (例如,LeafRenderObjectWidget)达到预期的效果。

RenderBox有一个油漆方法:

代码语言:javascript
复制
@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都可以添加,但是语法还是有点痛苦。如果需要,可以通过一些努力加以简化:

代码语言:javascript
复制
/// 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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69899255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档