在将图片绘制到画布上时应用不透明度(或绘制)

时间:2015-08-12 10:18:50

标签: android android-canvas

作为Sharp(Android的可缩放矢量图形)的作者之一,我试图找到一种有效的方法来应用群组不透明度。

假设我们有以下SVG:

Group transparency example
来源SVG:group_transparency.svg

SVG的简化代码段:

svn.exe

注意两对圆之间的差异:顶部对各有一半不透明度,这导致红色和绿色混合。底部对具有完全不透明度,但包含它们的组最终以半透明度绘制,因此没有绿色和红色的混合。

我的第一个方法是跟踪一堆图片,在遇到组结束标记时绘制它们:

<svg ...>
  <g ...>
    <path ...
       style="stroke:#ffcc00;stroke-width:20;" />
    <circle ...
       style="fill:#00cc00;opacity:0.5;" />
    <circle ...
       style="fill:#cc0000;opacity:0.5;" />
    <g ...
       style="opacity:0.5">
      <circle ...
         style="fill:#00cc00;" />
      <circle ...
         style="fill:#cc0000;" />
    </g>
  </g>
</svg>

SvgGroup是一个简单的类:

SvgGroup g = mGroupStack.pop();
mCanvas = g.canvas;
Picture p = g.picture;
p.endRecording();
mCanvas.drawPicture(p);

这里的直接问题是我在将图片绘制到画布上时无法应用不透明度,因为我无法将Paint作为private class SvgGroup { private Picture picture; private Canvas canvas; private float opacity; } 的参数提供。

我发现用正确的不透明度绘制组的唯一方法是首先将图片绘制到位图中:

Canvas.drawPicture()

虽然这有效,但使用Picture的好处在于光栅化时会丢失。放大说明了每种方法的问题(左图:绘制图片;右图:绘制位图):

显然 - 从这个项目的名称 - 这不是我想要的!有没有办法保留使用图片的明显好处,同时能够将整体不透明度应用到它?

1 个答案:

答案 0 :(得分:3)

这就是我要使用的内容:Canvas#saveLayer()Canvas#saveLayerAlpha()

使用前者,您可以将Paint参数与setAlpha()一起使用(但我不能100%确定它是否有效),后者使用它应该更容易和更安全:

  

调用restore()时,当取消屏幕外位图时,将应用alpha参数。