本文介绍了滑行:可绘制负载,但不缩放占位符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有一种方法可以使用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.

这篇关于滑行:可绘制负载,但不缩放占位符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 13:30