0

我正在为 1.6 制作一个应用程序,但我遇到了 android 图像缩放问题,我有一张 480x295 的图片。

在中等屏幕上,这显示正确,但在大屏幕(480x800 或 480x854)上,它不会填满屏幕,android 将图像放大 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);
4

3 回答 3

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 然后将图像密度设置为与屏幕匹配,因此在您绘制时它也不会缩放。编译器将对放置在 res/drawable-xxx 文件夹中的图像应用无损压缩

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.使用资产文件夹

如果将图像放在assets文件夹中,而不是res中,则可以使用真实的文件夹结构来组织它们。像这样加载位图资源:

Bitmap bitmap = BitmapFactory.decodeStream(

                    context.getAssets().open(

                        "myfolder/my_image.png",

                        AssetManager.ACCESS_BUFFER
                    )
                );

编译器不会触摸它,它会在没有缩放的情况下加载,并且它的密度设置为与屏幕匹配,所以当你绘制它时它也不会被缩放。

(性能说明:在 Android 加载图像之前,它必须定位文件。资源比资产更快地定位,因此如果将图像打包为资产,可能会有一些性能损失。)

于 2011-03-08T10:52:29.153 回答
3

如果你想扩展你的Bitmap,你可以通过使用canvas.scale(scaleX, scaleY);before来做到这一点canvas.drawBitmap()。您可以计算纵横比并将其用作比例值。

要添加的一件重要事情是,您可以使用“移动到 SD 卡”功能,<uses-sdk android:minSdkVersion="3" />并且仍然支持由minSdkVersion.

于 2011-02-26T11:51:52.513 回答
2

就像 Viktor 建议的那样,你可以做一个 Canvas.scale()。您还可以使用 BitmapDrawable (设置为视图的背景)绘制位图,并且将为您完成缩放。

于 2011-02-26T11:54:22.583 回答