【发布时间】:2022-07-20 23:03:28
【问题描述】:
我正在做一个绘图项目,我有一些工具(即画笔、橡皮擦等),它们是它们自己的类,每个工具都继承自具有一些基本属性和抽象/非抽象的工具类- 抽象方法。我看到的主要问题是当我需要更改这些工具的颜色时,我想找出一种方法来为所有工具做这件事,但也允许某些工具(如橡皮擦)保持不变,因为它的颜色应该始终只是作为背景颜色。
我正在从其他地方收到onColorChange(int newColor) 方法调用,但这是我触发工具颜色更改的起点。目前,它只会更改活动工具的颜色,但这意味着每个工具都有不同的颜色集,这会让人感到困惑。
我想要更改颜色以触发所有工具的setColor() 方法,所以我考虑将 setColor() 方法作为静态方法放在 Tool 类中,但这不允许我覆盖用于防止颜色改变的 Eraser 类。
有人对如何实现这个有任何想法吗? TLDR:我希望 onColorChange() 事件触发所有工具的颜色更改,但我还想在 Eraser 类中覆盖它,因此该工具不会发生颜色更改。
目前,通过我的实现,我有以下内容:
Tool currentTool;
Tool myBrush;
Tool myEraser;
Tool myPencil;
// This is called from elsewhere
pubic void setup() {
myBrush = new Brush();
myEraser = new Eraser();
myPencil = new Pencil();
currentTool = myBrush;
}
// This is called from elsewhere
public void onColorChange(int newColor) {
currentTool.setColor(newColor);
}
Tool.java
public abstract class Tool {
protected String toolName;
protected Paint myPaint;
public String getToolName() {
return mToolName;
}
public int getColor() {
return myPaint.getColor();
}
public Paint getPaintObject() {
return myPaint;
}
protected abstract void setColor(int newColor);
}
Eraser.java
public class Eraser extends Tool {
public Eraser() {
toolName = "ERASER";
myPaint = new Paint();
mFgPaint.setColor(Color.parseColor("#FFFFFF"));
mFgPaint.setAntiAlias(true);
mFgPaint.setStrokeWidth(DEFAULT_WIDTH);
mFgPaint.setStyle(Paint.Style.STROKE);
mFgPaint.setStrokeJoin(Paint.Join.ROUND);
mFgPaint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void setColor(int newColor) {
// Empty, since I cannot change the paint color of the eraser
}
}
Brush.java
public class Brush extends Tool {
public Brush() {
toolName = "BRUSH";
myPaint = new Paint();
setColor(Color.parseColor("#000000"));
mFgPaint.setAntiAlias(true);
mFgPaint.setStrokeWidth(DEFAULT_WIDTH);
mFgPaint.setStyle(Paint.Style.STROKE);
mFgPaint.setStrokeJoin(Paint.Join.ROUND);
mFgPaint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void setColor(int newColor) {
myPaint.setColor(newColor);
}
Pencil.java
public class Pencil extends Tool {
public Brush() {
toolName = "PENCIL";
myPaint = new Paint();
setColor(Color.parseColor("#000000"));
mFgPaint.setAntiAlias(true);
mFgPaint.setStrokeWidth(DEFAULT_WIDTH);
mFgPaint.setStyle(Paint.Style.STROKE);
mFgPaint.setStrokeJoin(Paint.Join.ROUND);
mFgPaint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
protected void setColor(int newColor) {
myPaint.setColor(newColor);
}
【问题讨论】:
标签: java