【问题标题】:Android Drawing Fill ToolAndroid 绘图填充工具
【发布时间】:2014-07-16 17:20:12
【问题描述】:

我正在为 android 制作一个绘图应用程序,我需要一些帮助来添加填充工具。

我希望该工具能够填充填充,并像在 Microsoft Paint 中一样运行,但在手机上。

我有一个在画布上绘制路径的自定义视图。我为不同的钢笔和画笔绘制不同的路径,并允许用户选择线条粗细和颜色。

当我这样做时:

paint.setStyle(Paint.Style.FILL);

我画画,我没有得到我想要的填充。

我收到了一些使用“Flood Fill Algorithm”的建议,但我不知道如何在我的代码中实现它。

我可以去哪里查看我正在尝试做的事情的示例?有没有人有示例代码向我展示如何使该工具与我的 android 视图一起使用?

编辑:

CartoonView.java:

    public class CartoonView extends View {
        ArrayList<Paint> paints = new ArrayList<Paint>();
        ArrayList<Path> paths = new ArrayList<Path>();
        int color;
        int thickness;
        boolean pencilSelected;

    public boolean isPencilSelected() {
        return pencilSelected;
    }

    public void setPencilSelected(boolean pencilSelected) {
        this.pencilSelected = pencilSelected;
    }

    public ArrayList<Paint> getPaints() {
        return paints;
    }

    public void setPaints(ArrayList<Paint> paints) {
        this.paints = paints;
    }

    public ArrayList<Path> getPaths() {
        return paths;
    }

    public void setPaths(ArrayList<Path> paths) {
        this.paths = paths;
    }

    public int getThickness() {
        return thickness;
    }

    public int getColor() {
        return color;
    }

    public CartoonView(Context context, AttributeSet attrs) {
        super(context, attrs);
        color = Color.BLACK;
        thickness = 3;
        pencilSelected = true;
        createPaint();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        for (Path path : paths) {
            canvas.drawPath(path, paints.get(paths.indexOf(path)));
        }
    }

    public void setPaintColor(int newColor) {
        color = newColor;
        createPaint();
    }

    public void setPaintThickness(int newThickness) {
        thickness = newThickness;
        createPaint();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (this.isEnabled()) {
            Path path;
            if (paths.size() == 0) {
                path = new Path();

                Paint paint = new Paint();
                paint.setAntiAlias(true);
                paint.setStrokeWidth(5f);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeJoin(Paint.Join.ROUND);
                paint.setColor(color);
                paint.setStrokeWidth(thickness);

                thickness = (int) paint.getStrokeWidth();

                paths.add(path);
                paints.add(paint);
            } else {
                path = paths.get(paths.size() - 1);
            }
            float eventX = event.getX();
            float eventY = event.getY();
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(eventX, eventY);
                return true;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(eventX, eventY);
                break;
            default:
                return true;
            }
            invalidate();
        }
        return true;
    }

    public void createPaint() {
        Path path = new Path();

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5f);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setColor(color);
        paint.setStrokeWidth(thickness);

        paths.add(path);
        paints.add(paint);
    }

    public void clearView(){
        paths.clear();
        paints.clear();
        invalidate();
    }
}

【问题讨论】:

  • 用颜色填充封闭区域?
  • 使用洪水填充算法
  • @Raghunandan 好的,我会试试的。
  • 请展示您目前拥有的代码 - 如何实现洪水填充取决于您的数据结构
  • @user3771655 抱歉,但如果你自己做更多的工作,请阅读en.wikipedia.org/wiki/Flood_fill - 尝试理解它并提出具体问题 - 不要像这个那样太宽泛

标签: android android-canvas android-view


【解决方案1】:

我完全同意一些评论员关于洪水填充算法的看法。

以下是您想要的功能。试试看:

private void FloodFill(Bitmap bmp, Point pt, int targetColor, int replacementColor){
Queue<Point> q = new LinkedList<Point>();
q.add(pt);
while (q.size() > 0) {
    Point n = q.poll();
    if (bmp.getPixel(n.x, n.y) != targetColor)
        continue;

    Point w = n, e = new Point(n.x + 1, n.y);
    while ((w.x > 0) && (bmp.getPixel(w.x, w.y) == targetColor)) {
        bmp.setPixel(w.x, w.y, replacementColor);
        if ((w.y > 0) && (bmp.getPixel(w.x, w.y - 1) == targetColor))
            q.add(new Point(w.x, w.y - 1));
        if ((w.y < bmp.getHeight() - 1)
                && (bmp.getPixel(w.x, w.y + 1) == targetColor))
            q.add(new Point(w.x, w.y + 1));
        w.x--;
    }
    while ((e.x < bmp.getWidth() - 1)
            && (bmp.getPixel(e.x, e.y) == targetColor)) {
        bmp.setPixel(e.x, e.y, replacementColor);

        if ((e.y > 0) && (bmp.getPixel(e.x, e.y - 1) == targetColor))
            q.add(new Point(e.x, e.y - 1));
        if ((e.y < bmp.getHeight() - 1)
                && (bmp.getPixel(e.x, e.y + 1) == targetColor))
            q.add(new Point(e.x, e.y + 1));
        e.x++;
    }
}}

您还可以在链接上阅读有关洪水填充的一些信息:Link1Link2Link3

希望您的问题得到解答。请让我知道我可以通过其他方式帮助您,或者您对上述答案有疑问。

享受编码... :)

更新了更多信息:

以上函数将在 FloodFill 算法的基础上工作。它究竟会做的是, 无论您触摸到哪里,它都会检测该像素上的像素点和颜色。 然后它将通过所选颜色逐个像素地填充颜色,直到任何像素没有与当前不同的颜色。

希望对你有帮助。

【讨论】:

  • 非常感谢您的回答,您能告诉我函数中应该传递哪些参数吗?
  • @user3771655 你说的路径是什么意思?是不是和你用路径做的油漆然后在里面填充颜色有关?
  • @user3771655 参数自行解释。 1)位图:您要填充颜色 2)点:您触摸以填充颜色 3)目标颜色:您要在触摸位置及其周围填充颜色。(例如:蓝色) 4)替换颜色:即你想换成。 (例如:红色)
  • 你想通过触摸画线来改变颜色吗?还是想在特定区域填充颜色?
  • @我希望能够用颜色填充区域
【解决方案2】:
private void setupDrawing(){

        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(50);
        drawPaint.setStyle(Paint.Style.STROKE);

     // here i use round round u may use anther option also :) 

        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
 }

【讨论】:

  • 或者你可以参考这个链接code.tutsplus.com/tutorials/…
  • 感谢您的回答!当我使用它时,我得到与 paint.setStyle(Paint.Style.FILL); 相同类型的填充。用于画布油漆
  • 另外,这个链接是关于绘制图案的,我需要tro能够点击并填补空白/
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多