Glide сжимает изображение при первой загрузке

Когда я загружаю изображение в ImageView с помощью Glide, оно сжимается. Когда я поворачиваю или снова открываю одно и то же действие, оно имеет правильный размер. Я уже пробовал возможный дубликат. Я уже передаю размер исправления в ImageView внутри xml, и я также пытался переопределить размер. centerCrop() и fitCenter() не влияют на усадку. Я также попытался отладить размер изображения. Когда он сжимается или нет, он возвращает ту же ширину и высоту.

Просмотр:

<ImageView
      android:id="@+id/thumbnail"
      android:layout_width="@dimen/episode_detail_img_width"
      android:layout_height="@dimen/episode_detail_img_height"
      android:layout_marginTop="@dimen/episode_detail_img_margin_top" />

Скольжение

Glide.with(getActivity())
            .load(url)
            .placeholder(R.drawable.thumb_placeholder)
            .centerCrop()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(thumbnail);

person parohy    schedule 29.07.2016    source источник
comment
попробуйте удалить этот код на данный момент:   -  person Dharvik shah    schedule 29.07.2016
comment
Когда я использую заполнитель, он сжимает изображение. Все остальные варианты хороши. Любая идея, почему это произошло? Я уверен, что у меня есть нужные ресурсы для каждого доступного разрешения.   -  person parohy    schedule 29.07.2016
comment
хорошо поймал. поместите изображение-заполнитель больше, чем высота и вес вашего ImageView. или любого цвета.   -  person Dharvik shah    schedule 29.07.2016
comment
Я использовал ресурс placehodler размером 400x200px. Я заменил его на плейсходлер 400x400, и это решило проблему. Спасибо за помощь!   -  person parohy    schedule 29.07.2016


Ответы (4)


Я рад, что вы получили ответ. Просто для более подробного описания вашей проблемы:

Glide рассчитал вашу высоту и ширину ImageView перед началом загрузки изображения, но когда изображение загружается, оно заменяет ваш заполнитель. поэтому, если высота или вес вашего заполнителя малы, Glide отобразит загруженное растровое изображение с размером заполнителя.

Итак, чтобы не было отставания в разных размерах экрана и макете, я советую использовать возможность рисования больших размеров в заполнителе.

И еще один прием — использовать цвет в заполнителе, потому что у цвета нет ни высоты, ни ширины, поэтому визуализируйте всю область представления.

person Dharvik shah    schedule 29.07.2016

Вы определили метод placeHolder(), который будет загружаться в начальный момент времени, и когда glide загружает изображение на основе заданного URL-адреса, glide заменяет загруженное изображение изображением placeHolder. который появится в imageView. это загруженное изображение устанавливается в imageView на основе указанного метода.

например: cropCenter(), fitCenter() и т. д.

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

используйте метод fitCenter().

<ImageView
            android:id="@+id/conversation_team_photo"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:scaleType="fitCenter"
             />

и я определил способ использования скольжения здесь лучший способ использования скольжения.

person Abdul Rizwan    schedule 05.09.2016

Это можно исправить:

1) добавить .dontAnimate()

2) найти заполнитель, соответствующий соотношению изображения

Пояснение: https://github.com/bumptech/glide/issues/1295

При первой загрузке изображения срабатывает .crossFade() по умолчанию, и соотношение сторон вашего заполнителя не соответствует соотношению загруженных изображений. Во второй раз изображение загружается из кеша памяти, и в этом случае анимация пропускается, что приводит к правильной загрузке изображения. Вы можете отключить анимацию с помощью .dontAnimate() или вызвать анимацию постепенного появления .animate(R.anim.fade_in) или найти заполнитель, соответствующий соотношению изображения (например, квадрат в вашем случае из-за 512x512).

person Jakub S.    schedule 04.01.2018
comment
Спасибо за фрагмент из документации. Это полезно :) Но мы хотели, чтобы анимация была на месте, поэтому флаг dontAnimate не помог бы в этом случае. Это один из старых проектов, так что не помните... но в этом случае было то же самое соотношение сторон :) - person parohy; 07.01.2018

По сравнению с Picasso, Glide намного эффективнее с точки зрения памяти. Glide автоматически ограничивает размер изображения, хранящегося в кеше и памяти, размерами ImageView.

Очистите свой проект и попробуйте этот код:

Glide
  .with(context)
  .load(url)
  .override(400, 200) // resizes the image to these dimensions (in pixel).does not respect aspect ratio
  .into(thumbnail);
person blkrt    schedule 29.07.2016