2012-10-04 21 views
1

我有一个.png文件,我想在我的应用程序中使用。该图像相当庞大,大小约为328x32765像素,大小为751KB,位于我的res文件夹中。我得到一个错误消息“java.lang.OutOfMemoryError:位图大小超过VM预算”尝试将此图像设置为我的布局。从Res崩溃在ImageView中设置大图像App

我不确定它是否相关,但我也有相同页面上的730个按钮,加载和工作正常,但我想这些按钮也许使用了很多内存?

无论哪种方式,是否有一个简单的修复,以帮助解决这个问题,或使我的.png图像使用较少的内存?

+0

看看这里。 http://stackoverflow.com/questions/7021578/resize-drawable-in-android –

+0

为什么图像很高?用户应该能够上下滚动吗?如果是这样,你可能想尝试把它切成更小的切片,并将它们放入一个listview中,然后它将只加载可见的切片。 – Andy

+0

我认为listview可能是一个很好的解决方案,唯一的问题是,这将需要一个体面的工作量,我只是一个非常紧张的日程安排为朋友免费的应用程序。所以我可能不得不寻找更简单的选择。 – bmjohns

回答

2

位图需要大量的内存在本教程中提到从 的Android的网站本身有关的位图

Displaying Bitmaps

编辑:

尝试使用功能“Bitmap.createScaledBitmap(位图,宽度,高度,过滤器);“或者尝试使用教程中提到的“BitmapFactory.Options”类。

“BitmapFactory.Options”类可以帮助,因为它的功能很多本身可以帮助开发人员通过缓存加载的位图,以尽量减少在装载位图使用的VM。

+0

我得到了位图factory.options类来加载我的图像,但如果我想要的图像是它需要的大小,我仍然得到虚拟机错误。如果我删除滚动视图上的730个按钮,我试图加载这个图像,这会帮助我不会得到VM错误吗? – bmjohns

+0

不,删除730个按钮将无济于事,因为虚拟机抱怨无法在AT ONCE分配请求的内存。对于较小的对象,android足够聪明,可根据需要初始化并放弃(页面到“虚拟内存”)。 –

+0

Nar Gar是对的,问题是,您的应用程序本身会吃掉分配给应用程序的内存。 就你而言,如果我没有弄错,你提到的位图是错误的主要来源,所以你不必看看你的按钮,除非那些按钮也有自己的位图。 在另一个说明中,您是否使用Bitmap类在应用中加载多个位图?如果是这种情况,那么为什么不尝试查看这部分代码。每次该应用程序拉一个位图旁边的可绘制文件夹,应用程序往往吃大量的内存。 – gorbos

0

尽管你的图像是731KB大,实际膨胀的位图大小将近41兆字节。 由于设备无法一次分配41MB ,所以出现错误。

不幸的是,有没有其他办法来解决这一问题,除了通过加载图像的缩小版本。

使用Bitmap.Options类,并指定一个缩放因子:

2 - 手段使每个侧小两倍

3 - 三个较小倍,......

× - ×倍小

的可喜的是,所得到的膨胀的位图大小将是41 /(X * X)MB:

2 - 41/4 = 10.25MB

3 - 9分之41= 4.5MB

4 - 一十六分之四十一= 2.6MB .....

尝试了这一点,并在多个设备上测试。

或者,将图像分解为相当小的图像,并使用不带边框或分隔线的ListView,这样您仍然可以看到平滑的图像,但ListView还会照顾启动和丢弃块,因为它们是需要。 (请注意,你会失去水平滚动的能力,因为ListView控件垂直滚动只 - 以防万一这是一个关心你)。

0

的Android不能处理大的位图OOM错误将occur.Its不是A =意外的错误,这是所面临的诸多developers.try谷歌搜索很多文档,你会发现explianing有关OOM错误的一个大问题。我在开发应用程序时也遇到了困难。为了消除这种情况,只能采用大图像采样。

int scale = "Image byte length"/320000; 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = scale/2 + scale % 2* 2; 
    decryptedimage=BitmapFactory.decodeByteArray(decryptedData,0,decryptedData.length,options);