我正在尝试从多个较小的位图合成背景位图。我将 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/