我正在尝试创建一个可以在我想在类的onDraw()函数上绘制内容时调用的对象。这是我的代码不起作用:
//object class
public class DrawObject extends Canvas {
Paint paint = new Paint();
public void setColor(int color){
paint.setColor(color);
}
// I want to draw an arrow to instead of a line
public void drawArrow(float startPointX, float startPointY, float endPointX, float endPointY){
drawLine(startPointX, startPointY, endPointX, endPointY, paint);
// draw the rest of the arrow here
}
}
主要课程:
public class Screen extends ImageView{
Paint paint = new Paint();
public Screen(Context context){
super(context);
paint.setColor(Color.BLACK);
paint.setStyle(Style.STROKE);
}
public void onDraw(DrawObject drawObject){
//called DrawObject instead on Canvas
drawObject.drawArrow(10,10,100,100);
// I want to draw the arrow here but it is not working.
}
有人可以告诉我这样做的正确方法是什么?感谢。
答案 0 :(得分:2)
我实际上会沿着这些方向做点什么:
为可绘制对象定义一个界面(以避免与Android Drawable
类混淆,我称之为Paintable
)
public interface Paintable {
public void paint(Canvas canvas) {}
}
制作您需要以自定义方式绘制的任何类,例如您建议的箭头,实现Paintable
界面,并覆盖paint(Canvas canvas)
并在那里处理您的绘图操作。
public class Arrow implements Paintable {
//all sorts of cool shit here to define your arrow
@Override
public void paint(Canvas canvas) {
//draw your arrow on the canvas here
}
}
在自定义Paintable
中维护ImageView
个对象的列表,只需为列表中的每个对象调用paint()
方法即可。 Yay for polymorphism!
public class Screen extends ImageView {
List<Paintable> paintableObjects;
public Screen(Context context) {
super(context);
paint.setColor(Color.BLACK);
paint.setStyle(Style.STROKE);
paintableObjects = new ArrayList<Paintable>();
}
public void addPaintable(Paintable p) {
paintableObjects.add(p);
}
public void onDraw(Canvas canvas) {
for(Paintable p : paintableObjects) {
p.paint(canvas);
}
}
}
答案 1 :(得分:1)
扩展Canvas
是错误的方法,因为您获得了必须使用的系统提供的画布。您无法强制Android使用Canvas
的子类。相反,只要需要,您就可以将Canvas
传递给您的班级。
public class DrawObject {
Paint paint = new Paint();
public void setColor(int color) {
paint.setColor(color);
}
// I want to draw an arrow to instead of a line
public void drawArrow(Canvas canvas, float startPointX, float startPointY, float endPointX, float endPointY) {
canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);
// draw the rest of the arrow here
}
}
并使用
public void onDraw(Canvas canvas){
drawObject.drawArrow(canvas, 10,10,100,100);
// I want to draw the arrow here but it is not working.
}
答案 2 :(得分:0)
我真的没有看到扩展Canvas
并定义你自己的对象的原因,除非你需要对它进行一些特殊的控制。
通常您会延伸View
并通过onDraw()
对象执行Canvas
方法中的所有绘图内容,例如:
public void onDraw(Canvas canvas){
canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}
答案 3 :(得分:0)
这个位错了
public void onDraw(DrawObject drawObject){ ... }
onDarw是一个框架工作方法,所以你更改方法签名这个方法不会被调用。
没有必要将canvas子类化 - 它不是正确的方法。
所以在你的屏幕类中 - 覆盖标准的onDraw方法:
public void onDraw(Canvas c){
drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}
以编程方式触发onDraw方法 - 在Screen对象上调用invalidate()。