14

私は昔ながらのライブラリ(allegro、GD、pygame)でグラフィックを処理するのに慣れています。ビットマップの一部を別のライブラリにコピーしたい場合は、blitを使用します。

私はアンドロイドでそれを行う方法を理解しようとしています、そして私は非常に混乱しました。つまり...書き込み専用のこれらのCanvasと、読み取り専用のビットマップがありますか?愚かすぎて本物ではないようです。何か足りないものがあるはずですが、本当に理解できません。

編集:より正確に言うと...ビットマップが読み取り専用で、キャンバスが書き込み専用の場合、AをBに、次にBをCにブリットすることはできませんか?

4

2 に答える 2

18

あるビットマップを別のビットマップにコピーするコードは次のようになります。

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を常に入手できます。

于 2010-04-21T13:41:36.537 に答える
-1

Androidでは、キャンバスに描画します。更新する場合は、invalidateを呼び出します。これにより、このキャンバスが画面に再描画されます。したがって、ビューのonDrawメソッドをオーバーライドしたと思いますので、invalidate();を追加するだけです。

@Override
public void onDraw(Canvas canvas) {
    // Draw a bitmap to the canvas at 0,0
    canvas.drawBitmap(mBitmap, 0, 0, null);
    // Add in your drawing functions here
    super.onDraw(canvas);
    // Call invalidate to draw to screen
    invalidate();
}

上記のコードは、ビットマップを常に再描画するだけです。もちろん、描画するものを追加して、invalidateを呼び出すタイミング関数を使用して、常に実行されないようにすることを検討してください。月着陸船の情報源を見てみることをお勧めします。

于 2010-04-21T13:27:20.887 に答える