Java 如何创建可以在onDraw()方法上绘制的对象?

Java 如何创建可以在onDraw()方法上绘制的对象?,java,android,android-canvas,ondraw,Java,Android,Android Canvas,Ondraw,我试图创建一个对象,每当我想在我的类的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 o

我试图创建一个对象,每当我想在我的类的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.
}

有人能告诉我什么是正确的方法吗?谢谢。

我真的不明白为什么要扩展
画布并定义自己的对象,除非您需要对其进行特殊控制

通常,通过
Canvas
对象扩展
View
并在
onDraw()
方法中完成所有绘图工作,例如:

public void onDraw(Canvas canvas){

   canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);

}

我真的不明白为什么要扩展
画布并定义自己的对象,除非您需要对其进行特殊控制

通常,通过
Canvas
对象扩展
View
并在
onDraw()
方法中完成所有绘图工作,例如:

public void onDraw(Canvas canvas){

   canvas.drawLine(startPointX, startPointY, endPointX, endPointY, paint);

}

扩展
Canvas
是错误的方法,因为您必须使用系统提供的Canvas。你不能强迫Android使用你的
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.
}

扩展
Canvas
是错误的方法,因为您必须使用系统提供的Canvas。你不能强迫Android使用你的
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.
}
这一点是错误的

public void onDraw(DrawObject drawObject){ ... }
onDarw是一种框架方法,因此只要更改方法签名,该方法将不会被调用

不需要对canvas进行子类化-这不是正确的方法

因此,在Screen类中-重写标准onDraw方法:

public void onDraw(Canvas c){ 
   drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}
要以编程方式触发onDraw方法,请在Screen对象上调用invalidate()。

此位错误

public void onDraw(DrawObject drawObject){ ... }
onDarw是一种框架方法,因此只要更改方法签名,该方法将不会被调用

不需要对canvas进行子类化-这不是正确的方法

因此,在Screen类中-重写标准onDraw方法:

public void onDraw(Canvas c){ 
   drawLine(startPointX, startPointY, endPointX, endPointY, paint);
}

要以编程方式触发onDraw方法,请在Screen对象上调用invalidate()

为可绘制对象定义一个接口(为了避免与安卓
drawable
类混淆,我称之为
Paintable

制作需要以自定义方式绘制的任何类,如建议的箭头,实现
可绘制的
接口,覆盖
绘制(画布)
,并在那里处理绘制操作

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
    }
}
在自定义的
ImageView
中维护一个
Paintable
对象列表,只需为列表中的每个对象调用
paint()
方法即可。是的,多态性

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);
        }
    }
}
公共类屏幕扩展了ImageView{
列出可绘制的对象;
公共屏幕(上下文){
超级(上下文);
油漆。设置颜色(颜色。黑色);
油漆.设置样式(样式.笔划);
paintableObjects=newarraylist();
}
公共空间可添加可绘制(可绘制p){
可绘制对象。添加(p);
}
公共空白onDraw(画布){
用于(可绘制p:可绘制对象){
p、 油漆(帆布);
}
}
}

实际上,我会按照以下思路做一些事情:

为可绘制对象定义一个接口(为了避免与安卓
drawable
类混淆,我称之为
Paintable

制作需要以自定义方式绘制的任何类,如建议的箭头,实现
可绘制的
接口,覆盖
绘制(画布)
,并在那里处理绘制操作

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
    }
}
在自定义的
ImageView
中维护一个
Paintable
对象列表,只需为列表中的每个对象调用
paint()
方法即可。是的,多态性

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);
        }
    }
}
公共类屏幕扩展了ImageView{
列出可绘制的对象;
公共屏幕(上下文){
超级(上下文);
油漆。设置颜色(颜色。黑色);
油漆.设置样式(样式.笔划);
paintableObjects=newarraylist();
}
公共空间可添加可绘制(可绘制p){
可绘制对象。添加(p);
}
公共空白onDraw(画布){
用于(可绘制p:可绘制对象){
p、 油漆(帆布);
}
}
}