0

我正在尝试创建一个可以在我想在我的类的 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

4 回答 4

2

我实际上会按照以下方式做一些事情:

为可绘制对象定义一个接口(为了避免与 AndroidDrawable类混淆,我称之为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在您的 custom 中维护一个对象列表ImageView,并简单地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);
        }
    }
}
于 2012-08-24T14:50:05.540 回答
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.
}
于 2012-08-24T14:29:58.710 回答
0

我真的不明白扩展Canvas和定义你自己的对象的原因,除非你需要对它有一些特殊的控制。

通常,您通过对象扩展View并执行方法中的所有绘图工作,例如:onDraw()Canvas

public void onDraw(Canvas canvas){

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

}
于 2012-08-24T14:29:49.507 回答
0

这一点是错误的

public void onDraw(DrawObject drawObject){ ... }

onDarw 是一个框架方法,因此当您更改方法签名时,将不会调用此方法。

没有必要对画布进行子类化——这不是正确的方法。

所以在你的 Screen 类中 - 覆盖标准的 onDraw 方法:

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

以编程方式触发 onDraw 方法 - 在 Screen 对象上调用 invalidate()。

于 2012-08-24T14:31:22.773 回答