如何在画布上绘制经过缩放的位图?

19
以下代码定义了我的 Bitmap:
Resources res = context.getResources();

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

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

以下代码用于执行/绘制它(未进行缩放的位图):

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

我的问题是,如何将其设置为绘制以 Bitmap scaled 形式返回的缩放位图,而不是原始位图?

2个回答

36

定义一个新的类成员变量:Bitmap mScaledBackground; 然后,将你新创建的缩放位图分配给它:mScaledBackground = scaled; 最后,在你的绘制方法中调用:canvas.drawBitmap(mScaledBackground, 0, 0, null);

请注意,按照你在上面代码片段中所做的方式硬编码屏幕尺寸并不是一个好主意。更好的做法是以以下方式获取设备屏幕尺寸:

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

最好不要为了以缩放的方式绘制原始背景而声明一个新位图。位图会消耗大量宝贵的资源,通常手机在加载几MB的位图后就会优雅地失败。相反,你可以这样做:

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

1
你的答案对我有用,但是在参数中减去宽度和高度1会在显示的位图右侧和底部显示一条线(来自另一个位图的背景),去掉-1就可以正常工作。 - akshay7692
1
我知道这是一个较旧的帖子了。但对于Android 7.0+,当处于分屏模式时,您可能无法依赖完整的显示宽度/高度。因此,对于任何使用此解决方案的人,您应该记住这一点。 - MCLLC
这种方式会使位图绘制变得很慢吗? - Amos

0
为了绘制缩放的位图,您需要将缩放的位图保存在某个字段中(这里称为 mScaled),然后调用:
canvas.drawBitmap(mScaled, 0, 0, null);

在你的绘制方法中(或者无论你现在在哪里调用它)。


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