【问题标题】:Composite operations in Android CanvasAndroid Canvas 中的复合操作
【发布时间】:2011-02-02 21:09:45
【问题描述】:

我刚开始进行 Android 开发,我来自 JavaScript/HTML 世界,所以我目前正在研究 Android SDK 的可能性。

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

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

【问题讨论】:

    标签: java android html5-canvas android-canvas


    【解决方案1】:

    组合是通过在 CanvasPaint 上绘制来处理的,PorterDuffXfermode 使用 PorterDuffXfermode

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

    请参阅here 了解更多信息。我还设法覆盖了onPaint,这样我们就可以将此组合应用到自己绘制的元素上。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 简单的矩形裁剪是不够的。我需要复杂的 alpha 蒙版。
      • 我只是在查看链接中显示的两个示例图像 - source-in 和 source-atop 示例似乎没有任何 alpha 掩码。如果这就是你所追求的,我不知道该怎么做。画布确实支持绘制在彼此之上的图像“层”之间的透明度,前提是这些图像已经内置了这种透明度,但更有经验的人必须告诉我们是否可以自动进行混合。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 2012-06-22
        • 2011-12-09
        • 1970-01-01
        • 2015-03-28
        • 2016-04-26
        • 1970-01-01
        • 2015-09-21
        • 2014-01-05
        相关资源
        最近更新 更多