我正在制作1.6的应用程序,我遇到了android图像缩放的问题,我的图片是480x295。
在中等屏幕上,这显示正确,但在大屏幕(480x800或480x854)上它没有填满屏幕,它使得图像大1.5倍,仅为720x442。
由于800实际上是1.67而854是1.78,我显然可以只为drawable-hdpi文件夹包含大图像,但是图像已经是1.5mb,这比人们想象的要大,而且我不能使用app2sd因为我想支持1.6。
有什么建议吗?
我只能想到三个选择: 1)包括较大的图像(但这可能会限制销售,显然会增加apk尺寸)
2)制作2个版本,似乎是一个很好的解决方案,更难实现。
3)更改为1.5,并自行处理所有缩放。
编辑: 更多细节: 我正在使用画布和surfaceview绘图 图片加载代码:
backgroundBMP = BitmapFactory.decodeResource(getResources(), R.drawable.background, null);
绘图代码:
canvas.drawBitmap(backgroundBMP, 0, 0, null);
答案 0 :(得分:5)
如果您想自己缩放图像,请将一个副本放入:
res/drawable-nodpi
确保资源不在其他文件夹中。
像这样加载位图:
Bitmap bitmap = BitmapFactory.decodeResource(
context.getResources(),
R.drawable.my_image
);
像这样调整大小:
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
然后将它画到画布上:
canvas.drawBitmap(bitmap, 0, 0, null);
这是你完成工作所需要知道的最少的事情。
附加说明
通常情况下,Android会根据当前的屏幕密度从其中一个res / drawable文件夹中选择您的图像。
大多数图片格式没有密度信息,因此Android根据加载的文件夹对位图的密度进行假设。
这意味着它可以自己进行缩放以匹配加载的位图的密度和画布密度。
Android会在您加载位图时检查并匹配密度,并在绘制位图时再次 。
当您进行自己的扩展时,通常希望防止操作系统干扰。有几种方法可以做到:
<强> 1。使用res / drawable-nodpi
这是我在上面的快速示例中概述的策略。如果您想将图像打包为资源,并且仍然自己控制缩放,请将其放在此处,并且只在此处:
res/drawable-nodpi
如果您需要支持Cupcake,请在每个文件夹中复制一份:
res/drawable-nodpi-v4
res/drawable
解码器会自动提供防止缩放的选项。 Android然后将图像密度设置为与屏幕匹配,因此在绘制时也不会缩放。 The compiler will apply lossless compression to images placed in res/drawable-xxx folders。
<强> 2。使用res / raw
如果您将图像放入,则可以使图像保持不变:
res/raw
但是你需要注意防止在运行时缩放:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false; // Prevents scaling at decode time.
Bitmap bitmap = BitmapFactory.decodeResource(
context.getResources(),
R.raw.my_image,
options
);
bitmap.setDensity(Bitmap.DENSITY_NONE); // Prevents scaling at draw time.
第3。使用资产文件夹
如果您将图片放在资源文件夹中,而不是 res ,则可以使用真实的文件夹结构来整理它们。像这样加载位图资源:
Bitmap bitmap = BitmapFactory.decodeStream(
context.getAssets().open(
"myfolder/my_image.png",
AssetManager.ACCESS_BUFFER
)
);
编译器不会触摸它,它会在没有缩放的情况下加载,并且它的密度设置为与屏幕匹配,因此在绘制它时也不会缩放。
(性能注意:在Android加载图片之前,必须找到该文件。A resource is faster to locate than an asset,因此如果将图片打包为资源,可能会有一些性能损失。)
答案 1 :(得分:3)
如果您想缩放Bitmap
,可以在canvas.scale(scaleX, scaleY);
之前使用canvas.drawBitmap()
进行缩放。您可以计算宽高比并将其用作比例值。
要添加的一件重要事情是,您可以使用<uses-sdk android:minSdkVersion="3" />
使用“移至SD卡”功能,并且仍支持minSdkVersion
指定的较低Android版本。
答案 2 :(得分:2)
像Viktor建议的那样,你可以做一个Canvas.scale()。您还可以使用BitmapDrawable(设置为View的背景)绘制位图,并为您完成缩放。