所以,我已经看了一段时间的ImageView源代码,但我还没想出一个钩子来做这件事。
问题:在ScrollView中有30个400x800图像(图像数量可变)。由于它们完全适合屏幕,因此每个占用1.3 MB的RAM。
我想要的是:能够为ScrollView中当前可见的ImageView加载/卸载位图。如果用户滚动并且位图不再可见(在距离阈值内),则应该回收位图,以便内存可以被同一ScrollView中的其他位图使用。我正在进行下采样以及所有这些,所以不用担心。如果你只通过扩展ImageView来实现这一点(如果可能的话我想不要乱用ScrollView)。
总结:我可以在ImageView变得可见之后加载图片(使用巧妙的技巧),但我不知道何时卸载它们。
注意:由于其他可用性原因,我无法使用ListView执行此操作。
答案 0 :(得分:5)
如果要回收位图,请调用此方法。
public static void recycleImagesFromView(View view) {
if(view instanceof ImageView)
{
Drawable drawable = ((ImageView)view).getDrawable();
if(drawable instanceof BitmapDrawable)
{
BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
bitmapDrawable.getBitmap().recycle();
}
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
recycleImagesFromView(((ViewGroup) view).getChildAt(i));
}
}
}
答案 1 :(得分:1)
看一下关于"How to draw bitmaps"的android文档,还有一个名为bitmap fun的代码示例。
如果您使用ListView或GridView,ImageView对象将被回收,实际的位图将被释放以供GC清理。
您还希望将原始图像的大小调整为屏幕大小,并将其缓存在磁盘和/或RAM上。这将为您节省大量空间,实际大小应该降低到几百万KB。您还可以尝试以显示器分辨率的一半显示图像。使用少得多的RAM时,结果应该仍然很好。
答案 2 :(得分:0)
你真正想要的是使用ArrayAdapter。如果像你的笔记所说的那样,那是不可能的(虽然我不明白为什么)看看数组适配器的来源并根据自己的需要重写一个。