如何在画布上指定一个不要绘制的Rect?

时间:2014-04-26 06:33:21

标签: android canvas

是否可以在Canvas上指定一个Rect来忽略后续的Canvas.drawXYZ()调用,而Canvas的其他部分正在呈现?它就像一个反向剪辑矩形。

例如,我有一个100 * 100的画布,已经有一些东西被绘制到它上面。但我想将左上角的50 * 50剪辑为不被绘制。在此阶段,后续调用应绘制除左上角50 * 50之外的任何位置。

1 个答案:

答案 0 :(得分:2)

这是一个相对简单的答案,如果你需要硬件加速,会增加复杂性。

简单回答:使用clipRect variant with the Op parameter设置为DIFFERENCE。这将有效地添加除剪辑指定的矩形之外的所有内容:

canvas.clipRect(new Rect(0, 0, 50, 50), Op.DIFFERENCE);
// Now draw whatever you like.

但是,如果您已启用硬件加速,则不支持Op.DIFFERENCE,默认情况下,在为ICS构建时,您的视图会发生这种情况。 (尝试上面的代码,在非硬件加速仿真器和真正的ICS设备上为Android 4+构建。你可能会看到它在前者上工作正常,但后者不行。)

如果硬件加速对您来说并不重要,您可以turn it off。但那并不理想。

幸运的是,硬件加速或没有硬件加速,clipRect 支持Op.UNION来建立新矩形和现有区域的联合。因此,在您的情况下,您可以将要绘制的区域视为两个单独的矩形相加,并将它们添加到剪切区域,如下所示:

// Rectangle down right-hand side
canvas.clipRect(new Rect(50, 0, 100, 100));
// Rectangle across bottom. This overlaps with the 
// above, but that doesn't matter.
canvas.clipRect(new Rect(0, 50, 100, 100), Op.UNION);

......无论你是否硬件加速,这都应该有用。

请参阅the Android docs for exact details on what's not supported with hardware acceleration