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

私は実際にこれらの行に沿って何かをします:

ドローアブル オブジェクトのインターフェイスを定義します (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);
        }
    }
}
于 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 はフレームワーク メソッドであるため、メソッド シグネチャを変更すると、このメソッドは呼び出されません。

canvas をサブクラス化する必要はありません - それは正しいアプローチではありません。

あなたの Screen クラスでは、標準の onDraw メソッドをオーバーライドします。

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

プログラムで onDraw メソッドをトリガーするには、Screen オブジェクトで invalidate() を呼び出します。

于 2012-08-24T14:31:22.773 に答える