2

我正在尝试做一个简单的绘画应用程序,但每次我调用 onDraw 时,它都会删除我之前拥有的内容。在我的绘制中,我正在执行以下操作(其中点是具有 x 和 y 整数的类,“点”是列表点):

        Paint paint = new Paint();
        int c = getPaintFromActivityClass();
        paint.setColor(c);
        Path path = new Path();
        boolean first = true;
        for(Point point : points){
            if(first){
                first = false;
                path.moveTo(point.x, point.y);
            }
            else{
                path.lineTo(point.x, point.y);
            }
        }
        canvas.drawPath(path, paint);

我每次都尝试将“旧”路径添加到新路径,基本上将路径相互连接,并创建单独的(未连接的)路径。但是,在 onDraw 中,我还设置了另一个视图正在更改的油漆颜色。当我将路径相互添加时,更改颜色会改变所有路径的颜色。

4

2 回答 2

2

你在打电话super.onDraw(canvas)吗?如果是这样,请在此之后进行所有绘图,否则超级调用将重绘整个视图。

如果您使用的是 onTouch,我也猜您正在平移和/或缩放。如果是这样,那么canvas.save()在你做任何绘图之前和canvas.restore()之后也要使用。Android 画布类似于 HTML5 画布,并且这个描述比 Android 文档更好(就像互联网上的任何其他编程主题页面一样;))

https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Transformations

于 2012-04-17T21:06:50.973 回答
2

另一种选择是创建路径和颜色的 ArrayList 或 Vector 并存储每个,然后更改您的 onDraw 方法。将这些添加到类中:

ArrayList<Path> paths;
ArrayList<int> colors;

在 onTouch 中,您将为每个 ArrayList 创建并添加路径和颜色,然后在 ondraw 中遍历路径......仍然在您的 ontouch 方法中调用 invalidate。要重新开始,您将清空 ArrayList

Paint paint = new Paint();
for(int i =0 : i < Paths.size() ;i++){ 
paint.setColor(colors.get(i));
canvas.drawPath(paths.get(i), paint);
}

如果您创建一堆位图,请确保在正确的时间回收它们。如果您想跟踪历史记录,这个答案中的概念可能会更好,很容易做一个简单的“撤消”按钮,然后弹出最后一个条目。您可以通过创建自己的类来跟踪颜色和路径来进一步完善这一点,然后您将只有一个自定义类的 ArrayList。

于 2012-04-17T21:35:09.270 回答