2010-03-31 48 views
7

我刚刚开始使用Android开发,并且来自JavaScript/HTML世界,因此我正在研究Android SDK的可能性。Android Canvas中的复合操作

HTML 5画布支持复合操作(请参阅here)。

这是可能在Android的画布?我扫描了Canvas类的API,但找不到任何有用的东西。我至少需要复合操作“source-in”或(如果这不可能)“source-atop”。

回答

8

通过使用PorterDuffXfermodePaintCanvas上画图来处理组合物。

Paint p=new Paint(); 
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); 
canvas.drawBitmap(bitmap, 0, 0, p); 

更多信息,请参见here。我也设法覆盖onPaint,以便我们可以将这个组合应用到绘制自己的元素。

1

我还没有看过之前做过这些操作,但我认为有一种方法可以使用Rect形状来完成这些操作。您可以定义矩形以标记应将哪些区域绘制到画布中,或者将哪些区域从源图像中取出,并且Rect类具有内置的一些比较功能。例如,要模仿源文件,您可以使用setIntersect(Rect boundingBoxOfSource, Rect boundingBoxOfDestination)来使您的新矩形仅具有两个图像的相交区域。然后,您可以使用该矩形作为Canvas的绘制命令之一的参数,告诉它只从源图像中的矩形内的像素。然后您可以按照执行绘图命令的顺序来控制Z轴中的绘图。

+0

简单的剪裁与矩形是不够的。我需要复杂的alpha蒙版。 – kayahr 2010-03-31 12:51:39

+0

我刚才看到链接中显示的两个示例图像 - 源代码输入和源代码顶部示例似乎没有任何alpha遮罩。如果那是你的追求,那么我不知道该怎么做。画布确实支持在彼此顶部绘制的图像的“图层”之间的透明度,只要图像已经具有内置的透明度,但更有经验的人将不得不告诉我们是否可以自动进行混合。 – 2010-03-31 13:09:21

1

自己找到了。 PorterDuffXfermode实现所有这些复合模式。