Установить видимость индикатора выполнения после завершения загрузки изображения с помощью библиотеки Glide
Привет я хочу иметь индикатор выполнения для изображения, которое будет показано во время загрузки изображения, но когда загрузка изображения будет завершена, я хочу установить его в gone. Раньше я использовал для этого библиотеку Пикассо. Но я не знаю, как использовать его с библиотекой Glide. У меня есть идея, что некоторые ресурсы готовы функция есть, но я не знаю, как ее использовать. Кто-нибудь может мне помочь?
код для библиотеки Пикассо
Picasso.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
progressBar.setVisibility(View.GONE);
}
@Override
public void onError() {
}
})
;
Теперь, как я могу сделать это с Glide?
Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
.into(imageView);
Я возможность загрузить изображение с помощью этого с Glide, но как я могу написать progressBar.setVisibility(View.GONE);
где-то в коде, если изображения загружаются?
7 ответов:
вопрос довольно старый, и я не знаю, какова была ситуация с glide в те времена, но теперь это можно легко сделать со слушателем (не так, как предлагается в ответе, выбранном как правильный).
progressBar.setVisibility(View.VISIBLE); Glide.with(getActivity()) .load(args.getString(IMAGE_TO_SHOW)) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } }) .into(imageFrame) ;
вы возвращаете true, если хотите сами обрабатывать такие вещи, как анимация, и false, если хотите скользить, чтобы обрабатывать их для вас.
мой ответ был основан на устаревших API. Смотрите здесь для более современного ответа.
в исключении поставьте условие для показа снова
ProgressBar
Glide.with(context) .load(image_url) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { if(e instanceof UnknownHostException) progressBar.setVisibility(View.VISIBLE); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } }) .into(imageView);
Если вы хотите сделать это в Котлине, вы можете попробовать так:
Glide.with(context) .load(url) .listener(object : RequestListener<Drawable> { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean { //TODO: something on exception } override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { Log.d(TAG, "OnResourceReady") //do something when picture already loaded return false } }) .into(imgView)
выше решение работает очень хорошо для меня, но когда я использую asBitmap() чтобы загрузить изображение. Это не работает.
нам нужно использовать BitmapImageViewTarget
Glide.with(this) .load(imageURL) .asBitmap() .placeholder(R.drawable.bg) .into(new BitmapImageViewTarget(imageView) { @Override public void onResourceReady(Bitmap drawable, GlideAnimation anim) { super.onResourceReady(drawable, anim); progressBar.setVisibility(View.GONE); } });
- в xml возьмите индикатор выполнения с высотой и шириной (match_parent).
перед вызовом ниже метода упоминания установите видимость индикатора выполнения.
public void setImageWIthProgressBar(Context context, final ImageView imageView, String imageUrl, final ProgressBar progressBar) { Glide.with(context) .load(imageUrl) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } }) .into(imageView); }//setImageWIthProgressBar
Это лучший ответ, так как он не использует какой-либо хак, как настройка видимости, чтобы получить желаемый результат.
загрузите gif progressbar и назовите его
progressbargif
и поместите его в папку для рисования.Glide.with(ctx) .load(url) .thumbnail(Glide.with(ctx).load(R.drawable.progressbargif)) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .error(R.drawable.image_unavailable) .crossFade(200) .into(iv);
после загрузки изображения url-адреса миниатюра исчезает. Миниатюра исчезает сразу же после загрузки кэшированного изображения.