Размер заполнителя Android Glide
У меня проблема с Android Glide. Я пытаюсь быстро поменять местами мое изображение, они просто становятся заполнителями, а мое изображение очень маленького размера. Так что мне нужно сделать?
Может быть, мне нужно проверить, загружен ли он или что-то, но я не знаю как.
Glide.with(this)
.load(quest.get(id).getImage())
.placeholder(R.drawable.load)
.fitCenter()
.crossFade()
.into(imageView);
5 ответов
В соответствии с этой проблемой на странице Glide GitHub вы можете исправить это, добавив следующую строку в ваш запрос Glide:
.dontAnimate()
Это сделало бы вашу строку полной загрузки:
Glide.with(context)
.load("http://lorempixel.com/150/150")
.placeholder(R.drawable.no_image)
.override(100, 100)
.dontAnimate()
.into(imageView);
Я делаю это, как указано ниже:
Идея состоит в том, чтобы установить тип масштаба в соответствии с первоначальным требованием заполнителя и подключить слушателя, чтобы снова изменить тип масштаба в соответствии с требованиями загруженного изображения после загрузки изображения.
//ivBuilderLogo = Target ImageView
//Set the scale type to as required by your place holder
//ScaleType.CENTER_INSIDE will maintain aspect ration and fit the placeholder inside the image view
holder.ivBuilderLogo.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
//AnimationDrawable is required when you are using transition drawables
//You can directly send resource id to glide if your placeholder is static
//However if you are using GIFs, it is better to create a transition drawable in xml
//& use it as shown in this example
AnimationDrawable animationDrawable;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
animationDrawable=(AnimationDrawable)context.getDrawable(R.drawable.anim_image_placeholder);
else
animationDrawable=(AnimationDrawable)context.getResources().getDrawable(R.drawable.anim_image_placeholder);
animationDrawable.start();
Glide.with(context).load(logo_url)
.placeholder(animationDrawable)
.listener(new RequestListener<String, GlideDrawable>() {
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource)
{
return false;
}
//This is invoked when your image is downloaded and is ready
//to be loaded to the image view
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource)
{
//This is used to remove the placeholder image from your ImageView
//and load the downloaded image with desired scale-type(FIT_XY in this case)
//Changing the scale type from 'CENTER_INSIDE' to 'FIT_XY'
//will stretch the placeholder for a (very) short duration,
//till the downloaded image is loaded
//setImageResource(0) removes the placeholder from the image-view
//before setting the scale type to FIT_XY and ensures that the UX
//is not spoiled, even for a (very) short duration
holder.ivBuilderLogo.setImageResource(0);
holder.ivBuilderLogo.setScaleType(ImageView.ScaleType.FIT_XY);
return false;
}
})
.into( holder.ivBuilderLogo);
Мой переходный объект drawable (R.drawable.anim_image_placeholder):
(не требуется при использовании статического изображения)
<?xml version="1.0" encoding="utf-8"?>
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/loading_frame1" android:duration="100" />
<!--<item android:drawable="@drawable/loading_frame2" android:duration="100" />-->
<item android:drawable="@drawable/loading_frame3" android:duration="100" />
<!--<item android:drawable="@drawable/loading_frame4" android:duration="100" />-->
<item android:drawable="@drawable/loading_frame5" android:duration="100" />
<!--<item android:drawable="@drawable/loading_frame6" android:duration="100" />-->
<item android:drawable="@drawable/loading_frame7" android:duration="100" />
<!--<item android:drawable="@drawable/loading_frame8" android:duration="100" />-->
<item android:drawable="@drawable/loading_frame9" android:duration="100" />
<!--<item android:drawable="@drawable/loading_frame10" android:duration="100" />-->
</animation-list>
В связи с этим я использовал override() для обеспечения размера изображения. Если у вас есть сетка, и вам нужно иметь два изображения в каждой строке, вот как вы находите размер экрана в пикселях, чтобы вычислить правильную ширину и высоту изображения:
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
placeholderWidth = size.x / 2 ;
placeholderHeight = size.x * 3 / 2 ; // based on the image's height to width ratio
Как только желаемая ширина и высота для каждого изображения будут у вас под рукой, можно легко переопределить:
Glide.with(context)
.load(url)
.placeholder(R.drawable.loading)
.override(placeholderWidth,placeholderHeight)
.into(viewHolder.imageViewHolder);
Если я правильно понимаю вашу проблему, вам нужно загрузить изображения, но они должны иметь ширину и высоту больше, чем ваше изображение-заполнитель. Чтобы решить вашу проблему, вы должны сначала прочитать документацию по Glide. Я не вижу ваше определение ImageView в файле XML, но я думаю, что вы используете атрибут wrap_content для ширины и высоты. Если я прав, у вас есть узкое место. Перед началом загрузки изображения Glide получает точную ширину и высоту ImageView. После этого он загружает изображение из сети и одновременно изменяет его размер в соответствии с одним из атрибутов ImageView (ширина или высота). Вот почему вы получаете маленькие изображения после загрузки. Чтобы решить вашу проблему, просто установите ширину или высоту ImageView в значение, которое вы ожидаете увидеть. Другая сторона изображения будет автоматически рассчитана с помощью логики Glide.
Если кто-то пришел сюда из поиска, как и я, и задается вопросом, как изменить размер Glide, но сохранить исходный размер изображения (в моем случае заполнитель был слишком большим), вот решение. Оберните свой
placeholder
можно рисовать в другом теге с тегом
inset
:
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:inset="20%">
<animated-rotate
android:drawable="@drawable/ic_loading"
android:pivotX="50%"
android:pivotY="50%" />
</inset>
Обратите внимание, что вы можете заменить
animated-rotate
с любым из разрешенных тегов. Также вы можете установить разные
insets
для каждой стороны вытягиваемого (
insetTop
,
insetBottom
и так далее), а в
dp
или же
%