【问题标题】:40+ ImageButtons on one screen?一个屏幕上有 40 多个图像按钮?
【发布时间】:2015-03-20 20:46:38
【问题描述】:

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

我试过了:

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

我在考虑什么

  • View Pager - 从性能角度来看,第一个结果看起来比 Grid View 更好(我目前还没有完成它来评估内存使用情况,但据我了解应该更好)。然而,我不喜欢用户体验,更喜欢所有图像的可滚动列表。
  • 将我的资源转换为 JPG(这会消除透明字节吗?)
  • 将图像缩小到最大 500x500 像素

似乎没有任何解决方案能像在所有设备上都可用的 Android Photo Gallery 应用程序那样出色。这种经历是我想反映的。不知道这是怎么做到的:(

两个问题。

  1. 完成此类事情(40 多张可在单个屏幕上滚动的图像)的最佳方法是什么?真的是 ViewPager 吗?带有 AsyncTask 的 ScrollView 和经过深思熟虑的图像分辨率?我还没有尝试过的东西?
  2. 我应该尝试保持的内存限制是多少?看看Android heap size on different phones/devices and OS versions,它似乎是 256 MB,这是合理的假设吗?

谢谢。周末愉快!

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

【问题讨论】:

  • 如果您从 Internet 加载它们,请考虑使用外部库,例如 Universal Image LoaderPicasso (square.github.io/picasso)。
  • 是否同时显示 40 张图片?这很重要。如果您显示您的应用程序的屏幕,那就太好了。
  • 为什么要在按钮上加载 500x500 的图像?以更合理的尺寸(可能是 50x50)创建缩略图并使用它。选择时加载完整尺寸的图像。
  • 查看画廊应用的安卓源代码。 @Hobo Sapiens 是正确的,在选择一张之前,真的没有理由加载完整的图像
  • 您的问题似乎有些矛盾。您提到ViewPager,但说“但是,我不喜欢用户体验,更喜欢所有图像的可滚动列表。”。然后你提到“...Android Photo Gallery 应用程序...”并说“这种体验是我想反映的。”。之前您提到使用 Nexus 7...我有一个 Nexus 7,并且预装的照片应用程序在全屏查看图像时使用 ViewPager。你为什么喜欢内置的照片应用,但不喜欢ViewPager 的用户体验?

标签: android imageview android-imageview imagebutton


【解决方案1】:

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

40 多张 1200x1200 的图像 = 大约 57MB,cmets 是正确的,您需要对图像进行二次采样(即缩略图)或使用诸如 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 加载缩小尺寸的位图。

【讨论】:

  • 谢谢,我相信这将是继续的方式。您知道在创建位图时使用 JPG 与 PNG(透明字节?)或使用 ARGB4444 / RGB565 与 ARGB8888 是否有任何区别?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 2018-01-25
相关资源
最近更新 更多