首页 文章

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

提问于
浏览
0

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

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

1 回答

  • 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 isn 't supported if you'已经打开硬件加速,正如在为ICS构建时默认情况下您的视图会发生这种情况 . (尝试上面的代码,在非硬件加速仿真器中为Android 4构建,以及在真正的ICS设备上 . 您可能会看到它在前者上工作正常,但后者不是 . )

    如果硬件加速对您不重要,您可以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 .

相关问题