あるビットマップを別のビットマップにコピーするコードは次のようになります。
Rect src = new Rect(0, 0, 50, 50);
Rect dst = new Rect(50, 50, 200, 200);
canvas.drawBitmap(originalBitmap, src, dst, null);
これは、ビットマップの左上隅(50x50)をコピーし、それを150x150ビットマップに拡大して、キャンバスの左上隅から50pxオフセットして書き込むことを指定します。
invalidate()を使用して描画をトリガーできますが、アニメーションを実行している場合は、SurfaceViewを使用することをお勧めします。invalidateの問題は、スレッドがアイドル状態になると描画されるだけなので、ループで使用することはできません。最後のフレームのみを描画します。グラフィックについて私が答えた他の質問へのいくつかのリンクがあります、それらは私が何を意味するかを説明するのに役立つかもしれません。
コメントに応えて、ここに詳細情報があります。SurfaceHolder.lockCanvas()からCanvasを取得した場合、そこにあった残りのデータをビットマップにコピーすることはできないと思います。しかし、それはそのコントロールの目的ではありません。すべてを整理して描画する準備ができたときよりも、使用するだけです。
あなたがしたいのは、を使用してビットマップに描画するキャンバスを作成することです
Canvas canvas = new Canvas(yourBitmap)
その後、必要な変換と描画操作を行うことができます。yourBitmapにはすべての最新情報が含まれます。次に、次のようにサーフェスホルダーを使用します。
Canvas someOtherCanvas = surfaceHolder.lockCanvas()
someOtherCanvas.drawBitmap(yourBitmap, ....)
そうすれば、保存しようとしている情報が含まれているyourBitmapを常に入手できます。