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

时间:2011-02-11 10:02:26

标签: android bitmap

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

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

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

然后我以相同的方式加载位图'tile'(128x128)。

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

1)使用画布......

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

这会使得瓷砖太大(不是全尺寸,不是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,并将这些选项传递给后台和tile的decodeResource调用。这与#3完全相同(抛出异常)。

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

希望有人这样做会看到这个请求! 谢谢,杰森

2 个答案:

答案 0 :(得分:0)

看起来你的位图的密度不同......有a similar issue here。您应该检查加载的每个位图的密度,看是否是同样的问题。

答案 1 :(得分:0)

Canvas.drawBitmap()不执行扩展afaik。

由于您的磁贴图像最初是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中。