質問

アニメーションを描こうとしています。そのために、View を拡張し、onDraw() メソッドをオーバーライドしました。私が期待しているのは、onDraw() が呼び出されるたびにキャンバスがそのままの状態になり、それをクリアするか、その一部を描画するだけかを選択できるということです (これは、SurfaceView を使用したときの動作です) )しかし、キャンバスが戻ってくるたびに、すでにクリアされています。クリアできない方法はないでしょうか?それとも、前の状態をビットマップに保存して、そのビットマップを描画して、その上に描画できるようにするのでしょうか?

役に立ちましたか?

解決

私は道かどうかがあるかどうかはわかりません。しかし、私のカスタムビューのために、私はどちらかのたびにonDraw()が呼び出されたすべてのものを再描画、またはビットマップに描画して、(あなたがあなたの質問で提案のように)キャンバスにビットマップを描画します。

ここで私はそれを行う方法

class A extends View {

    private Canvas canvas;
    private Bitmap bitmap;

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        if (bitmap != null) {
            bitmap .recycle();
        }
        canvas= new Canvas();
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvas.setBitmap(bitmap);
    }
    public void destroy() {
        if (bitmap != null) {
            bitmap.recycle();
        }
    }
    public void onDraw(Canvas c) {
      //draw onto the canvas if needed (maybe only the parts of animation that changed)
      canvas.drawRect(0,0,10,10,paint);

      //draw the bitmap to the real canvas c
      c.drawBitmap(bitmap, 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
          new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null);
    }
}

他のヒント

見てみるといいよ ここ Basic View と surfaceView の違いを確認します。surfaceView には描画専用のレイヤーがあり、以前に描画した内容を追跡していると思います。本当に基本的なビューでそれを実行したい場合は、次の例のように、描画した各項目を配列に入れてみることができます。 マップビューの項目別オーバーレイ。ほぼ同じように動作するはずです

あなたの期待は/現実wのジブはありません:)キャンバスは、あなたがそれを代わりに空白を残したが、道ではありません。あなたは)その後、OnDraw(でのArrayListものの反復、描画するオブジェクトのArrayListを作成します(canvas.drawCircleを()、canvas.drawBitmap()など)があります。私は、グラフィックスプログラミングに新しいですが、私は小さな規模で、これを使用しています。たぶんもっと良い方法があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top