问题描述
有没有一种方法可以使用Glide分配占位符,但可以将此图像保持其原始比例?我有一个ImageView
,它的大小可变(取决于传入的图像),我在调用Glide.with().load().into()
之前设置了此大小,但我想为其使用占位符,但不希望将占位符的大小调整为,我希望它保持其原始大小.
Is there a way to use Glide to assign a placeholder but keep this image to its original scale?I have an ImageView
with variable size (depending on the incoming image) which I set before calling Glide.with().load().into()
and I want to use a placeholder for it but don't want the placeholder to be resized to the size of the ImageView
, I want it to keep its original size.
到目前为止,我还没有找到一种方法.
So far I couldn't find a way to do this.
推荐答案
回复::我又给了它一炮(拥有将近一年的额外XP),并提出了这个方案:
Re: Gregs comment:I gave it another shot (with almost a year of extra XP) and came up with this:
<ImageView android:scaleType="center" ... />
类似于我的其他解决方案和以下动画包装器:
similar to my other solution and the following animation wrapper:
...
.fitCenter()
.animate(new PaddingAnimationFactory<>(new DrawableCrossFadeFactory<GlideDrawable>(2000)))
.into(imageView)
;
class PaddingAnimationFactory<T extends Drawable> implements GlideAnimationFactory<T> {
private final DrawableCrossFadeFactory<T> realFactory;
@Override public GlideAnimation<T> build(boolean isFromMemoryCache, boolean isFirstResource) {
return new PaddingAnimation<>(realFactory.build(isFromMemoryCache, isFirstResource));
}
}
class PaddingAnimation<T extends Drawable> implements GlideAnimation<T> {
private final GlideAnimation<? super T> realAnimation;
@Override public boolean animate(T current, final ViewAdapter adapter) {
int width = current.getIntrinsicWidth();
int height = current.getIntrinsicHeight();
return realAnimation.animate(current, new PaddingViewAdapter(adapter, width, height));
}
}
class PaddingViewAdapter implements ViewAdapter {
@Override public Drawable getCurrentDrawable() {
Drawable drawable = realAdapter.getCurrentDrawable();
if (drawable != null) {
int padX = Math.max(0, targetWidth - drawable.getIntrinsicWidth()) / 2;
int padY = Math.max(0, targetHeight - drawable.getIntrinsicHeight()) / 2;
if (padX != 0 || padY != 0) {
drawable = new InsetDrawable(drawable, padX, padY, padX, padY);
}
}
return drawable;
}
@Override public void setDrawable(Drawable drawable) {
if (VERSION.SDK_INT >= VERSION_CODES.M && drawable instanceof TransitionDrawable) {
// For some reason padding is taken into account differently on M than before in LayerDrawable
// PaddingMode was introduced in 21 and gravity in 23, I think NO_GRAVITY default may play
// a role in this, but didn't have time to dig deeper than this.
((TransitionDrawable)drawable).setPaddingMode(TransitionDrawable.PADDING_MODE_STACK);
}
realAdapter.setDrawable(drawable);
}
}
实现的重要部分被省略,每个类的构造函数都从参数初始化字段.完整代码可在 TWiStErRob/glide-support 中的GitHub.
Trivial parts of the implementations are omitted, each class's constructor initializes the fields from arguments. Full code available on GitHub in TWiStErRob/glide-support.
如果您使用的是旧版Glide(3.8.0之前的版本),则可以通过以下方式实现相同的效果:
If you're stuck on an older version of Glide (before 3.8.0), the same effect can be achieved by:
.fitCenter()
.placeholder(R.drawable.glide_placeholder)
.crossFade(2000)
.into(new GlideDrawableImageViewTarget(imageView) {
@Override public void onResourceReady(GlideDrawable resource,
GlideAnimation<? super GlideDrawable> animation) {
super.onResourceReady(resource, new PaddingAnimation<>(animation));
}
})
请注意两种解决方案如何需要相同数量的类,但是3.8.0之后的解决方案具有更好的关注点分离,并且可以将其缓存在变量中以防止分配.
Note how the two solutions require the same amount of classes, but the post-3.8.0 solution has better separation of concerns and it can be cached in a variable to prevent allocations.
这篇关于滑行:可绘制负载,但不缩放占位符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!