2011-03-03 30 views

答えて

7

あなたはビットマップとしてあなたのイメージをロードする必要があり、この

Bitmap mBitmap = Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter); 

protected void onDraw(Canvas canvas) { 
      canvas.drawColor(0xFFAAAAAA); 
      canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

     } 
+0

をしかし、私はcanvas.drawBitmap(mBitmap、0、0、mBitmapPaint)を使用する場合、それは動作し、キャンバスに保存されたイメージをロードしますが、同時にアンドゥとリドゥが機能しなくなります。コードを確認してください。http://pastebin.com/cP9w6stm – AndroidDev

35

を試してみてください。

Resources res = getResources(); 
Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.your_image); 

その後ビットマップが変更可能にし、その上にキャンバスを作成します。

Canvas canvas = new Canvas(bitmap.copy(Bitmap.Config.ARGB_8888, true)); 

あなたはその後、キャンバスに描画することができます。

+0

私の.pngが大きければ、読み込まれた後にカットされます?すなわち、私はドン; tはそれをトリミングしたい。それは画面よりも大きくなる可能性があります。次に、ズームと移動を可能にしようとします。どうすればいいですか?そんなにありがとう! –

+1

@perfectm1ng BitmapRegionDecoderを使って見てください。大きな画像の部分的な読み込みが可能です。したがって、現在レンダリングしているイメージの一部だけをロードすることができます。 –

+0

私は同じ問題を抱えています。コードを使用しています Canvas cs = new Canvas(ビットマップ); リソースres = getResources(); ビットマップbitmapx = BitmapFactory.decodeResource(res、R.drawable.overlay_good_full); ビットマップbitmapxx = BitmapFactory.decodeResource(res、R.drawable.overlay_bad_full); if(text.equals( "Good")) { cs.drawBitmap(bitmapx、0、0、tPaint); } else { cs.drawBitmap(bitmapxx、0、0、tPaint); } –

1
package com.android.jigsawtest; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class SurafaceClass extends SurfaceView implements 
     SurfaceHolder.Callback { 
    Bitmap mBitmap; 
Paint paint =new Paint(); 
    public SurafaceClass(Context context) { 
     super(context); 
     mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     canvas.drawBitmap(mBitmap, 0, 0, paint); 

    } 

} 
+2

onDrawで新しいペイントオブジェクトを作成すると、パフォーマンスが悪くなります –

+0

大丈夫です...回答が更新されました – user1140237

118

キャンバスにDrawableのを描画するための良い方法は、それを自分でデコードするが、そうするようにシステムにそれを残していない。

Drawable d = getResources().getDrawable(R.drawable.foobar); 
d.setBounds(left, top, right, bottom); 
d.draw(canvas); 

これはドロウアブルのすべての種類だけではないビットマップで動作します。また、サイズが変更された場合に限り、同じドロアブルを再利用することもできます。

+0

キャンバスアプローチでアニメーションリスト(複数フレーム)を使用するにはどうすればよいですか? – RichieHH

+0

非常に便利です!少なくともロケット科学が関与していない背景画像だけが必要な時は! – Asim

+0

@RichieHH私はSurfaceView(故意に廃棄物)に私のバックグラウンドを持っていて、そのサーフェイスビューはFramelayoutに埋め込まれていて、そのframelayoutにはアニメーション化されたImageViewsが含まれています。 – AgentKnopf

8

この方法でも使用できます。それはあなたのキャンバスにあなたの大きなdrawbleフィット変更されます。

Resources res = getResources(); 
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable); 
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint); 
+0

BitmapFactoryクラスにメソッド "BitmapFactory.decodeResource(Resource、Drawable);"がありません。... – Crisic

+0

@Crisic私は 'yourDrawable'が整数であると仮定します。 –

7
Drawable d = ContextCompat.getDrawable(context, R.drawable.***) 
d.setBounds(left, top, right, bottom); 
d.draw(canvas); 
+0

gerResource()。getDrawable(id);でDrawableを作成します。 – Vikram

+0

getDrawable(id)は推奨されなくなりました。上記のContextCompat呼び出しまたはgetDrawable(id、theme)呼び出しのいずれかを使用する必要があります。 https://developer.android.com/reference/android/content/res/Resources.html#getDrawable(int) – wblaschko

+0

私にとっては、 'setBounds'を使う必要がありました。それがなければ何も表示されませんでした。 –

関連する問題