在将背景图像设置为Android视图(API 22)的过程中,我遇到了一些问题。
我的图片是1MB .jpeg文件,4000x2672。
起初我尝试通过
PRODUCT
方法,获取 D / skia:---分配位图 错误的分配失败。
然后我跟着http://developer.android.com/training/displaying-bitmaps/load-bitmap.html并按如下方式实施:
BitmapDecoder.java
android:background="@drawable/your_image"
}
SplasActivity.java(主要活动)
(..omissis..)
public class BitmapDecoder {
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
我正在获取设备屏幕的WxH,将Drawable资源的大小调整为该大小,将生成的Bitmap转换为Drawable,将Drawable设置为View背景。
但我总是得到
D / skia:---为缩放位图分配失败
...
java.lang.OutOfMemoryError:无法分配带有16777120个空闲字节的684032012字节分配和直到OOM的227MB
错误。
我现在一直在寻找几个小时并且没有运气实施所有建议的技术。
作为旁注,如果我将宽度和高度设置为非常小的值(例如400x200),则可行。但是,正如您可能想象的那样,这是不可行的。
关于如何解决的任何想法?
答案 0 :(得分:3)
根据您的号码判断您将jpeg放在res/drawable
文件夹中与res/drawable-mdpi
相同,解决方法是将其放入res/drawable-nodpi
文件夹
答案 1 :(得分:0)
我认为问题在于您以压缩的jpeg格式(1MB)评估图像大小,但是当您加载它并操作到您的软件时,它将以其位图形式解压缩。
正如您提到的链接中所述: “......较低分辨率的版本应该与显示它的UI组件的大小相匹配。具有更高分辨率的图像不会提供任何明显的好处,但仍会占用宝贵的内存,并且由于额外的动态而导致额外的性能开销缩放。 ..“
您正在使用4000x2672 = 10688000像素的图像,并且每个像素需要多个字节来编码颜色,因此相当于684032012分配的字节。
我可以给出的唯一建议是评估您想要显示图像的大屏幕是什么,检查它的定义并重新缩放图像以便最多匹配该值。