多个ImageView在Android中持有位图

时间:2012-03-23 16:35:14

标签: android bitmap imageview out-of-memory

在某个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);

0 个答案:

没有答案