Glide kitaplığını kullanarak görüntü yüklemesinin tamamlanmasının ardından ilerleme çubuğunun görünürlüğünü ayarlayın


90

Merhaba Resim yüklenirken gösterilecek resim için bir ilerleme çubuğuna sahip olmak istiyorum, ancak resim yükleme tamamlanınca gitmiş olarak ayarlamak istiyorum. Daha önce bunun için Picasso kütüphanesini kullanıyordum. Ancak Glide kitaplığıyla nasıl kullanılacağını bilmiyorum. Kaynağa hazır bir işlevin orada olduğu fikrindeyim ama nasıl kullanacağımı bilmiyorum. Biri bana yardım edebilir mi?

Picasso Kitaplığı Kodu

Picasso.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
       .into(imageView, new Callback() {
           @Override
           public void onSuccess() {
               progressBar.setVisibility(View.GONE);
           }

           @Override
           public void onError() {
           }
        })
;

Şimdi Glide ile bunu nasıl yapabilirim?

Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
     .into(imageView);

Glide ile bu şekilde görüntü yükleyebiliyorum, ancak progressBar.setVisibility(View.GONE);görüntü yüklenirse kodda bir yere nasıl yazabilirim ?


2
Kitaplığınızı neden değiştirdiniz? Picasso harika.
tasomaniac

Kitaplıkları değiştirmek için iyi bir nedeniniz yoksa Picasso'ya bağlı kalmanızı da tavsiye ederim
Chris

Yanıtlar:


232

Soru oldukça eski ve o zamanlar süzülme durumunun ne olduğunu bilmiyorum, ancak şimdi dinleyici ile kolayca yapılabilir (doğru olarak seçilen yanıtta önerildiği gibi değil).

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)
;

Animasyonlar gibi şeyleri kendi başınıza halletmek istiyorsanız doğru, sizin için kayarak onları halletmek istiyorsanız yanlış olarak geri dönersiniz.


13
Gizleme düşünün progressBariçinde onExceptionaksi takdirde yanlış umut vererek süresiz dönmeye edeceğiz sıra. Bir kez onExceptionGlide denildiğinde, geçişi ayarlamaktan başka bir şey yapmaz .error().
TWiStErRob

2
Görüntü yüklenmeden önce Fragment / Activity'den ayrılırsanız, bu bir NullPointerException ile sonuçlanabilir.
aProperFox

1
Sizi sınıf içi dinleyiciler yaratmanız için kışkırtmıyorum, sadece görevi tamamlamak için bir araç göstermenin en özlü yolunu.
Yaroslav

1
Elbette, süper çağrıdan önce onDestroyVIew () 'e Glide.clear (yourImageView)
aProperFox

7
NOT: .listenerönceden .into()
Ahmed Mostafa

31

Bunu KOTLIN'de yapmak istiyorsanız, şu şekilde deneyebilirsiniz:

    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)

7
Ayrıca Hedefi içe aktarmanız gerekiyor:import com.bumptech.glide.request.target.Target
Gibolt

@Gibolt bu beni 10 dakika
aralıksız rahatsız ediyordu

17

Cevabım süresi geçmiş API'lara dayanıyordu. Daha güncel yanıt için buraya bakın .


.listener()daha iyidir çünkü yükünüz (model, bellek önbelleği, ...) hakkında daha fazla bilgi alırsınız, bu nedenle daha özel mantığa karar vermek daha kolaydır. RequestListenerayrıca daha kararlıdır, hangisinin Targetoluşturulacağını geçersiz kılmak size gelecekteki düzeltmelerden yararlanmanızı sağlamaz. Ayrıca VisibilityListener<T, R>, farklı bağlamlarda yeniden kullanabileceğiniz bir şeyi kolayca oluşturabilirsiniz .
TWiStErRob

10

İstisna olarak tekrar göstermek için bir koşul koyun 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);

8

Yukarıdaki çözüm benim için de oldukça iyi çalışıyor ama asBitmap () kullandığımda resmi indirmek için kullandığımda. İşe yaramıyor.

BitmapImageViewTarget kullanmamız gerekiyor

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

Yorumuma bakın: stackoverflow.com/questions/26054420/… . Bu cevap, orada söylediklerimin iyi bir göstergesidir.
TWiStErRob

7

GlideDrawable kullanımdan kaldırıldı, basit Drawable'ı kullanın

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);

4

Kotlin'de aşağıdakileri yapabilirsiniz

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)

2
  1. Xml'de yükseklik ve genişlik (match_parent) ile ilerleme çubuğunu alın.
  2. Aşağıda bahsetme yöntemini çağırmadan önce, ilerleme çubuğu görünürlüğünü Görünür olarak ayarlayın.

    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
    

Cevabınız stackoverflow.com/a/31675796/3812404'ten ne kadar farklı ? Ayrıca 1. noktaya gerek yoktur.
HariRam

2

Güncelleme:

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);

Zaten onResourceReady'ye sahipseniz, "içine" nin ne faydası var? Dinleyiciyi yalnız kullanamaz mıyım? Öyleyse, içine "girmeden" yüklemeye başlamasını nasıl sağlayabilirim?
android geliştiricisi

@android geliştiricisi, içine girmeden kullanabileceğinizi bildiğim gibi
Narek Hayrapetyan

denemek için duruyor
Narek Hayrapetyan

Ama "içine" kullanmazsam, bunun hakkında uyaracağını düşünüyorum.
android geliştiricisi

1

İşleri nasıl yaptım. daha kısa yol, daha temiz kod

misal:

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)

kullanım:

GlideImpl.OnCompleted {
    // completed
}

sadece GlideImpl.OnCompleted { }Glide's'a geç.listener()

GlideImpl.kt sınıfı Glide'ın RequestListener'ını kabul eder

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
        }
    }
}

Ve işte bu!


0

Kotlin yolu

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)

-1

İstenilen çıktıyı elde etmek için görünürlüğü ayarlamak gibi herhangi bir hile kullanmadığından en iyi cevap budur.

Bir ilerleme progressbargifçubuğu gifini indirin ve çağırın ve çekilebilir klasöre koyun.

        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 görüntüsü yüklendikten sonra küçük resim kaybolur. Küçük resim, önbelleğe alınan görüntü yüklendiğinde hemen kaybolur.


4
Sanırım bunun nedeni şu soruyu cevaplamamasıydı: OP'nin zaten mutlu olduğu bir spinner var. Aynı zamanda Android'in en iyi uygulamalarına da aykırı: GIF'i döndürücü olarak kullanmak 90'lı yıllardır ve APK boyutunu önemli ölçüde artırıyor; ve içine bir GIF koymak drawablekendi başına kötüdür çünkü çerçeve tarafından yüklenmez, içinde rawveya assetsen iyi ihtimalle olmalıdır. Uygulamanızda etkinlikler olduğunda görünürlüğü değiştirmede yanlış bir şey yok, Android bunun için tasarlandı.
TWiStErRob

1
Kullanıcı ayrıca GIF kod çözme işlemi sırasında boş bir alan görecektir, bu eşzamansızdır ve hemen değildir. Ayrıca RESULTilerleme çubuğunu önbelleğe alıyorsunuz, bu da yüklemenin biraz zaman alacağı anlamına geliyor. GIF'ler SOURCEen iyi verimlilik için önbelleğe alınmalıdır ; ancak bu yerel bir dosya olduğu için, önbelleğin NONEonu diskte kopyalamaması ve daha fazla kullanıcı alanı tüketmesi gerekir.
TWiStErRob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.