0

SurfaceView を試しています。私の要件は、最初にノード(シンプルなドローアブル)を単純にレンダリングすることです。その後、後でさらにノードをレンダリングします。

私のスレッドの run メソッドと doDraw メソッドのスニペットを以下に示します。両方を保持しながら、後続のパスで 2 つの異なるドローアブルをレンダリングしようとしています。問題は、最初のパスで書き込まれたものをすべて消去することです (コードのコメントを参照)。以前に描画されたオブジェクトを保持する方法は?

    public void run() {
        Canvas canvas;
        while (_running) {
            canvas = null;
            try {
                canvas = _surfaceHolder.lockCanvas(null);
                synchronized (_surfaceHolder) {
                    doDraw(canvas, isUpdate);
                }
            } finally {
                if (canvas != null) {
                    _surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }


    public void doDraw(Canvas canvas, boolean update){
        if(update){
            //goes here 2nd pass & wipes away things done in 1st pass
            //I want to retain whatever was drawn in 1st pass
            Bitmap thumb = BitmapFactory.decodeResource(getResources(),R.drawable.icon);
            //canvas.drawColor(Color.RED);
            canvas.drawBitmap(thumb, 0, 0, null);
        } else{
            //goes here 1st pass
            Bitmap thumb = BitmapFactory.decodeResource(getResources(), R.drawable.thumb);
            //canvas.drawColor(Color.BLACK);
            canvas.drawBitmap(thumb, 300, 300, null);
            this.isUpdate = true;
        }
    }

更新 1: まだ機能していないようです。実行コードを次のように変更しました。

     public void run() {
        Canvas canvas;
        while (_running) {
            canvas = null;
            try {
                Rect dty = null;
                if(isUpdate == true){
//--> In 2nd pass, I was hoping that only these co-ordinates will be updated
                    dty = new Rect(0,0,100,100);  
                    canvas = _surfaceHolder.lockCanvas(dty);
                }else{
                    canvas = _surfaceHolder.lockCanvas(null);
                }
                synchronized (_surfaceHolder) {
                    doDraw(canvas, isUpdate);
                }
            } finally {
                if (canvas != null) {
                    _surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }

後で、ダーティな四角形に 0,0,1,1 を渡そうとしました。まだ動作させることができませんでした...

4

2 に答える 2

0

SurfaceView は、ダブルまたはトリプル バッファリングされます。以前の内容は、システムが古いバッファをクリアするために邪魔にならないという意味で「保存」されますが、その動作に依存することはできません。

ダーティ rect を指定すると、フレームワークは要求されたものをレンダリングし、前のバッファから新しいバッファの上に非ダーティ領域をコピーします。

システムは、ダーティな四角形を拡張できます。渡した Rect はlockCanvas()更新される可能性があります。その中のすべてのピクセルを再描画する必要があります。

この動作の (やや目を見張るような) 例については、Grafika の「TextureView のシンプルなキャンバス」を参照してください

システムの仕組みの詳細については、この記事を参照してください。

于 2014-05-13T05:03:13.563 に答える