gpt4 book ai didi

Android 位图缩放不正确

转载 作者:行者123 更新时间:2023-11-30 03:29:48 25 4
gpt4 key购买 nike

我有一个尺寸为 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;

}

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

最佳答案

您的资源位于哪个可绘制文件夹中?听起来好像您将图像资源放在密度太低的桶中。因为你错误的尺寸恰好是你想要的尺寸的 1.5 倍。

例如,如果您只将 854 x 480 图像资源放在 drawable-hdpi 中,它将在 1281 x 720 的 xhdpi 设备上渲染它。也就是说,Android 会将您的图像放大 1.5 秒。这是正确的行为。您告诉 Android 您的图像将在 hdpi 设备上绘制为 480px 宽。但现在您正在查看更密集的屏幕,更多像素来绘制相同的图像,因此它应该在密度高 1.5 倍的设备上以 720 像素的宽度绘制。

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

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

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

查看这些 docs on supporting different screens.

关于Android 位图缩放不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com