2010-12-14 9 views
3

ビットマップを特定のxとyオフセットで "シフト"したいと思います。シフトすると、300x500のビットマップがあり、-50オフセットでシフトすると、ビットマップの下部に沿って、すべてのピクセルが50ピクセル上に移動し、300x50ピクセルの四角形が空白になることが予想されます。 shiftXとshiftYが負の場合は下のコードが有効ですが、正の値ではうまくいきません。なぜ私は考えていない?Android:ビットマップをシフトする方法は?

Rect srcRect = new Rect(-shiftX, -shiftY, mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(shiftX, shiftY); 

Canvas bitmapCanvas = new Canvas(mBitmap); 
bitmapCanvas.drawBitmap(mBitmap, srcRect, destRect, null); 

私はこれの多くの異なるバージョンを試しました。ビットマップを正のyで変換しようとすると、常にゴミが生成されるようです。この簡単な例では、負のシフトYは予想される動作を示しますが、正のシフトYはガベージ結果を示します。

Canvas bitmapCanvas = new Canvas(mBitmap); 
bitmapCanvas.drawBitmap(mBitmap, 0, shiftY, null); 

*アップデート。これは以下のコードで解決されます。しかし、これはメモリ効率的ではありません。より良い解決策の提案はありますか?

Canvas bitmapCanvas = new Canvas(mBitmap); 
Bitmap tempBitmap = mBitmap.copy(CONFIG.ARGB_8888, false); 
bitmapCanvas.drawBitmap(tempBitmap, 0, shiftY, null); 
+0

は 'work'は正確に何を意味していないのですか?何を手に入れますか? – WarrenFaith

+0

は一見ゴミの結果をもたらします – ab11

+0

なぜ新しいキャンバスを作成しますか? – WarrenFaith

答えて

0

コードでこれを再現することはできません。 50と-50のオフセットで試してみましたが、どちらも期待どおりに動作します。

描画方法内部マイコード:

// negative value: -50 
Rect srcRect = new Rect(-(-50), -(-50), mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(-50, -50); 

canvas.drawBitmap(mBitmap, srcRect, destRect, null); 

または正と:

// positive value: 50 
Rect srcRect = new Rect(-50, -50, mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(50, 50); 

canvas.drawBitmap(mBitmap, srcRect, destRect, null); 
+0

正の値で描画するときに、ビットマップを既に初期化してコンテンツを持っていますか?私は、すでに書かれたピクセルを上書きしようとしていると思います。 – ab11

+0

rectを使ってdrawBitmapメソッドを呼び出すと、ビットマップからピクセルが読み込まれ、destRectに描画されるので、既に書き込まれたピクセルの問題は発生しません。もう少しコードを提供できますか? – WarrenFaith

+0

私はうまくいくソリューションで更新しました。このソリューションが機能するので、問題は、ビットマップに戻すときに、後で読み込む必要のあるピクセルを描画していることです。反対方向に描画すると問題になりません。私の解決策は悪いですが、メモリ使用量を2倍にする2番目のビットマップが作成されるためです。 – ab11

0

シンプルなソリューション...

canvas.translate(dx, dy); 

canvas.draw....();