一个屏幕上有40多个ImageButtons?

时间:2015-03-20 20:46:38

标签: android imageview android-imageview imagebutton

在过去10多个小时内,我尝试在单个Android屏幕上获取大量(40+)数量的图像(采用ImageButton格式),而不会出现内存错误。我工作的活动是着色书应用程序的图像选择器。图像具有各种尺寸,范围为(500到1200)x(500到1200),PNG(如果重要的话)。

我试过了:

  • 水平滚动视图,其中包含从代码中添加的图像。结果很慢(我在UI线程上做)并消耗大量内存空间。
  • 水平滚动视图,通过AsyncThread从代码添加图像。结果很快但仍然占用大量内存空间。 我最喜欢这个用户体验!
  • 网格视图和列表视图 - 两者都非常不稳定(在第一个Nexus 7上进行测试)。内存使用情况更好。

我在考虑什么

  • 查看寻呼机 - 从性能角度来看,第一个结果看起来比网格视图更好(我还没有完成它以评估内存使用情况,但根据我的理解它应该更好)。然而,我不喜欢用户体验,更喜欢所有图像的可滚动列表。
  • 将我的资源转换为JPG(将取消透明度字节吗?)
  • 将图像缩小到最大500x500px

这些解决方案似乎都不如所有设备上提供的Android Photo Gallery应用程序一样好。我很乐意体验这种体验。不知道如何做到这一点:(

两个问题。

  1. 获得此类内容的最佳方法是什么(单个屏幕上可滚动40多个图像)?它真的是ViewPager吗?带有AsyncTask的ScrollView和精心设计的图像分辨率?我尚未尝试过的东西?
  2. 我应该尝试保留以下内存限制是多少?看Android heap size on different phones/devices and OS versions似乎是256 MB,这是公平的假设吗?
  3. 感谢。祝周末愉快!

    PS。在iOS上,当我将所有按钮添加到滚动视图中时,所有工作都像魅力一样:(

1 个答案:

答案 0 :(得分:3)

一些基本计算揭示了您的问题:

在1200x1200 =大约57MB的40多张图像,评论是正确的,您需要对图像进行二次采样(即缩略图)或使用诸如Universal Image Loader之类的库。转换为JPG并不重要。这是一种压缩存储格式,显示像素所需的内存保持不变。

Loading Large Bitmaps Efficiently上有一篇关于示例代码的Android开发人员文章。文章Android Bitmap Loading for Efficient Memory Usage中详细介绍了以下步骤。

加载大位图的基本步骤是:

  • 确定所需尺寸(从已知尺寸或确定 目标视图的大小。)。
  • 使用 BitmapFactory 类获取位图的大小(将 BitmapFactory.Options 中的 inJustDecodeBounds 设置为true)。
  • 计算子采样值并将其传递给 BitmapFactory.Options 设置 inSampleSize
  • 使用 BitmapFactory 加载缩小尺寸的位图。