Алгоритм Floodfill в Android - PullRequest
       4

Алгоритм Floodfill в Android

6 голосов
/ 16 ноября 2010

Я не могу найти реализацию алгоритма заливки для Android.

Есть идеи, если в Android доступен API-интерфейс для заливки, а если нет, есть ли альтернатива?

Ответы [ 2 ]

2 голосов
/ 09 октября 2012

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 для использования алгоритма заливки. Использование того же в основном потоке вызвало ошибку нехватки памяти. Даже если я использую алгоритм floofill, иногда заполнение огромной области занимает больше времени, из-за чего приложение перестает отвечать на запросы.

Заполните весь холст, но оставьте ограниченную область заливки в виде круга, прямоугольника . Эта ссылка может решить вашу проблему

2 голосов
/ 02 декабря 2010

У вас есть какое-то определение формы?

Если это так, взгляните на Canvas docs . Вы можете заполнить область, определив область клипа, а затем вызвав canvas.drawColor.

Грубый пример:

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

Есть несколько функций клипов, поэтому вы должны иметь возможность создавать все, что вы пытаетесь заполнить.

С другой стороны, если вы хотите заполнить область в загруженном растровом изображении, я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...