我在我的应用中使用带有 png背景的按钮 for CopyToClipboard功能(在各种片段中使用了大约6-7次)。由于我的目的图像应该很小,我通过在图像周围加上额外透明区域来增加图像的区域,这样我就可以增加按钮可点击区域 的大小,但保持图像小(我知道它效率不高,从那以后我设计了更好的方法来实现这一目标。)
之后我注意到上传其他一些图像(大图像大约150kb)后的大量尖峰,经过大量调试(我的意思很多!)我发现问题不是由于更大图像,但由于CopyToClipboard图像只有8kb的大小!更改回较旧的CopyToClipboard图像(透明区域较小)会使内存消耗恢复正常。
我的问题是 为什么会发生 ?对于这样一个小图像来创建如此巨大的峰值(超过从之前的内存消耗增加一倍)并使应用程序变慢,这是非常莫名其妙。
如下图所示:白色区域是透明区域。我的按钮尺寸:15dp x 15dp。
我再说一遍,我的问题是 为什么会发生这种情况? 因为我已经解决了问题,所以不是解决方法。
答案 0 :(得分:1)
您的映像在磁盘上只有7-8KB并不重要,因为它在解码时会占用更多内存。
显然,大的透明区域可以在PNG文件中有效编码,因此图像的尺寸很小。 但事实上,它的维度是(600 x 745),所以在内存中它将需要大约(600 * 745 * 4)字节,加上一些元信息,所以接近2兆字节。 4乘法器代表用alpha通道编码颜色所需的字节数。 Android Bitmaps由线性一维整数数组内部表示,因此您可以想象系统需要分配一个大小为600 * 745 = 447000的数组来创建您的Bitmap。
这就是为什么这种简单图像的内存消耗如此之高。