在画布上绘制可绘制图像

115

如何将图像放置到画布上以便在该图像上进行绘制?

7个回答

207

在画布上绘制Drawable的好方法不是自己解码,而是让系统来完成:

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

这将适用于所有类型的drawable,不仅限于位图。这还意味着,如果只有大小发生变化,您也可以再次重复使用相同的drawable。


如何使用动画列表(多帧)来实现画布动画? - RichieHH
1
非常有用!至少在你只需要一个不涉及火箭科学的背景图片时是这样的! - Asim
@RichieHH 我的背景是在一个SurfaceView上(可能有些浪费),而这个SurfaceView被嵌入到一个Framelayout中,而这个Framelayout包含了ImageViews,我随后对它们进行动画处理 - 也许这对你来说是一个选项? - AgentKnopf
4
getDrawable(id)方法已经被弃用,你应该使用上面提到的ContextCompat调用或getDrawable(id, theme)调用。 - wblaschko
@Saveen:你确定吗?据我所记,这应该可以在 Android 的早期版本中运行。 - Gábor
setBounds(0, 0, width, height) - vrgrg

40
你需要将图像以位图的形式加载:

您需要将图像作为位图加载:

 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 Gambling
1
@perfectionm1ng 可以考虑使用BitmapRegionDecoder。它允许对大图像进行部分加载。因此,您应该能够仅加载您正在渲染的图像部分。 - Konstantin Burov
我有同样的问题,我正在使用以下代码: Canvas cs = new Canvas(bitmap); Resources 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

16

你也可以使用这种方法。它将使您的大绘图适应您的画布:

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

BitmapFactory类没有方法"BitmapFactory.decodeResource(Resource, Drawable);"... - Crisic
@Crisic 我会认为 yourDrawable 是一个整数。 - user6754053

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

我使用getResource().getDrawable(id)创建可绘制对象。 - Vikram
getDrawable(id) 方法已被弃用,您应该使用上面的 ContextCompat 调用或者 getDrawable(id, theme) 调用。 https://developer.android.com/reference/android/content/res/Resources.html#getDrawable(int) - wblaschko
1
对我来说,使用 setBounds 是必要的。如果没有它,什么都不会显示出来。 - user6754053

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);它可以工作并在画布上加载保存的图像,但与此同时撤消和重做停止工作,请检查我的代码http://pastebin.com/cP9w6stm。 - AndroidDev

3
为了保持矢量图的纵横比,我在Kotlin中进行了以下操作(代码如下):

val drawable = resources.getDrawable(R.drawable.my_vector, null)
val aspectRatio = drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight
val desiredWidthInPx = 100
val derivedHeightInPx = (desiredWidthInPx / aspectRatio).toInt()
drawable.setBounds(0, 0, desiredWidthInPx, derivedHeightInPx)
drawable.draw(canvas)

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

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接