android – Glide:加载drawable但不缩放占位符

有没有办法使用Glide来分配一个占位符,但是将这个图像保持原来的大小?
我有一个可变大小的 ImageView(取决于传入的图像),我在调用Glide.with().load().into()之前设置,我想使用占位符,但不希望PH被调整为ImageView的大小,我希望它保持原来的大小.
到目前为止,我找不到办法.

解决方法

Re: Gregs comment
我给了另一个镜头(几乎一年的额外的XP),并提出了这一点:
<ImageView android:scaleType="center" ... />

类似于我的其他解决方案和以下动画包装器:

...
    .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,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);
    }
}

省略实现的平凡部分,每个类的构造函数从参数初始化字段.完整代码可在GitHub in TWiStErRob/glide-support.

如果您停留在较旧版本的Glide(3.8.0之前),则可以通过以下方式实现相同的效果

.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解决方案有更好的分离问题,并且可以缓存在一个变量中以防止分配.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...