【发布时间】:2014-04-26 15:34:26
【问题描述】:
是否可以在 Canvas 上指定一个 Rect 以忽略随后的 Canvas.drawXYZ() 调用,而 Canvas 的其他部分正在被渲染?它就像一个反向剪辑矩形。
例如,我有一个 100*100 的画布,上面已经画了一些东西。但我想剪掉左上角 50*50 以免被画出其他任何东西。在这个阶段,后续调用应该在除左上角 50*50 以外的任何地方绘制。
【问题讨论】:
是否可以在 Canvas 上指定一个 Rect 以忽略随后的 Canvas.drawXYZ() 调用,而 Canvas 的其他部分正在被渲染?它就像一个反向剪辑矩形。
例如,我有一个 100*100 的画布,上面已经画了一些东西。但我想剪掉左上角 50*50 以免被画出其他任何东西。在这个阶段,后续调用应该在除左上角 50*50 以外的任何地方绘制。
【问题讨论】:
对此有一个相对简单的答案,如果您需要硬件加速,则会增加复杂性。
简单的答案:使用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。
【讨论】: