一个屏幕上有 40 多个 ImageButtons?
40+ ImageButtons on one screen?
在过去的 10 多个小时里,我尝试在单个 Android 屏幕上获取大量 (40+) 图像(以 ImageButton 格式),而不会出现内存不足错误。我使用的 activity 是一个图画书应用程序的图像选择器。图像的大小在(500 到 1200)x(500 到 1200)范围内,PNG(如果重要的话)。
我试过:
- 带有从代码添加的图像的水平滚动视图。结果很慢(我在 UI 线程上执行)并且消耗大量内存 space。
- 带有通过 AsyncThread 从代码添加图像的水平滚动视图。结果很快但仍然消耗大量内存space。 我最喜欢这个的用户体验!
- 网格视图和列表视图 - 两者都非常不稳定(在第一个 Nexus 7 上测试)。内存使用更好。
我在考虑什么
- View Pager - 从性能的角度来看,第一个结果看起来比 Grid View 更好(我还没有完成它来评估内存使用情况,但根据我的理解它应该更好)。然而,我不喜欢用户体验,更喜欢所有图像的可滚动列表。
- 将我的资源转换为 JPG(这会去掉透明字节吗?)
- 将图片缩小到最大 500x500 像素
None 的解决方案似乎与所有设备上可用的 Android 照片库应用程序一样好。这种经历是我很想反映的。虽然不知道这是怎么做到的:(
两个问题。
- 完成这样的事情(40 多个图像可在单个屏幕上滚动)的最佳方法是什么?真的是ViewPager吗?带有 AsyncTask 的 ScrollView 和深思熟虑的图像分辨率?我还没有尝试过的东西?
- 我应该尽量保持低于多少内存限制?查看 Android heap size on different phones/devices and OS versions 似乎是 256 MB,这个假设合理吗?
谢谢。周末愉快!
PS。在 iOS 上,当我将所有按钮添加到滚动视图中时,一切都像魅力一样:(
一些基本计算揭示了您的问题:
40 多张 1200x1200 的图像 = 大约 57MB,评论是正确的您需要对图像进行子采样(即缩略图)或使用诸如 Universal Image Loader 之类的库。转换为 JPG 无关紧要。即为压缩存储格式,显示像素点所需内存保持不变
在 Loading Large Bitmaps Efficiently with sample code. The following steps are covered in more detail in the article Android Bitmap Loading for Efficient Memory Usage 上有一篇 Android 开发者文章。
加载大位图的基本步骤是:
- 确定所需尺寸(从已知尺寸或确定
目标视图的大小)。
- 使用 BitmapFactory class 获取位图的大小(在 [=42 中设置 inJustDecodeBounds =] 为真)。
- 计算子采样值并将其传递给BitmapFactory.Options设置inSampleSize.
- 使用 BitmapFactory 加载缩小尺寸的位图。
在过去的 10 多个小时里,我尝试在单个 Android 屏幕上获取大量 (40+) 图像(以 ImageButton 格式),而不会出现内存不足错误。我使用的 activity 是一个图画书应用程序的图像选择器。图像的大小在(500 到 1200)x(500 到 1200)范围内,PNG(如果重要的话)。
我试过:
- 带有从代码添加的图像的水平滚动视图。结果很慢(我在 UI 线程上执行)并且消耗大量内存 space。
- 带有通过 AsyncThread 从代码添加图像的水平滚动视图。结果很快但仍然消耗大量内存space。 我最喜欢这个的用户体验!
- 网格视图和列表视图 - 两者都非常不稳定(在第一个 Nexus 7 上测试)。内存使用更好。
我在考虑什么
- View Pager - 从性能的角度来看,第一个结果看起来比 Grid View 更好(我还没有完成它来评估内存使用情况,但根据我的理解它应该更好)。然而,我不喜欢用户体验,更喜欢所有图像的可滚动列表。
- 将我的资源转换为 JPG(这会去掉透明字节吗?)
- 将图片缩小到最大 500x500 像素
None 的解决方案似乎与所有设备上可用的 Android 照片库应用程序一样好。这种经历是我很想反映的。虽然不知道这是怎么做到的:(
两个问题。
- 完成这样的事情(40 多个图像可在单个屏幕上滚动)的最佳方法是什么?真的是ViewPager吗?带有 AsyncTask 的 ScrollView 和深思熟虑的图像分辨率?我还没有尝试过的东西?
- 我应该尽量保持低于多少内存限制?查看 Android heap size on different phones/devices and OS versions 似乎是 256 MB,这个假设合理吗?
谢谢。周末愉快!
PS。在 iOS 上,当我将所有按钮添加到滚动视图中时,一切都像魅力一样:(
一些基本计算揭示了您的问题:
40 多张 1200x1200 的图像 = 大约 57MB,评论是正确的您需要对图像进行子采样(即缩略图)或使用诸如 Universal Image Loader 之类的库。转换为 JPG 无关紧要。即为压缩存储格式,显示像素点所需内存保持不变
在 Loading Large Bitmaps Efficiently with sample code. The following steps are covered in more detail in the article Android Bitmap Loading for Efficient Memory Usage 上有一篇 Android 开发者文章。
加载大位图的基本步骤是:
- 确定所需尺寸(从已知尺寸或确定 目标视图的大小)。
- 使用 BitmapFactory class 获取位图的大小(在 [=42 中设置 inJustDecodeBounds =] 为真)。
- 计算子采样值并将其传递给BitmapFactory.Options设置inSampleSize.
- 使用 BitmapFactory 加载缩小尺寸的位图。