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

whhtz7ly  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(298)

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

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

qv7cva1a

qv7cva1a1#

我真的不明白延长期限的理由 Canvas 定义你自己的对象,除非你需要对它有特殊的控制。
通常情况下,你会延伸 View 在教室里画所有的东西 onDraw() 方法通过 Canvas 对象,例如:

public void onDraw(Canvas canvas){

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

}
dauxcl2d

dauxcl2d2#

这一点是错误的

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

ondarw是一个框架方法,因此只要更改方法签名,就不会调用此方法。
没有必要将canvas子类化-这不是正确的方法。
因此,在screen类中-重写标准ondraw方法:

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

要以编程方式触发ondraw mthod,请在screen对象上调用invalidate()。

iyr7buue

iyr7buue3#

我会按照这些思路做一些事情:
为可绘制对象定义一个接口(以避免与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() 方法。太棒了!

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);
        }
    }
}
cyvaqqii

cyvaqqii4#

延伸 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.
}

相关问题