Android:在另一个位图上绘制多个位图

标签 android bitmap

我正在尝试从多个较小的位图合成背景位图。我将 Eclipse 与 Android SDK 结合使用。

我加载了一个(大部分)空白背景位图(像素尺寸为 320x480),如下所示:

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

然后我以相同的方式加载位图“平铺”(128x128)。

我尝试了多种方法将图 block 绘制到位图上,但每一种方法都无法按照我希望/期望的方式工作。我想在背景位图上的特定位置(像素偏移)绘制缩小到 64x64 的图 block 位图。

1) 使用 Canvas ...

Canvas c = new Canvas( mBackground );
c.drawBitmap( mTile, null, new Rect( 10, 10, 73, 73 ), null );

这绘制的图 block 太大了(不是全尺寸,不是 64x64,而是介于两者之间,大约是原始尺寸的 66%)

2)使用drawables(基本上看起来是一样的):

Canvas c = new Canvas( mBackground );
c.translate( 10, 10 );
d.setBounds( 0, 0, 63, 63 );
d.draw( c );

与实验 #1 相同的结果...

文档在许多地方提到(没有任何地方的简明解释)这与设备无关的“密度”有关,因此我尝试了下一种方法......

3) 使用固定规模的资源。我创建了/res/drawable-nodpi(我也试过/res/drawable)文件夹并将我的资源(背景和平铺 png 图像)移动到其中。从背景位图创建 Canvas 时会导致异常,因为未缩放的位图显然变得不可变,因此无法分配给 Canvas !

4) 我尝试使用 BitmapFactory.Options 并将 inScaled 设置为 false,并将这些选项传递给背景和图 block 的 decodeResource 调用。这与 #3(抛出异常)具有完全相同的效果。

没有任何效果,它变得非常令人沮丧。当涉及到不同的坐标空间时,我确信我只是遗漏了一些位图特有的细节,但我无法在文档或其他地方的任何地方找到它(我已经尝试了多个 android 开发网站无济于事)。

希望做过这件事的人能看到这个请求! 谢谢,杰森

最佳答案

Canvas.drawBitmap() 不执行缩放 afaik。

由于您的图 block 图像最初是 128x128,而您想以 64x64 的分辨率绘制它,最简单的技巧是调用 decodeResource() 并选择缩小它的尺寸:

BitmapFactory.Options options = new BitmapFactory.Options()
options.inSampleSize = 2; // downscale by 50%
Bitmap mTile = BitmapFactory.decodeResource( res, R.drawable.tile, options );

要进行更强大的缩放(例如以任意大小绘制图像),您应该将其包装在 BitmapDrawable 中.

关于Android:在另一个位图上绘制多个位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967708/

相关文章:

java - 无法通过 Crashlytics 启动 Activity ComponentInfo{..} : java. lang.NullPointerException。无法重现

android - Phonegap 中的其他 Maps API?

android - OpenInputStream 返回文件未找到异常但文件在那里

android - 将位图放入包中

Android位图对比实现

android - 无法从主 Activity 中的 onActivityResult 方法启动新 Activity

Android 如何保存位图 - 错误代码

java - 就地复制位图会泄漏内存吗?

python - 从库 Python Kivy for Android 中选择图像

java - Android 选择文件 Intent