画布上的可绘制图像


Answers:


176

在画布上绘制Drawable的好方法不是自己对其进行解码,而是将其留给系统来进行:

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

这将适用于所有类型的可绘制对象,而不仅仅是位图。而且这还意味着,只要更改大小,您就可以再次使用同一可绘制对象。


如何使用画布方法将动画列表(多帧)用于动画?
RichieHH 2014年

1
很有用!至少当您只需要没有火箭科学的背景图片时!
2015年

@RichieHH我有SurfaceView的背景(可能是废物),并且该表面视图嵌入在Framelayout中,并且该framelayout包含ImageViews,然后我对其进行动画处理-也许这是您的选择?
AgentKnopf

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很大并且在加载后被剪切怎么办?即我不想把它裁剪掉。它可以大于屏幕,然后我将尝试使其可缩放和移动。我该怎么办?非常感谢!
西伯斯赌博

1
@ perfectionm1ng看看使用BitmapRegionDecoder。它允许部分加载大图像。因此,您现在应该只能加载要渲染的图像部分。
康斯坦丁·布罗夫

我在使用代码Canvas cs = new Canvas(bitmap);时遇到了同样的问题。资源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); }
Ahmad Arslan

如何在onDraw的画布上绘制新的canvas对象?
Siddarth G

13

您也可以使用这种方式。它将改变您的大画布在画布上的尺寸:

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

BitmapFactory类没有方法“ BitmapFactory.decodeResource(Resource,Drawable);” ...
2016年

@Crisic我认为这yourDrawable是一个整数。

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

我使用gerResource()。getDrawable(id)创建Drawable;
Vikram

不赞成使用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);

    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.