19

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

4

3 に答える 3

28

方法があるかどうかはわかりません。しかし、私のカスタムビューでは、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);
    }
}
于 2010-03-11T15:30:24.190 に答える
1

基本ビューとsurfaceViewの違いを確認するには、ここを参照してください。surfaceViewには、描画専用のレイヤーがあります。これは、以前に描画したものを追跡していると思います。これで、本当に基本的なビューでそれを実行したい場合は、マップビューのアイテム化されたオーバーレイの例のように、描画する各アイテムを配列に配置してみることができます。ほぼ同じように機能するはずです

于 2010-03-11T07:57:07.507 に答える
0

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

于 2010-03-31T20:11:34.403 に答える