在某个ScrollView中,我们想要显示多个(> 25)ImageView。这些ImageView中的每一个都必须保存从SD卡加载的单独位图。
你可以猜到会发生什么:
03-23 16:33:04.561: E/dalvikvm-heap(28310): 90000-byte external allocation too large for this process.
03-23 16:33:04.561: E/dalvikvm(28310): Out of memory: Heap Size=6151KB, Allocated=3491KB, Bitmap Size=26917KB, Limit=32768KB
我们尝试回收Bitmaps,但这会导致ImageView的“无法显示处置的Bitmap” - 错误。 当然,OpenGL可能是一个选项,但我们宁愿在没有=)的情况下这样做 有谁知道Android上的内置图库如何显示所有图片而不会溢出?
问题变成: 有没有办法在多个ImageView中显示很多位图?
干杯!
截至目前为止所要求的代码。 (嗯,有用的部分)。
如果这些代码不在此代码段中,则会在这段代码之上创建所有变量/视图等。)该方法仅在初始化期间显式调用。当调用onDestroy()(或onStop())时,所有位图都被回收。他们将在需要时再次装载。加载完成asynch;同时显示加载动画。 (加载位图时将停止并删除它。)
for (ImageObject imageObject : images)
{
// previous row is full
if (currentWidth >= maxImagesPerRow)
{
// add that row to the main view
view.addView(linearLayout);
// and start a new empty row
linearLayout = createEmptyRowLayout();
currentWidth = 0;
}
// create an ImageView with the correct image source
ImageView iv = new ImageView(CollectionActivity.this);
iv.setId((int) imageObject.getId());
iv.setLayoutParams(new LayoutParams(realImageWidth + 2*imagePadding, realImageWidth + 2*imagePadding));
iv.setPadding(imagePadding, imagePadding, imagePadding, imagePadding);
iv.setScaleType(ScaleType.FIT_CENTER);
iv.setOnClickListener( *some onClickListener* );
// This bmp is recycled when the activity is destroyed
// It is a Bitmap resized to the needed size.
iv.setImageBitmap(imageObject.bmp_collection);
iv.setColorFilter(imageObject.tint.toColor());
// add this image to the current row (which cannot be full)
linearLayout.addView(iv);
currentWidth++;
}
// If the row is not full, add (a) transparent image(s)
while (currentWidth < maxImagesPerRow)
{
* (add 1 empty image; 1x1 transparent pixel from resources) *
linearLayout.addView(iv);
currentWidth++;
}
view.addView(linearLayout);