复制 Paint 对象
Copy Paint object
好吧,我不知道该如何描述。我制作了一个名为 ScreenAreas 的 Class 来定义屏幕上的特定区域。稍后,我正在绘制这些 ScreenAreas。
我想做的是将 Paint 属性(Color、strokeWidth、Shaddowsettings 等)耦合到这些 ScreenAreas,这样我在绘制它们时就不必重置所有这些属性再次.
这是我的屏幕区域Class:
导入 android.graphics.Canvas;
导入 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);
}
}
在我的主要 Class 中,我使用以下方法构建它们:
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 对象只是指向主 Class 中的同一个 Paint 对象。问题是,如何解决这个问题!
有人吗?
你应该记住Paint
object has a copy constructor。所以代替:
this.paint = paint;
在您的 ScreenArea
构造函数中,您可以使用:
this.paint = new Paint(paint);
答案很好,但是如果出于某种原因你不想实例化一个新的 Paint
(可能是因为你在 onDraw()
里面,我意识到这里不是这种情况) 那么你可以使用 Paint.set().
public void set (Paint src) Added in API level 1
Copy the fields from src into this paint. This is equivalent to
calling get() on all of the src fields, and calling the corresponding
set() methods on this.
将 private Paint paint;
替换为 private Paint paint = new Paint();
,然后将 this.paint = paint;
(仅复制指向 Paint
对象的指针)替换为 this.paint.set(paint);
(复制字段从 paint
到 this.paint
.
好吧,我不知道该如何描述。我制作了一个名为 ScreenAreas 的 Class 来定义屏幕上的特定区域。稍后,我正在绘制这些 ScreenAreas。
我想做的是将 Paint 属性(Color、strokeWidth、Shaddowsettings 等)耦合到这些 ScreenAreas,这样我在绘制它们时就不必重置所有这些属性再次.
这是我的屏幕区域Class: 导入 android.graphics.Canvas; 导入 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);
}
}
在我的主要 Class 中,我使用以下方法构建它们:
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 对象只是指向主 Class 中的同一个 Paint 对象。问题是,如何解决这个问题!
有人吗?
你应该记住Paint
object has a copy constructor。所以代替:
this.paint = paint;
在您的 ScreenArea
构造函数中,您可以使用:
this.paint = new Paint(paint);
答案很好,但是如果出于某种原因你不想实例化一个新的 Paint
(可能是因为你在 onDraw()
里面,我意识到这里不是这种情况) 那么你可以使用 Paint.set().
public void set (Paint src) Added in API level 1
Copy the fields from src into this paint. This is equivalent to calling get() on all of the src fields, and calling the corresponding set() methods on this.
将 private Paint paint;
替换为 private Paint paint = new Paint();
,然后将 this.paint = paint;
(仅复制指向 Paint
对象的指针)替换为 this.paint.set(paint);
(复制字段从 paint
到 this.paint
.