キャンバスに描画可能な画像


回答:


176

キャンバス上にDrawableを描画する良い方法は、それを自分でデコードするのではなく、システムに任せることです。

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

これは、ビットマップだけでなく、あらゆる種類のドローアブルで機能します。また、サイズが変更された場合にのみ、同じドローアブルを再利用できることも意味します。


canvasアプローチを使用してアニメーションにアニメーションリスト(複数のフレーム)をどのように使用しますか?
RichieHH 2014

1
非常に便利!少なくとも、ロケットサイエンスを使用せずに背景画像だけが必要な場合は!
2015年

@RichieHH私は、SurfaceView(おそらく無駄)に私の背景を持ち、その表面ビューはFramelayoutに埋め込まれており、そのframelayoutには、私がアニメーション化するImageViewsが含まれています。
AgentKnopf 2015

4
getDrawable(id)は非推奨になりました。上記のContextCompat呼び出し、またはgetDrawable(id、theme)呼び出しを使用する必要があります。 developer.android.com/reference/android/content/res/...
wblaschko

@Saveen:よろしいですか?私が覚えている限り、これはAndroidの初期のバージョンで動作するはずです。
ガーボル

38

画像をビットマップとしてロードする必要があります:

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

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

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

その後、キャンバスに描画できます。


.pngが大きく、ロード後に切り取られた場合はどうなりますか?つまり、私はそれをトリミングしたくありません。画面よりも大きくなる可能性があるので、ズームや移動ができるようにします。どうすればよいですか?どうもありがとうございました!
Sibbsギャンブル2013

1
@ perfectionm1ngはBitmapRegionDecoderを使用して見てください。大きな画像を部分的に読み込むことができます。したがって、現時点でレンダリングしている画像の一部のみをロードできるはずです。
Konstantin Burov 2013

私はコードCanvas cs = new Canvas(bitmap);を使用しているのと同じ問題があります。リソースres = getResources(); Bitmap bitmapx = BitmapFactory.decodeResource(res、R.drawable.overlay_good_full); Bitmap 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); }
Ahmad Arslan

新しいキャンバスオブジェクトを作成するには、onDrawのキャンバスにどのように描画しますか?
Siddarth G

13

また、この方法で使用できます。それはあなたのキャンバスにあなたの大きなドローブルのフィットを変えます:

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

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

@CrisicそれyourDrawableは整数だと思います。

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

gerResource()。getDrawable(id);を使用してDrawableを作成します。
Vikram 2016

getDrawable(id)は非推奨になりました。上記のContextCompat呼び出し、またはgetDrawable(id、theme)呼び出しを使用する必要があります。 developer.android.com/reference/android/content/res/...
wblaschko

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

тыписюнгорбатый。чтотакое左、上、右、下、надоуказывать?
Dyno Cris

8

これを試して

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);

        }

しかし、canvas.drawBitmap(mBitmap、0、0、mBitmapPaint);を使用した場合、それが動作し、それがキャンバスに保存された画像をロードしますが、同じ時間アンドゥやリドゥ停止作業で、私のコードのチェックpastebin.com/cP9w6stm
AndroidDev

2
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);

    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.