ImageView: автоматически перезаписывать растровое изображение, если ImageView не виден (в ScrollView) - PullRequest
8 голосов
/ 02 декабря 2011

Итак, я некоторое время смотрю на источник ImageView, но пока не нашел способа сделать это.

Проблема: допустим, в ScrollView 30 изображений размером 400x800 (количество изображений является переменным). Так как они точно вписываются в экран, им потребуется по 1,3 МБ ОЗУ.

Что я хочу: иметь возможность загружать / выгружать растровые изображения для ImageViews, которые в настоящее время видны внутри ScrollView. Если пользователь прокручивает и растровое изображение больше не видно (в пределах порога расстояния), оно должно быть переработано, чтобы память могла использоваться другими растровыми изображениями в том же ScrollView. Я делаю даунсэмплинг и все такое, так что не беспокойтесь. Бонусные баллы, если вы делаете это, только расширяя ImageView (я бы не хотел связываться с ScrollView, если это возможно).

Резюме: я могу заставить изображения загружаться только после того, как ImageView станет видимым (используя хитрый трюк), но я не знаю, когда их выгружать.

Примечания: я не могу сделать это с ListView из-за других причин юзабилити.

Ответы [ 3 ]

5 голосов
/ 10 октября 2013

Вызывайте этот метод, если вы хотите перерабатывать свои растровые изображения.

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 голос
/ 24 октября 2012

Взгляните на документацию для Android по поводу "Как рисовать растровые изображения" Также пример кода называется растровое веселье.

Если вы используете ListView или GridView, объекты ImageView перерабатываются, и фактическое растровое изображение освобождается для очистки GC.

Вы также хотите изменить размеры исходных изображений до размера экрана и кэшировать их на диске и / или в ОЗУ. Это сэкономит вам много места, а фактический размер должен составить пару килобайт КБ. Вы также можете попытаться отобразить изображения в половине разрешения вашего дисплея. Результат должен быть хорошим при использовании гораздо меньшего количества оперативной памяти.

0 голосов
/ 02 декабря 2011

Что вам действительно нужно, так это использовать ArrayAdapter для этого.Если, как показывают ваши заметки, это невозможно (хотя я не понимаю, почему), посмотрите на источник для адаптера массива и перепишите его для своих собственных нужд.

...