Переопределение для прямоугольных изображений может привести к неправильному отображению изображения, когда высота иногда больше, а ширина иногда больше.
Вот что я сделал, на всякий случай, если кто-то захочет исследовать. Это исправило ошибку Glide, связанную с уменьшением изображений при прокрутке RecyclerView вверх и вниз.
К сведению: я использую androidx вместо библиотек поддержки, но он также должен работать с виджетами ImageView и AppCompatImageView.
Вот фрагмент макета элемента RecyclerView:
<RelativeLayout...
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/attachment_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:adjustViewBounds="true"
android:background="@drawable/camera_image_preview_default"
android:minWidth="400dp"
android:scaleType="centerCrop" />
</RelativeLayout>
А вот код в моем адаптере onBindViewHolder переопределяет:
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
....
....
attachmentImage.layout(0, 0, 0, 0);
Glide.with(context)
.load(Uri.fromFile(new File(AppGlobals.IMAGES_THUMBNAIL_STORE_PATH + packet.getImageFileName())))
.placeholder(ResourcesCompat.getDrawable(context.getResources(), R.drawable.image_loading_placeholder, null))
.centerCrop()
.error(ResourcesCompat.getDrawable(context.getResources(), R.drawable.missing_thumbnail, null))
.into(attachmentImage);
....
....
}
Если вы заметите,
Перед привязкой Glide для ImageView был установлен макет 0, 0, 0, 0. Это гарантирует, что Glide интерпретирует его как новую инфляцию макета и не использует стратегию кэширования.
minWidth
было установлено на 400dp
, layout_width
было установлено на match_parent
, а layout_height
было установлено на wrap_content
. Вы можете манипулировать minWidth
по своему выбору.
Привязка будет использовать centerCrop()
во время выполнения, поэтому на самом деле не имеет значения, какой scaleType
вы установили во время разработки в макете xml.
К вашему сведению: в этом примере используется загрузка изображения из общедоступного внешнего каталога хранилища локального устройства. использовать другие реализации для загрузки из сети или URL
Кредиты: настройка макета на все нули была упомянута и рекомендована TWiStErRob на форуме сообщества Glide Github.
@ https://github.com/TWiStErRob
К выпуску №1591
https://github.com/bumptech/glide/issues/1591
Кстати, если вы установите ImageView в макете xml с абсолютными layout_height
и layout_width
- скажем, 400dp и 300dp соответственно, Glide работает отлично. Проблема видна только тогда, когда размеры для каждого изображения разные.
person
Ram Iyer
schedule
18.06.2019