গ্লাইড লাইব্রেরি ব্যবহার করে চিত্র লোডিংয়ের সমাপ্তিতে অগ্রগতির বারের দৃশ্যমানতা সেট করুন


90

হাই, আমি চিত্রটির জন্য একটি অগ্রগতি বার পেতে চাই যা চিত্র লোড করার সময় প্রদর্শিত হবে তবে যখন চিত্র লোডিংটি শেষ হবে আমি এটিকে সেট করতে চাই। আগে আমি এর জন্য পিকাসোর লাইব্রেরিটি ব্যবহার করছিলাম। তবে কীভাবে এটি গ্লাইড লাইব্রেরি সহ ব্যবহার করতে হয় তা আমি জানি না। আমার ধারণা আছে যে কিছু সংস্থান রেডি ফাংশন রয়েছে তবে আমি কীভাবে এটি ব্যবহার করব তা জানি না। আমাকে কি কেউ সাহায্য করতে পারবেন?

পিকাসো লাইব্রেরির জন্য কোড

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.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
     .into(imageView);

আমি গ্লাইডের সাহায্যে এটি দ্বারা চিত্র লোড করতে সক্ষম হয়েছি progressBar.setVisibility(View.GONE);তবে চিত্রটি লোড হয়ে গেলে আমি কোডে কোথাও কীভাবে লিখব ?


4
আপনি কেন আপনার গ্রন্থাগারটি পরিবর্তন করলেন? পিকাসো দুর্দান্ত।
তাসোমানিয়াক

আপনার কাছে লাইব্রেরি পরিবর্তনের উপযুক্ত কারণ না থাকলে আমি পিকাসোর সাথে লেগে থাকার সুপারিশ করব
ক্রিস

উত্তর:


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

আপনি যদি অ্যানিমেশন নিজেই হ্যান্ডেল করতে চান এবং সত্য যদি আপনার পক্ষে হ্যান্ডেল করার জন্য গ্লাইড চান তবে সত্য হন return


13
লুকানোর কথা বিবেচনা progressBarমধ্যে onExceptionপাশাপাশি, অন্যথায় এটি অনির্দিষ্টকালের জন্য মিথ্যা আশা দান ঘুর্ণন করব। একবার onExceptionবলা হয় গ্লাইড যা যা পাস তা সেট করা ছাড়া আর কিছুই করবে না .error()
TWiStErRob

4
চিত্রটি লোড হওয়ার আগে আপনি খণ্ড / ক্রিয়াকলাপটি ছেড়ে দিলে এটি একটি নালপয়েন্টার এক্সসেপশনের ফলাফল করতে পারে।
এপ্রোপারফক্স

4
আমি আপনাকে অভ্যন্তরীণ-শ্রেনীর শ্রোতা তৈরির জন্য আন্দোলন করছি না, টাস্কটি সম্পাদনের জন্য কোনও সরঞ্জাম দেখানোর সর্বাধিক সংক্ষিপ্ত উপায়।
ইয়ারোস্লাভ

4
নিশ্চিত বিষয়, আমি গ্লাইড.ক্লায়ার (আপনার আইজ্যামভিউ)
সুপারমার্কের

7
দ্রষ্টব্য: .listenerঅবশ্যই আগে কল করতে হবে.into()
আহমেদ মোস্তফা

31

আপনি যদি কেটলিনে এটি করতে চান তবে আপনি সেভাবে চেষ্টা করতে পারেন:

    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)

4
টার্গেট আমদানি import com.bumptech.glide.request.target.Target
করাও

@ গিবল্ট এটি সরাসরি 10 মিনিটের জন্য আমাকে
জড়ো করে যাচ্ছিল

17

আমার উত্তর পুরানো তারিখের পিপিআইয়ের উপর ভিত্তি করে ছিল। আরও আপ-টু-ডেট উত্তরের জন্য এখানে দেখুন ।


.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

উপরের সমাধানটি আমার পক্ষে খুব ভাল কাজ করে তবে আমি যখন চিত্রটি ডাউনলোড করতে বিটম্যাপ () ব্যবহার করি । এটা কাজ করে না.

আমাদের বিটম্যাপআইমেজভিউ টার্গেট ব্যবহার করা দরকার

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

গ্লাইডড্র্যাবেবল অবমূল্যায়ন করা হয়, সাধারণ অঙ্কনযোগ্য ব্যবহার করুন

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

কোটলিনে আপনি নীচের মত করতে পারেন

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. এক্সএমএলে উচ্চতা এবং প্রস্থ (ম্যাচ_পিতা) সাথে অগ্রগতি বারটি নিন।
  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
    

আপনার উত্তরটি কীভাবে স্ট্যাকওভারফ্লো . com/a/31675796/3812404 থেকে আলাদা ? এছাড়াও, পয়েন্ট 1 প্রয়োজন হয় না।
হরিরাম

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

বলুন, আপনার যদি ইতিমধ্যে অন রিসোর্সরেডি থাকে তবে "ইন" এর ব্যবহার কী? আমি কি কেবল শ্রোতাকে একা ব্যবহার করতে পারি না? যদি তা হয় তবে আমি কীভাবে এটিকে "এর মধ্যে" লোড করা শুরু করতে পারি?
অ্যান্ড্রয়েড বিকাশকারী

@android ডেভেলপার আমি জানি আপনি মধ্যে ছাড়া ব্যবহার করতে পারেন
Narek Hayrapetyan

এটি চেষ্টা করে দাঁড়িয়েছে
নরেক হায়রাপেটিয়ান

তবে আমি যদি "মধ্যে" ব্যবহার না করি তবে আমার মনে হয় এটি এটি সম্পর্কে সতর্ক করে।
অ্যান্ড্রয়েড বিকাশকারী

1

আমি কীভাবে জিনিসগুলি করেছি। আরও ছোট উপায়, ক্লিনার কোড er

উদাহরণ:

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 { }গ্লাইডে পাস.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
        }
    }
}

আর এটাই!


0

কোটলিন পথ

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

পছন্দসই ফলাফলটি নির্ধারণের মতো কোনও হ্যাক ব্যবহার না করায় এটি সেরা উত্তর desired

প্রগতিবারের একটি জিআইএফ ডাউনলোড করুন এবং এটিকে কল করুন 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);

ইউআরএল চিত্রটি লোড হয়ে গেলে থাম্বনেইল অদৃশ্য হয়ে যায়। ক্যাশেড চিত্রটি লোড হওয়ার সাথে সাথে থাম্বনেইল অদৃশ্য হয়ে যায়।


4
আমি মনে করি কারণ এটি প্রশ্নের উত্তর দিচ্ছে না: ওপি এর মধ্যে ইতিমধ্যে একজন স্পিনার রয়েছে যার সাথে তিনি খুশি। এটি অ্যান্ড্রয়েড সেরা অনুশীলনের বিরুদ্ধেও: জিআইএফকে স্পিনার হিসাবে ব্যবহার করা 90s এর মতো এবং এপিএলের আকার উল্লেখযোগ্যভাবে বৃদ্ধি করে; এবং একটি জিআইএফ লাগানো drawableনিজের মধ্যে খারাপ কারণ এটি কাঠামোর দ্বারা লোড হয় না, এটি সেরা rawবা assetsসর্বোত্তম হওয়া উচিত । আপনার অ্যাপ্লিকেশনগুলিতে ইভেন্টগুলি ঘটলে দৃশ্যমানতা পরিবর্তন করার কোনও সমস্যা নেই, অ্যান্ড্রয়েড তার জন্য ডিজাইন করা হয়েছে।
TWiStErRob 5:37

4
জিআইএফ ডিকোডিংয়ের সময় ব্যবহারকারী খালি জায়গাও দেখতে পাবে, এটি অ্যাসিঙ্ক এবং তাত্ক্ষণিকভাবে নয়। আপনি RESULTপ্রগতি-বারটিও ক্যাচ করছেন যার অর্থ এটি লোড হতে সময় লাগবে। SOURCEদক্ষতার জন্য জিআইএফগুলি সর্বোত্তমভাবে ক্যাচ করা উচিত ; তবে এটি যেহেতু একটি স্থানীয় ফাইল, তাই ক্যাশেটিকে NONEডিস্কে এটির সদৃশ করার দরকার নেই, আরও বেশি ব্যবহারকারীর স্থান গ্রহণ করে।
TWiStErRob 5:37
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.