Почему мои изображения сжимаются после загрузки с библиотекой glide

Привет, я заполняю gridview библиотекой загрузчика изображений glide, когда они впервые вызываются в моем фрагменте, они выглядят так perfect Но после прокрутки вверх и вниз они изменяются в размере и выглядят так слишком маленький Это что-то, что я делаю с моим gridview, библиотекой glide, или это что-то еще, вроде моего замещающего изображения? на втором снимке экрана. Если я нажму на изображение, оно загорится, чтобы показать, что на самом деле оно заполняет все пространство, кто-нибудь знает, что я здесь делаю неправильно? Я пытался изменить вызов в скольжении, играя с centercrop и т. Д., Но, похоже, это не имеет значения, я не уверен, как мне определить ширину и высоту каждой ячейки, приветствуются любые предложения.

РЕДАКТИРОВАТЬ, вот как я называю скольжение

   Glide.with(getActivity())
                .load(mThumbIds[position])
                .placeholder(R.drawable.placeholder)
                .error(R.drawable.ic_drawer)
                .centerCrop()
                .override(500,300)
                .into(imageView);

person Martin Seal    schedule 03.08.2015    source источник
comment
Могу ли я узнать, является ли ваше исходное изображение квадратным (как на первом экране) или прямоугольником (как на втором экране). Скорее всего, ваше изображение будет прямоугольным, как показано на самом рисунке 2. первый будет растянутым форматом, так как вы не используете скольжение.   -  person Nivedh    schedule 03.08.2015
comment
@Niv Все изображения прямоугольные и заполняются URL-адресами фотобакетов, я отредактировал свой вопрос, чтобы включить то, как я вызываю glide   -  person Martin Seal    schedule 03.08.2015
comment
теперь ты правильно понял? если не удалить это обозначение .override(500,300) или сделать его .override(500,500)   -  person Nivedh    schedule 03.08.2015
comment
да, 500 500 выходит слишком маленьким, ушли на 700 700, и он выглядит идеально, так что это правильные размеры, просто попробуйте его на меньшем устройстве, чтобы проверить согласованность, но если вы хотите добавить свой комментарий в качестве ответа, я принимаю это.   -  person Martin Seal    schedule 03.08.2015
comment
отредактировал мой ответ, пожалуйста, посмотрите   -  person Nivedh    schedule 03.08.2015


Ответы (7)


На самом деле вы должны указать ширину и высоту вашего контейнера изображения (ImageView).

<ImageView
    android:id="@+id/channelImage"
    android:layout_width="65dp"
    android:layout_height="65dp"
    android:layout_centerHorizontal="true"
    android:layout_margin="10dp"
    android:src="@drawable/sama" />

Затем, когда вы вызываете glide, вы должны динамически переопределять ширину и высоту с помощью метода переопределения. Это максимальная ширина и высота для вашего контейнера.

Glide.with(getActivity())
                    .load("your url")

                    .placeholder(R.drawable.tv2v_icon)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .fitCenter()
                    .override(500,500)
                    .into(channelImage);

надеюсь, что это может помочь вам.

person Saad Bilal    schedule 07.04.2016
comment
Это сработало отлично, у меня была такая же проблема при возобновлении активности с изображениями. - person William; 19.06.2017

Используйте метод .dontAnimate() для решения проблемы.

Glide.with(context)
                .using(new FirebaseImageLoader())
                .load(pathReference)
                .dontAnimate()
                .placeholder(R.drawable.place_holder)
                .into(holder.logo);
person vishnuc156    schedule 18.05.2017

Мне помогло следующее:

1) Используется AdjustViewBounds = "true" в вашем представлении изображения -> Это заставит представление изображения поддерживать соотношение сторон в соответствии с его изображением, когда оно рисует/перерисовывает/изменяет размер

2) Установите layout_width = match_parent и layout_height = wrap_content для XML-представления элемента представления ресайклера, а также для представления изображения.

Причина:

Предположим, что представление Recycler настроено с помощью Grid Layout Manager, имеющего 2 столбца в вертикальной ориентации. Это заставит xml строки элемента представления recycler иметь половину ширины экрана. Из-за значения match_parent в атрибуте layout_height строки элемента и его элемента (imageview) это приведет к тому, что изображение станет половиной ширины экрана. Теперь, благодаря настройке AdjustViewBounds = true, представление изображения само отрегулирует свою высоту, чтобы сохранить соотношение сторон.

person Mohit    schedule 27.09.2019

В любом случае есть такие методы, как .fitCenter() или .centerCrop(). Попробуйте использовать эти методы в

    Glide.with(getApplicationContext())
                            .load("")
                            .centerCrop()
                            .placeholder(R.drawable.ic_launcher)
                            .crossFade()
.override(1000,1000)
                            .into(myImageView); 
           .
person Nivedh    schedule 03.08.2015
comment
Glide.with(getActivity()) .load(mThumbIds[position]) .placeholder(R.drawable.placeholder) .error(R.drawable.ic_drawer) .centerCrop() .override(500,300) .into(imageView); это то, как я вызываю его в данный момент, пытаясь удалить метод переопределения - person Martin Seal; 03.08.2015
comment
извините, я пробовал 500, а теперь также пробовал 700 и 1000, но не в восторге, 500 выглядит идеально на моем LG g3 (экран 5,5), но он добавляет огромное расстояние между изображениями сверху и снизу, но левое и правое прекрасно подходят на мой htc 610 (4 экрана) - person Martin Seal; 03.08.2015
comment
попробуйте подогнать xy в виде изображения вашего адаптера - person Nivedh; 03.08.2015
comment
в любом случае причина этого в том, что ваше изображение прямоугольное. если вы сделаете его квадратным до желаемой пропорции, все будет в порядке. - person Nivedh; 03.08.2015
comment
Это не может быть ответом, изображения должны быть прямоугольными. - person Martin Seal; 03.08.2015

Для почти идентичной проблемы все, что мне нужно было сделать, это добавить .override(maxItemWidth, maxItemHeight). Это, казалось, предотвратило то, что Glide делал, что приводило к уменьшению изображений.

Примечание. maxItemWidth / maxItemHeight — это значения, которые я использовал для контейнера элемента представления recycler, но ImageView, содержащий изображение, на самом деле меньше (из-за границы и метки).

    Glide
        .with(context)
        .load(categoryItem.getThumbnail())
        .asBitmap()
        .fitCenter()
        .override(itemWidth, itemHeight)
        .into(holder.imgIcon);

Вот мой xml, если интересно:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@id/item_container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_gravity="center_vertical"
             android:orientation="vertical"
             android:padding="4dp">


    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@drawable/rounded_white_rectangle"
        android:padding="2dp"
        >

        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:scaleType="fitCenter"
            android:adjustViewBounds="true"
            />

    </FrameLayout>

</FrameLayout>
person Lindsay-Needs-Sleep    schedule 11.09.2017

Я нашел решение, которое работает в версии Glide V4 (4.8.0)

импортировать «Glide» в gradle (в настоящее время самая новая версия — 4.8.0):

    implementation 'com.github.bumptech.glide:glide:4.8.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

ваш ImageView в элементе RecycleView должен выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/image"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_launcher_background" />

    </RelativeLayout>

и в вашем адаптере:

        final Content content = getItem(position);
        ImageViewHolder viewHolder = (ImageViewHolder) holder;

        RequestOptions options = new RequestOptions();
        options.optionalFitCenter();

        Glide.with(Application_News16.getAppContext())
                .load(content.getValue())
                .apply(options)
                .apply(new RequestOptions()
                        .placeholder(R.drawable.img_loading_s)
                        .error(R.drawable.img_error_s))
                .into(viewHolder.image);
person Guy4444    schedule 08.10.2018

Переопределение для прямоугольных изображений может привести к неправильному отображению изображения, когда высота иногда больше, а ширина иногда больше.

Вот что я сделал, на всякий случай, если кто-то захочет исследовать. Это исправило ошибку 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);
    ....
    ....
}

Если вы заметите,

  1. Перед привязкой Glide для ImageView был установлен макет 0, 0, 0, 0. Это гарантирует, что Glide интерпретирует его как новую инфляцию макета и не использует стратегию кэширования.

  2. minWidth было установлено на 400dp, layout_width было установлено на match_parent, а layout_height было установлено на wrap_content. Вы можете манипулировать minWidth по своему выбору.

  3. Привязка будет использовать 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