В моем приложении есть ListView с изображениями. Он загружает изображения из Интернета с помощью универсального загрузчика изображений (1.7.0).
Параметры конфигурации и отображения:
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory()
.cacheOnDisc()
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
.defaultDisplayImageOptions(defaultOptions)
.threadPoolSize(2)
.enableLogging()
.build();
Часть getView() (мое приложение повторно использует ConvertView и шаблон ViewHolder):
View rowView = convertView;
ViewHolder holder;
if (rowView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
rowView = inflater.inflate(R.layout.list_row, null, true);
holder = new ViewHolder();
holder.photoView = (ImageView) rowView.findViewById(R.id.list_photo_view);
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}
String photoUrl = "http://someserver.com/some_image.jpg";
mImageLoader.displayImage(photoUrl, holder.photoView);
list_row.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:clickable="true" >
<ImageView
android:id="@+id/list_photo_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="false"
android:contentDescription="@string/photo"
android:scaleType="centerInside"
android:src="@drawable/template_image_list" />
</LinearLayout>
Конечно, ImageView не является одним представлением в каждой строке. Это короткая версия :). Таким образом, размеры изображений, которые я загружаю из Интернета, составляют 450x337. Я тестирую свое приложение на планшете с размером экрана 1280x760.
Как включил логирование - вижу такие сообщения:
Load image from memory cache [http://someserver.com/some_image.jpg_1280x736]
И так далее... Меня немного смущает окончание URL - "_1280x736". Как сказано во второй части руководства:
• maxImageWidthForMemoryCache() и maxImageHeightForMemoryCache() используются для декодирования изображений в объекты Bitmap. Чтобы не хранить в памяти полноразмерное изображение, его уменьшают до размера, определяемого из значений параметров ImageView, куда загружается изображение: maxWidth и maxHeight (первый этап), layout_width и layout_height (второй этап). Если эти параметры не определены (значения fill_parent и wrap_content считаются неопределенными), то берутся размеры, заданные настройками maxImageWidthForMemoryCache() и maxImageHeightForMemoryCache(). Размер исходного изображения уменьшается в 2 раза (рекомендуется для быстрого декодирования), пока ширина или высота не станут меньше заданных значений; o Значения по умолчанию - размер экрана устройства.
Итак, как я понимаю, это окончание - это размер изображения в кеше памяти после «уменьшения» :), и загрузчик изображений использовал значение по умолчанию (размер экрана). Я не удивлен, что загрузчик изображений не смог получить размер ImageView (возможно, слишком рано), но почему исходное изображение было увеличено? Сложно проверить размеры исходного изображения и оставить их без изменений? Конечно, я могу добавить размеры изображений в метод displayImage, но мне нужно объяснение...