Несколько ImageView с растровыми изображениями в Android - PullRequest
0 голосов
/ 23 марта 2012

В определенном ScrollView мы хотим отобразить несколько (> 25) ImageViews.Каждый из этих ImageViews должен содержать отдельное растровое изображение, которое было загружено с 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

Мы пытались повторно использовать растровые изображения, но это будетВ результате возникает ошибка «Не удается отобразить удаленное растровое изображение» для ImageView.OpenGL может быть вариантом, конечно, но мы бы предпочли сделать это без =) Кто-нибудь знает, как встроенная галерея на Android показывает все ваши изображения без переполнения?

Вопрос становится: Есть ли способ отобразить много растровых изображений в нескольких ImageViews?

Приветствия!

РЕДАКТИРОВАТЬ:

Как запрашивается код такдалеко.(Ну, полезная часть).

Все переменные / представления и т. Д. Создаются над этим фрагментом кода, если их нет в этом фрагменте;) Этот метод вызывается только во время инициализации, очевидно.Когда вызывается onDestroy () (или onStop ()), все битовые карты перерабатываются.Они будут загружены снова при необходимости.Загрузка выполняется асинхронно;анимация загрузки отображается в это время.(Который будет остановлен и удален при загрузке растрового изображения.)

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);
...