Android中的Floodfill算法

时间:2010-11-16 18:07:22

标签: android graphics

我无法找到Android的Floodfill算法实现。

知道Android中是否有可用的Floodfill API,如果没有,还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

你对形状有一些定义吗?

如果是,请查看Canvas docs。您可以通过定义剪辑区域然后调用canvas.drawColor来填充区域。

粗略的例子:

    Rect r = new Rect(0,0,300,300);
    canvas.clipRect(r); // see also clipRegion
    canvas.drawColor(Color.RED);

有几个剪辑功能,所以你应该能够构建你想要填充的任何东西。

另一方面,如果你想在加载的位图中填充区域,那么我不知道。

答案 1 :(得分:2)

android中的FloodFill

public class FloodFill {
public void floodFill(Bitmap  image, Point node, int targetColor,
    int replacementColor) {
int width = image.getWidth();
int height = image.getHeight();
int target = targetColor;
int replacement = replacementColor;
if (target != replacement) {
    Queue<Point> queue = new LinkedList<Point>();
    do {
        int x = node.x;
        int y = node.y;
        while (x > 0 && image.getPixel(x - 1, y) == target) {
            x--;
        }
        boolean spanUp = false;
        boolean spanDown = false;
        while (x < width && image.getPixel(x, y) == target) {
            image.setPixel(x, y, replacement);
            if (!spanUp && y > 0 && image.getPixel(x, y - 1) == target) {
                queue.add(new Point(x, y - 1));
                spanUp = true;
            } else if (spanUp && y > 0
                    && image.getPixel(x, y - 1) != target) {
                spanUp = false;
            }
            if (!spanDown && y < height - 1
                    && image.getPixel(x, y + 1) == target) {
                queue.add(new Point(x, y + 1));
                spanDown = true;
            } else if (spanDown && y < height - 1
                    && image.getPixel(x, y + 1) != target) {
                spanDown = false;
            }
            x++;
        }
    } while ((node = queue.poll()) != null);
}
}
}

您应该使用asynctask来使用floodfill算法。在主线程上使用相同的内存错误导致内存不足。即使我使用floofill算法有时填充一个巨大的区域需要更多的时间导致应用程序在时间上没有响应。

Fill the complete canvas but keep the bound fill area as it is like circle, rectangle。 此链接可以解决您的问题