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

时间:2012-08-24 14:24:07

标签: 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 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.
}

有人可以告诉我这样做的正确方法是什么?感谢。

4 个答案:

答案 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()。