Android图片缩放

Ray*_*ton 0 android image-scaling

我正在制作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);
Run Code Online (Sandbox Code Playgroud)

和绘图代码:

canvas.drawBitmap(backgroundBMP, 0, 0, null);
Run Code Online (Sandbox Code Playgroud)

Sha*_*ley 5

如果您想自己缩放图像,请将一个副本放入:

res/drawable-nodpi
Run Code Online (Sandbox Code Playgroud)

确保资源不在其他文件夹中.

像这样加载位图:

Bitmap bitmap = BitmapFactory.decodeResource(

                    context.getResources(),

                    R.drawable.my_image
                );
Run Code Online (Sandbox Code Playgroud)

像这样调整大小:

bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
Run Code Online (Sandbox Code Playgroud)

然后将它绘制到你的画布:

canvas.drawBitmap(bitmap, 0, 0, null);
Run Code Online (Sandbox Code Playgroud)

这是你完成工作所需要知道的最少的事情.

补充说明

通常,Android会根据当前屏幕密度从其中一个res/drawable文件夹中选择您的图像.

大多数图像格式没有密度信息,因此Android根据加载的文件夹对位图的密度进行假设.

这意味着它可以自己进行缩放以匹配加载的位图的密度和画布密度.

Android在加载位图时检查并匹配密度,并在绘制位图时再次检查和匹配密度.

当您进行自己的扩展时,通常希望防止操作系统干扰.有几种方法可以做到:

1.使用res/drawable-nodpi

这是我在上面的快速示例中概述的策略.如果您想将图像打包为资源,并且仍然自己控制缩放,请将其放在此处,并且仅在此处:

res/drawable-nodpi
Run Code Online (Sandbox Code Playgroud)

如果您需要支持Cupcake,请在每个文件夹中添加一份副本:

res/drawable-nodpi-v4    
res/drawable
Run Code Online (Sandbox Code Playgroud)

解码器自动提供防止缩放的选项.Android然后将图像密度设置为与屏幕匹配,因此在绘制时也不会缩放.编译器将对res/drawable-xxx文件夹中的图像应用无损压缩.

2.使用res/raw

如果将其放入以下位置,您可以保持编译器不受影响:

res/raw
Run Code Online (Sandbox Code Playgroud)

但是,您需要小心防止在运行时缩放:

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.
Run Code Online (Sandbox Code Playgroud)

3.使用assets文件夹

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

Bitmap bitmap = BitmapFactory.decodeStream(

                    context.getAssets().open(

                        "myfolder/my_image.png",

                        AssetManager.ACCESS_BUFFER
                    )
                );
Run Code Online (Sandbox Code Playgroud)

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

(性能注意:在Android加载图像之前,它必须找到文件.资源的定位速度比资产更快,因此如果将图像打包为资产,可能会有一些性能损失.)