我已经被这个问题困扰了一段时间了
谷歌搜索后没有找到太多有用的信息,我来到这里寻求帮助
假设我有一个图像(分辨率100px * 100px),然后将其设置为ImageView(w * h 100dp * 100dp)。
如果设备类型是hdpi,当我将图像放入drawable,drawable-hdpi,drawable-mdpi,drawable-xhdpi,drawable-nohpi文件夹时,会花多少内存?
我们可以依靠一条规则来获得结果吗?
多谢你们。
答案 0 :(得分:2)
Drawable类是所有类图形的基类。这是画布Canvas上主题的一般抽象。所以你可以从中创建Bitmap。
首先,它取决于配置设置为位图。你可以计算出来:
/**
* A helper function to return the byte usage per pixel of a bitmap based on its configuration.
*/
static int getBytesPerPixel(Config config) {
if (config == Config.ARGB_8888) {
return 4;
} else if (config == Config.RGB_565) {
return 2;
} else if (config == Config.ARGB_4444) {
return 2;
} else if (config == Config.ALPHA_8) {
return 1;
}
return 1;
}
因此,您可以计算将为此对象分配的字节数:
getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)
int count = pixels.length;
long allBytes = getBytesPerPixel(config)*count; // your memory allocation
二次。你需要了解一个hdpi,xhdpi,mdpi等。概念
假设你有一个小屏幕。 320x240px
通常,具有此屏幕分辨率的设备也具有低内存。所以你需要理解 - 小屏幕上的大图是OutOfMemoryError的正确方法。
答案 1 :(得分:1)
消耗的资源量取决于两件事:
如果你有一个 ldpi 设备,而你只提供一个 xxxhdpi 资源,android只会保留一个缩小的( subsampled )位图存储器中。
这是什么意思?这意味着,android在内存中加载最接近的更高密度资源(如果可用)并使用它。因此,如果您没有提供靠近设备的密度,那么您将浪费CPU (缩小位图,这是一项非常昂贵的操作)。 Android足够好,只会在内存中保留所需的大小。
但是,如果您将drawable加载为位图(而不是像setBackground()
这样的本机方法),它将加载整个图像,在内存中,而不是缩小版本。这会炸掉你的记忆。
此外,缩小和扩展可能会导致工件产生伪影,因此这也是获得多个drawable的另一个原因。
<强>规则强>?如果您要定位低端设备,请确保始终提供目标密度可绘制内容。
在Android内的位图内存管理中阅读此excellent article。