复制Paint对象

时间:2015-09-06 17:00:25

标签: java android canvas paint

好的,我不知道如何描述这个。我创建了一个名为ScreenAreas的类,它定义了屏幕上的特定区域。后来,我正在绘制这些ScreenAreas。

我想要做的是将Paint属性(Color,strokeWidth,Shaddowsettings等)耦合到这些ScreenAreas,这样我再也不需要重新绘制所有这些属性。

这是我的ScreenArea类:     import android.graphics.Canvas;     import android.graphics.Paint;

public class ScreenArea {

private int xMin;
private int yMin;
private int xMax;
private int yMax;
private Paint paint;

public ScreenArea(int x1, int x2, int y1, int y2, Paint paint) {
    this.setXMin(x1);
    this.setXMax(x2);
    this.setYMin(y1);
    this.setYMax(y2);
    this.paint = paint;

}

// I removed the getters and setters for clarity

public void draw(Canvas canvas){
    canvas.drawRect(this.xMin, this.yMin, this.xMax, this.yMax, this.paint);
}
}

在我的主要课程中,我使用以下方法构建它们:

paint.setColor(Color.rgb(10,10,10));
area1 = new ScreenArea (
            0,
            0,
            100,
            100,
            paint);

paint.setColor(Color.rgb(100,100,100));
area2 = new ScreenArea(
            20, 
            20, 
            80, 
            80,
            paint);

当我尝试绘制它们时,我只是这样做:

area1.draw(canvas);
area2.draw(canvas);

但是,这两个区域的颜色都是相同的。事实上,它们被赋予最后使用的颜色。可能这是因为ScreenArea中的Paint对象只是指向主类中的同一个Paint对象。问题是,如何解决这个问题!

任何?

2 个答案:

答案 0 :(得分:5)

您应该记住Paint对象有一个copy constructor。所以而不是:

this.paint = paint;

ScreenArea构造函数中,您可以使用:

this.paint = new Paint(paint);

答案 1 :(得分:1)

答案很好,但如果由于某种原因你不想实例化一个新的Paint(也许是因为你在onDraw()内,我意识到这不是例如,这里你可以使用Paint.set()

  

public void set(Paint src)在API级别1中添加

     

将src中的字段复制到此画图中。这相当于   在所有src字段上调用get(),并调用相应的   set()方法。

private Paint paint;替换为private Paint paint = new Paint();,然后将this.paint = paint;(仅复制到指向Paint对象的指针)替换为this.paint.set(paint);(复制paint中的字段{1}}至this.paint