1. ホーム
  2. android

[解決済み] アンドロイド、キャンバス。SurfaceViewの中にあるCanvas(=ビットマップ)をクリアする(内容を削除する)にはどうしたらいいですか?

2022-12-24 10:20:52

質問

簡単なゲームを作るために、このようなビットマップでキャンバスを描画するテンプレートを使いました。

private void doDraw(Canvas canvas) {
    for (int i=0;i<8;i++)
        for (int j=0;j<9;j++)
            for (int k=0;k<7;k++)   {
    canvas.drawBitmap(mBits[allBits[i][j][k]], i*50 -k*7, j*50 -k*7, null); } }

(キャンバスは "run()" で定義され、SurfaceView は GameThread に住んでいます)。

私の最初の質問は、どのようにして 全体 をクリア(または再描画)するにはどうしたらよいでしょうか。

次に、画面の一部だけを更新するにはどうしたらよいでしょうか。



// This is the routine that calls "doDraw":
public void run() {
    while (mRun) {
        Canvas c = null;
        try {
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder) {
                if (mMode == STATE_RUNNING) 
                    updateGame();
                doDraw(c);          }
        } finally {
            if (c != null) {
                mSurfaceHolder.unlockCanvasAndPost(c);  }   }   }       }

どのように解決するのですか?

<ブロッククオート

新しいレイアウトのためにキャンバス全体をクリア (または再描画) するにはどうすればよいですか (= ゲームで試してみる)?

次のように呼び出すだけです。 Canvas.drawColor(Color.BLACK) をクリアするために必要な色、または Canvas をクリアしたい色で。

<ブロッククオート

また、画面の一部だけを更新するにはどうすればよいのでしょうか?

Android OS は画面更新時にすべてのピクセルを再描画しているため、画面の一部だけを更新する方法はありません。しかし、古い描画をクリアしないまま Canvas の古い描画をクリアしていない場合、古い描画は表面に残っているため、画面の一部だけを更新する方法の1つであると思われます。

というわけで、画面の一部分だけを更新したい場合は Canvas.drawColor() メソッドを呼び出さないようにすればよいのです。