1

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

由于资源与屏幕大小相同,我不确定它为什么会增加背景资源的大小。它将它缩放到 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;

}

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

4

1 回答 1

1

您的资源在哪个可绘制文件夹中?听起来您将图像资源放入密度过低的存储桶中。因为您的错误尺寸恰好是您所需尺寸的 1.5 倍。

例如,如果您只将 854 x 480 的图像资源放在 drawable-hdpi 中,它会在 xhdpi 设备上以 1281 x 720 的分辨率呈现它。即 Android 会将您的图像放大 1.5 秒。这是正确的行为。您告诉 Android 您的图像将在 hdpi 设备上绘制为 480 像素宽。但是现在你正在查看一个更密集的屏幕,更多的像素来绘制相同的图像,所以它应该在 1.5 倍密集的设备上以 720 像素的宽度绘制。

如果您将图像放在更高密度的桶中,您应该有正确的行为。

正确的方法是为每个存储桶提供一个图像。

一般来说,通过不同的 drawable-*dpi 存储桶以及“dip”或与密度无关的像素的概念,了解 Android 如何针对不同的密度显示器进行显示是很好的。

请参阅这些文档以支持不同的屏幕。

于 2013-07-15T04:16:30.683 回答