2013-07-15 61 views
1

我有一个尺寸为854 x 480(我的测试手机的确切屏幕分辨率)的背景资源。当我将这些资源加载到我的应用程序中时,它会按比例放大。我在这里搜索并尝试了一些建议,但出于某种疯狂的原因,它不会缩放到适当的尺寸。Android位图缩放不正确

由于资源与屏幕大小相同,我不确定为什么它会增加背景资源的大小。它扩展到1281 x 720,我不知道为什么。

那里发生转换的代码是:

public Sprite newSpriteLargeResource(Resources res, SpriteFormat format, 
     int resId, int reqWidth, int reqHeight) { 

    Options options = new Options(); 

    options.inJustDecodeBounds = true; 

    Bitmap bitmap = null; 

    options.inSampleSize = calculateSample(options, reqWidth, reqHeight); 
    options.inJustDecodeBounds = false; 

    bitmap = BitmapFactory.decodeResource(res, resId, options); 

    Matrix m = new Matrix(); 
    RectF inRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
    RectF outRect = new RectF(0, 0, reqWidth, reqHeight); 
    boolean scaled; 
    scaled = m.setRectToRect(inRect, outRect, Matrix.ScaleToFit.CENTER); 
    if (scaled) { 
     float[] bmpValues = new float[9]; 
     m.getValues(bmpValues); 
     Bitmap.createScaledBitmap(bitmap, 
       (int) ((bitmap.getWidth() * bmpValues[0])), 
       (int) ((bitmap.getHeight() * bmpValues[4])), true); 
    }else{ 
     Bitmap.createScaledBitmap(bitmap, reqWidth, reqHeight, true); 
    } 


    return new AndroidSprite(bitmap, format); 
} 

private int calculateSample(Options options, int reqWidth, int reqHeight) { 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 


     final int heightRatio = Math.round((float) height 
       /(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 


     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 

    return inSampleSize; 

} 

您可能会注意到缩放的多个版本。我保持这样的代码的唯一原因是为了表明我已经尝试了多个版本的缩放,并且它们都没有像我所希望的那样工作。我知道问题出在这两种方法的某处,因为我有另一种非背景资源的方法,它们工作正常。我使用这个的唯一原因是为了避免出现内存不足异常,需要较大的图像文件。

回答

1

什么可绘制文件夹是你的资源?听起来就像你把你的图像资源放在一个密度过低的密度桶中。因为你错误的尺寸正好是你想要的尺寸的1.5倍。例如,如果您只将854 x 480图像资源放在drawable-hdpi中,则它将在xhdpi设备上以1281 x 720的格式渲染它。即,Android会将您的图像缩放1.5s。这是正确的行为。您告诉Android,您的图像将在hdpi设备上以480px宽度绘制。但是现在你正在查看更密集的屏幕,更多的像素来绘制相同的图像,所以它应该在一个密度为1.5倍的设备上以720px宽度绘制。

如果您将图像置于更高密度的存储桶中,则应具有正确的行为。

执行此操作的正确方法是为每个存储桶提供一个映像。

在一般情况下,这是很好的了解Android版会显示不同密度的显示器,通过不同的drawable- * dpi的水桶,也“抄底”或密度无关的像素的概念。

看到这些docs on supporting different screens.

+0

不错。我把它放在drawable-nodpi中,它按预期工作。再次感谢! –