2012-05-02 7 views
10

次のコードは、私のビットマップを定義していますスケーリングされたビットマップをキャンバスに描画しますか?

Resources res = context.getResources(); 

    mBackground = BitmapFactory.decodeResource(res, 
      R.drawable.bg2); 

    //scale bitmap 
    int h = 800; // height in pixels 
    int w = 480; // width in pixels  
    Bitmap scaled = Bitmap.createScaledBitmap(mBackground, w, h, true); // Make sure w and h are in the correct order 

...そして、次のコードは、それ(スケーリングされていないビットマップ)を描画/実行するために使用されます。

c.drawBitmap(mBackground, 0, 0, null); 

私の質問はどのように私かもしれない、あります"Bitmap scaled"の形式で返されたスケーリングされたビットマップを描画するように設定します。

答えて

25

新しいクラスのメンバ変数を定義します、そして、 Bitmap mScaledBackground; をそれに新しく作成されたスケールビットマップに割り当てます。次に mScaledBackground = scaled; を、あなたのdrawメソッドで呼び出します。それは良いアイデアではないことを c.drawBitmap(mScaledBackground, 0, 0, null);

注意上のスニペットのやり方で画面サイズをハードコードすることができます。

int width = getWindowManager().getDefaultDisplay().getWidth(); 
int height = getWindowManager().getDefaultDisplay().getHeight(); 

そしてそれは、スケーリングされた方法であなたの元の背景を描画するだけの目的のために新しいビットマップを宣言するために、おそらくより良いではないだろう。より良い、次のようにお使いのデバイスの画面サイズを取得することです。ビットマップは大量の貴重なリソースを消費します。通常、携帯電話は、アプリケーションが異常に失敗する前に読み込める数MBのビットマップに制限されています。あなたがどこかのフィールドにあなたのスケールビットマップを保存する(ここではmScaledと呼ばれる)と呼んで欲しいスケールビットマップ描画するには

Rect src = new Rect(0,0,bitmap.getWidth()-1, bitmap.getHeight()-1); 
Rect dest = new Rect(0,0,width-1, height-1); 
c.drawBitmap(mBackground, src, dest, null); 
+1

あなたの答えは私のために働いていましたが、引数の幅と高さから1を引くと、表示されたビットマップの右と下に1行表示されました。 – akshay7692

+1

これは古い投稿です。しかし、Android 7.0以降の場合、分割画面モードではディスプレイの全幅/高さに頼ることができない場合があります。したがって、このソリューションを使用している人は、そのことを覚えておく必要があります。 – MCLLC

+0

この方法はビットマップを非常に遅く描くでしょうか? – Amos

2

:代わりに、このような何かを行うことができ、あなたのdrawメソッドで

c.drawBitmap(mScaled,0,0,null); 

を(あなたが今どこに電話しても)。

関連する問題