【问题标题】:How to specify a Rect on a Canvas NOT to be drawn on?如何在不绘制的画布上指定 Rect?
【发布时间】:2014-04-26 15:34:26
【问题描述】:

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

例如,我有一个 100*100 的画布,上面已经画了一些东西。但我想剪掉左上角 50*50 以免被画出其他任何东西。在这个阶段,后续调用应该在除左上角 50*50 以外的任何地方绘制。

【问题讨论】:

    标签: android canvas


    【解决方案1】:

    对此有一个相对简单的答案,如果您需要硬件加速,则会增加复杂性。

    简单的答案:使用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

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 1970-01-01
      • 2011-08-16
      • 2021-07-15
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多