Olá, quero ter uma barra de progresso para a imagem que será exibida durante o carregamento da imagem, mas quando o carregamento da imagem for concluído, quero defini-la como desaparecido. Anteriormente, eu estava usando a biblioteca de Picasso para isso. Mas não sei como usá-lo com a biblioteca Glide. Tenho ideia que existe alguma função de recurso pronto, mas não sei como usá-la. Alguém pode me ajudar?
Código para a Biblioteca Picasso
Picasso.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
progressBar.setVisibility(View.GONE);
}
@Override
public void onError() {
}
})
;
Agora, como posso fazer isso com o Glide?
Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
.into(imageView);
Eu consigo carregar a imagem com o Glide, mas como posso escrever progressBar.setVisibility(View.GONE);
em algum lugar no código se a imagem for carregada?
android
imageview
android-glide
HariRam
fonte
fonte
Respostas:
A pergunta é bastante antiga, e não sei qual era a situação do glide naquela época, mas agora pode ser facilmente feita com o ouvinte (não como proposto na resposta escolhida como correta).
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) ;
Você retorna true se deseja manipular coisas como animações por conta própria e false se deseja que o glide manipula para você.
fonte
progressBar
inonException
também, caso contrário ele girará indefinidamente, dando falsas esperanças. Uma vez queonException
é chamado de Glide não fará nada além de definir o que é passado para.error()
..listener
deve ser chamado antes.into()
Se você quiser fazer isso no KOTLIN, pode tentar desta forma:
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)
fonte
import com.bumptech.glide.request.target.Target
Minha resposta foi baseada em APIs desatualizadas. Veja aqui a resposta mais atualizada.
fonte
.listener()
é melhor porque você receberá mais informações sobre sua carga (modelo, cache de memória, ...) para que seja mais fácil decidir uma lógica mais personalizada.RequestListener
também é mais estável, substituir o qualTarget
criar não proporcionará o benefício de futuras correções. Você também pode criar facilmente umVisibilityListener<T, R>
que pode reutilizar em diferentes contextos.Em exceção, coloque uma condição para mostrar novamente o
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);
fonte
A solução acima funciona muito bem para mim também, mas quando eu uso asBitmap () para baixar a imagem. Não funciona.
Precisamos usar 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); } });
fonte
GlideDrawable estão obsoletos, use Drawable simples
RequestOptions requestOptions = new RequestOptions(); requestOptions.placeholder(R.drawable.placeholder); requestOptions.error(R.drawable.error); Glide.with(getContext()) .setDefaultRequestOptions(requestOptions) .load(finalPathOrUrl) .listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { progressBar.setVisibility(View.GONE); return false; } }) .into(mImageView);
fonte
Em Kotlin você pode fazer o seguinte
Glide.with(context) .setDefaultRequestOptions(RequestOptions().placeholder(R.drawable.ic_image_placeholder).error(R.drawable.ic_image_placeholder)) .load(url) .listener(object : RequestListener<Drawable>{ override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean { return false } override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { return false } }) .into(imageView)
fonte
Antes de chamar o método de menção abaixo, defina a visibilidade da barra de progresso como Visível.
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
fonte
Atualizar:
Glide.with(this) .load(imageUrl) .listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable final GlideException e, final Object model, final Target<Drawable> target, final boolean isFirstResource) { showProgress(false); mNoContentTextView.setVisibility(View.VISIBLE); return false; } @Override public boolean onResourceReady(final Drawable resource, final Object model, final Target<Drawable> target, final DataSource dataSource, final boolean isFirstResource) { showProgress(false); mNoContentTextView.setVisibility(View.GONE); mContentImageView.setImageDrawable(resource); return false; } }) .into(mContentImageView);
fonte
Como eu fiz as coisas. o caminho mais curto, código mais limpo
exemplo:
progress_bar.visibility = View.VISIBLE profilePicturePath?.let { GlideApp.with(applicationContext) .load(CloudStorage.pathToReference(it)) .placeholder(R.drawable.placeholder) .listener(GlideImpl.OnCompleted { progress_bar.visibility = View.GONE }) .into(profile_picture) } ?: profile_picture.setImageResource(R.drawable.placeholder)
uso:
GlideImpl.OnCompleted { // completed }
basta passar
GlideImpl.OnCompleted { }
para o Glide's.listener()
import android.graphics.drawable.Drawable import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target object GlideImpl { object OnCompleted : RequestListener<Drawable> { private lateinit var onComplete: () -> Unit operator fun invoke(onComplete: () -> Unit): OnCompleted { OnCompleted.onComplete = { onComplete() } return this } override fun onResourceReady( resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { onComplete() return false } override fun onLoadFailed( e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean ): Boolean { onComplete() return false } } }
e é isso!
fonte
Maneira Kotlin
Glide.with(context) .load(image_url) .listener(object : com.bumptech.glide.request.RequestListener<Drawable> { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean ): Boolean { return false } override fun onResourceReady( resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { img_product_banner.visibility = View.VISIBLE return false } }).placeholder(R.drawable.placeholder) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(img_product_banner)
fonte
Esta é a melhor resposta, pois não usa nenhum hack como definir a visibilidade para obter a saída desejada.
Baixe um gif da barra de progresso, chame-o
progressbargif
e coloque-o na pasta drawable.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);
Assim que a imagem do url é carregada, a miniatura desaparece. A miniatura desaparece imediatamente quando a imagem em cache é carregada.
fonte
drawable
é ruim porque não é carregado pelo framework, deveria estar dentroraw
ou,assets
na melhor das hipóteses. Não há nada de errado em alterar a visibilidade quando eventos acontecem em seu aplicativo, o Android foi projetado para isso.RESULT
armazenando em cache a barra de progresso, o que significa que vai demorar um pouco para carregar. Os GIFs devem serSOURCE
armazenados em cache, na melhor das hipóteses, para maior eficiência; mas como se trata de um arquivo local, o cache precisa serNONE
para não duplicá-lo no disco, consumindo ainda mais espaço do usuário.