使用 Glide 刷新 ImageView
ImageView refresh with Glide
我有一个 ImageView 和一张用 Glide 加载的图像:
Glide.with(ImageView.getContext())
.load(url)
.dontAnimate()
.placeholder(R.drawable.placeholder)
.signature(stringSignature)
.into(new GlideDrawableImageViewTarget(ImageView) {
@Override
public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) {
super.onResourceReady(drawable, anim);
progressBar.setVisibility(View.GONE);
}
});
当我想刷新图像时,我 运行 再次使用相同的代码,只是使用了新的签名。它运行完美,但是当开始新的加载时,可见图像立即消失。
问题
Is possible keep the image in ImageView and replace it after new image is downloaded?
这是预期的行为。
每次调用 .load(x)
时,Glide 都会对目标及其相关请求调用 .clear()
。
这就是 Glide 能够处理其位图池的方式,否则它无法知道何时回收位图。
为了实现这个,你需要在两个Target之间切换,这里是核心思想:
public <T> void loadNextImage(@NonNull T model,
@NonNull BitmapTransformation... transformations) {
//noinspection MagicNumber
int hash = model.hashCode() + 31 * Arrays.hashCode(transformations);
if (mLastLoadHash == hash) return;
Glide.with(mContext).load(model).asBitmap().transform(transformations).into(mCurrentTarget);
mLastLoadHash = hash;
}
Target mCurrentTarget;
private class DiaporamaViewTarget extends ViewTarget<ImageView, Bitmap> {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
mLoadedDrawable = new BitmapDrawable(mImageView.getResources(), resource);
// display the loaded image
mCurrentTarget = mPreviousTarget;
你可以在下次加载时将已加载的 Drawable 设置为占位符,如下所示:
private Drawable placeholder = ContextCompat.getDrawable(ctx, R.drawable.placeholder);
public void loadImage(String url, ImageView imageView) {
Glide.with(imageView.getContext())
.load(url)
.placeholder(placeholder)
.into(new GlideDrawableImageViewTarget(imageView) {
@Override
public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) {
super.onResourceReady(drawable, anim);
placeholder = drawable;
}
});
}
我有一个 ImageView 和一张用 Glide 加载的图像:
Glide.with(ImageView.getContext())
.load(url)
.dontAnimate()
.placeholder(R.drawable.placeholder)
.signature(stringSignature)
.into(new GlideDrawableImageViewTarget(ImageView) {
@Override
public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) {
super.onResourceReady(drawable, anim);
progressBar.setVisibility(View.GONE);
}
});
当我想刷新图像时,我 运行 再次使用相同的代码,只是使用了新的签名。它运行完美,但是当开始新的加载时,可见图像立即消失。
问题
Is possible keep the image in ImageView and replace it after new image is downloaded?
这是预期的行为。
每次调用 .load(x)
时,Glide 都会对目标及其相关请求调用 .clear()
。
这就是 Glide 能够处理其位图池的方式,否则它无法知道何时回收位图。
为了实现这个,你需要在两个Target之间切换,这里是核心思想:
public <T> void loadNextImage(@NonNull T model,
@NonNull BitmapTransformation... transformations) {
//noinspection MagicNumber
int hash = model.hashCode() + 31 * Arrays.hashCode(transformations);
if (mLastLoadHash == hash) return;
Glide.with(mContext).load(model).asBitmap().transform(transformations).into(mCurrentTarget);
mLastLoadHash = hash;
}
Target mCurrentTarget;
private class DiaporamaViewTarget extends ViewTarget<ImageView, Bitmap> {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
mLoadedDrawable = new BitmapDrawable(mImageView.getResources(), resource);
// display the loaded image
mCurrentTarget = mPreviousTarget;
你可以在下次加载时将已加载的 Drawable 设置为占位符,如下所示:
private Drawable placeholder = ContextCompat.getDrawable(ctx, R.drawable.placeholder);
public void loadImage(String url, ImageView imageView) {
Glide.with(imageView.getContext())
.load(url)
.placeholder(placeholder)
.into(new GlideDrawableImageViewTarget(imageView) {
@Override
public void onResourceReady(GlideDrawable drawable, GlideAnimation anim) {
super.onResourceReady(drawable, anim);
placeholder = drawable;
}
});
}