2011-02-26 148 views
0

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

在中画面上,它正确显示,但是在大屏幕上(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

你使用哪种scaleType? – 2011-02-26 11:42:16

+0

对不起,我将添加更多详细信息 – 2011-02-26 11:43:53

回答

3

如果你想扩展您的Bitmap你可以在canvas.drawBitmap()之前使用canvas.scale(scaleX, scaleY);来实现。您可以计算纵横比并将其用作比例值。

要添加的重要一点是,您可以使用<uses-sdk android:minSdkVersion="3" />的“移至SD卡”功能,并仍然支持较低的Android版本,由minSdkVersion指定。

+0

感谢Viktor,我以为它会限制应用程序。对于决定执行此操作的其他人,您需要将default.properties设置为android-8,将android:targetSdkVersion设置为8,并将android:installLocation =“auto”添加到清单文件的清单部分。 – 2011-02-26 16:01:38

2

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

+0

问题是我至少有50张需要缩放的图片,它是针对游戏的,而且android无法正确缩放。 – 2011-02-26 12:03:14

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 /可绘制文件夹的一个选择你的形象。

大多数图像格式都没有密度信息,所以Android根据从中加载的文件夹对位图密度进行了假设。

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

当您加载位图时,Android检查并匹配一次密度,并且当您绘制位图时,再次

当你正在做自己的缩放时,你通常希望防止OS干扰。有几种方法可以做到这一点:

1.使用RES /绘制-nodpi

这是我在简单的例子概括上面的策略。如果要打包你的形象作为一种资源,而且还控制自己的尺度,把它放在这里,而且只能在这里:

res/drawable-nodpi 

如果您需要支持蛋糕,放上一份副本中每个文件夹,而不是:

res/drawable-nodpi-v4  
res/drawable 

解码器会自动提供防止缩放的选项。然后,Android将图像密度设置为与屏幕相匹配,因此在绘制时也不会缩放。 The compiler will apply lossless compression to images placed in res/drawable-xxx folders

2.使用RES /生

您可以通过编译器,如果你把它留下图像不变:

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 
        ) 
       ); 

编译器不会去碰它,它加载不进行缩放,并且它的密度设置为屏幕匹配,所以当你要么绘制它不会缩放。

(PERFORMANCE注:Android的加载图像之前,它必须找到该文件A resource is faster to locate than an asset,所以有可能是,如果您打包图像作为资产之间存在一定的性能损失。)