Glide 라이브러리를 사용하여 이미지로드 완료시 표시되는 진행률 표시 줄의 가시성 설정


90

안녕하세요 이미지 로딩 중에 표시되는 이미지 진행률 표시 줄을 갖고 싶지만 이미지 로딩이 완료되면 사라지도록 설정하고 싶습니다. 이전에 나는 이것을 위해 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() {
           }
        })
;

이제 Glide로 어떻게 할 수 있습니까?

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

Glide를 사용하여 이미지를로드 할 수 있지만 progressBar.setVisibility(View.GONE);이미지가로드되면 코드에서 어딘가에 어떻게 작성할 수 있습니까?


2
도서관을 변경 한 이유는 무엇입니까? 피카소는 훌륭합니다.
tasomaniac 2014 년

당신이 변화 라이브러리에 대한 좋은 이유가없는 나는 또한 피카소와 고집 추천 할 것입니다
크리스

답변:


229

질문은 다소 오래되었고 그 당시 활공으로 상황이 어땠는지 모르겠지만 이제는 듣는 사람과 쉽게 할 수 있습니다 (정답으로 선택한 답변에서 제안 된 것과 같지 않음).

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를 반환합니다.


13
을 숨기는 것을 고려 progressBaronException, 그렇지 않으면 거짓 희망을주는 무한 회전거야, 물론. 일단 onException호출 되면 Glide는 전달 된 것을 설정하는 것 외에는 아무것도하지 않습니다 .error().
TWiStErRob

2
이미지가로드되기 전에 Fragment / Activity를 떠나면 NullPointerException이 발생할 수 있습니다.
aProperFox

1
나는 당신이 내부 클래스 리스너를 만들도록 선동하는 것이 아니라 작업을 완료하기위한 도구를 보여주는 가장 간결한 방법 일뿐입니다.
Yaroslav

1
물론입니다. Glide.clear (yourImageView)
aProperFox

7
참고 : .listener전에 전화해야 함.into()
Ahmed Mostafa

31

KOTLIN에서이 작업을 수행하려면 다음과 같이 시도 할 수 있습니다.

    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)

5
또한 가져 오기 대상 :import com.bumptech.glide.request.target.Target
Gibolt 2010 년

@Gibolt 이것은 10 분 동안 나를
괴롭혔다

17

내 대답은 오래된 API를 기반으로했습니다. 최신 답변 은 여기 를 참조 하십시오 .


.listener()로드 (모델, 메모리 캐시 등)에 대한 더 많은 정보를 받게되므로 더 많은 사용자 지정 로직을 더 쉽게 결정할 수 있으므로 더 좋습니다. RequestListener또한 더 안정적이며, Target만들 항목을 재정의 해도 향후 수정 사항의 이점을 얻지 못합니다. VisibilityListener<T, R>다른 컨텍스트에서 재사용 할 수있는를 쉽게 만들 수도 있습니다 .
TWiStErRob

10

예외적으로 다시 보여주기위한 조건을 두십시오. 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);

7

위의 솔루션은 저에게도 잘 작동하지만 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);
            }
        });

: 내 의견을 참조하십시오 stackoverflow.com/questions/26054420/...을 . 이 대답은 내가 거기에서 말한 것을 잘 보여줍니다.
TWiStErRob

7

GlideDrawable은 더 이상 사용되지 않습니다. 간단한 Drawable을 사용하십시오.

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에서 다음과 같이 할 수 있습니다.

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에서 높이 및 너비 (match_parent)가있는 진행률 표시 줄을 사용합니다.
  2. 메서드를 언급하기 전에 진행률 표시 줄 가시성을 설정하십시오.

    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
    

귀하의 답변이 stackoverflow.com/a/31675796/3812404와 어떻게 다른 가요? 또한 포인트 1은 필요하지 않습니다.
HariRam

2

최신 정보:

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

이미 onResourceReady가있는 경우 "into"의 용도는 무엇입니까? 청취자 만 사용할 수 없습니까? 그렇다면 어떻게 "into"없이로드를 시작할 수 있습니까?
Android 개발자

내가 아는 @ android 개발자없이 사용할 수 있습니다
Narek Hayrapetyan

그것은 시도합니다
Narek Hayrapetyan

그러나 "into"를 사용하지 않으면 그것에 대해 경고하는 것 같습니다.
안드로이드 개발자

1

내가 어떻게했는지. 더 짧은 방법, 깔끔한 코드

예:

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)

용법:

GlideImpl.OnCompleted {
    // completed
}

그냥 GlideImpl.OnCompleted { }Glide의.listener()

Glide의 RequestListener를 허용하는 GlideImpl.kt 클래스

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

그게 다야!


0

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)

-1

원하는 출력을 얻기 위해 가시성을 설정하는 것과 같은 해킹을 사용하지 않기 때문에 이것이 최선의 대답입니다.

진행률 표시 줄의 gif를 다운로드하여 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 이미지가로드되면 썸네일이 사라집니다. 미리보기 이미지는 캐시 된 이미지가로드되면 즉시 사라집니다.


4
나는 그것이 질문에 대답하지 않았기 때문이라고 생각합니다. OP는 이미 그가 만족하는 스피너를 가지고 있습니다. 또한 Android 모범 사례에 위배됩니다. GIF를 스피너로 사용하는 것은 90 초이고 APK 크기를 크게 늘립니다. 과에 GIF 퍼팅 drawable이 프레임 워크에 의해로드되지 있기 때문에 그 자체로 나쁜, 그것은에 있어야 raw또는 assets최상. 앱에서 이벤트가 발생할 때 가시성을 변경하는 데 아무런 문제가 없습니다. Android는이를 위해 설계되었습니다.
TWiStErRob

1
사용자는 또한 GIF 디코딩이 발생하는 동안 빈 공간을 보게 될 것입니다. 이것은 비동기적이고 즉각적이지 않습니다. 또한 RESULT진행률 표시 줄을 캐싱하고 있으므로로드하는 데 시간이 걸립니다. GIF는 SOURCE효율성을 위해 최대한 캐시 되어야합니다 . 그러나 이것은 로컬 파일이기 때문에 캐시는 NONE더 많은 사용자 공간을 사용하여 디스크에 복제하지 않아야합니다.
TWiStErRob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.