Hai, saya ingin memiliki bilah kemajuan untuk gambar yang akan ditampilkan saat pemuatan gambar tetapi ketika pemuatan gambar selesai saya ingin mengaturnya agar hilang. Sebelumnya saya menggunakan perpustakaan Picasso untuk ini. Tapi saya tidak tahu bagaimana menggunakannya dengan perpustakaan Glide. Saya memiliki gagasan bahwa beberapa fungsi siap sumber daya ada di sana tetapi saya tidak tahu bagaimana menggunakannya. Ada yang bisa bantu saya?
Kode untuk Perpustakaan 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() {
}
})
;
Sekarang Bagaimana Saya Dapat Melakukan Ini dengan Glide?
Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
.into(imageView);
Saya dapat memuat gambar dengan ini dengan Glide tetapi bagaimana saya bisa menulis progressBar.setVisibility(View.GONE);
di suatu tempat dalam kode jika gambar dimuat?
android
imageview
android-glide
HariRam
sumber
sumber
Jawaban:
Pertanyaan agak lama, dan saya tidak tahu apa situasi dengan glide pada masa itu, tetapi sekarang dapat dengan mudah dilakukan dengan pendengar (tidak seperti yang diusulkan dalam jawaban yang dipilih sebagai benar).
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) ;
Anda mengembalikan true jika ingin menangani hal-hal seperti animasi sendiri dan false jika ingin meluncur untuk menanganinya.
sumber
progressBar
dalamonException
juga, jika tidak maka akan berputar tanpa batas dan memberikan harapan palsu. SetelahonException
disebut Glide tidak akan melakukan apa pun selain mengatur apa yang diteruskan.error()
..listener
harus dipanggil sebelumnya.into()
Jika Anda ingin melakukan ini di KOTLIN, Anda dapat mencobanya dengan cara:
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)
sumber
import com.bumptech.glide.request.target.Target
Jawaban saya didasarkan pada API yang sudah ketinggalan zaman. Lihat di sini untuk jawaban yang lebih mutakhir.
sumber
.listener()
lebih baik karena Anda akan menerima lebih banyak informasi tentang pemuatan Anda (model, cache memori, ...) sehingga lebih mudah untuk memutuskan lebih banyak logika kustom.RequestListener
juga lebih stabil, menimpa yangTarget
akan dibuat tidak akan memberi Anda manfaat untuk perbaikan di masa mendatang. Anda juga dapat dengan mudah membuatVisibilityListener<T, R>
yang dapat digunakan kembali dalam konteks yang berbeda.Dalam pengecualian, berikan syarat untuk menampilkan lagi
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);
sumber
Solusi di atas bekerja cukup baik untuk saya juga, tetapi ketika saya menggunakan asBitmap () untuk mengunduh gambar. Tidak bekerja.
Kita perlu menggunakan 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); } });
sumber
GlideDrawable tidak digunakan lagi, gunakan Drawable sederhana
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);
sumber
Di Kotlin Anda bisa melakukan seperti di bawah ini
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)
sumber
Sebelum panggilan di bawah menyebutkan metode, atur visibilitas bilah kemajuan Terlihat.
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
sumber
Memperbarui:
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);
sumber
Bagaimana saya melakukan sesuatu. cara yang lebih pendek, kode yang lebih bersih
contoh:
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)
pemakaian:
GlideImpl.OnCompleted { // completed }
langsung saja
GlideImpl.OnCompleted { }
ke 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 } } }
dan itu dia!
sumber
Cara 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)
sumber
Ini adalah jawaban terbaik karena tidak menggunakan peretasan seperti mengatur visibilitas untuk mendapatkan hasil yang diinginkan.
Unduh gif dari bilah kemajuan dan panggil
progressbargif
dan taruh di folder 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);
Setelah gambar url dimuat, thumbnail menghilang. Thumbnail langsung hilang saat gambar cache dimuat.
sumber
drawable
dalam itu sendiri buruk karena tidak dimuat oleh kerangka kerja, seharusnya dalamraw
atau yangassets
terbaik. Tidak ada yang salah dengan mengubah visibilitas saat peristiwa terjadi di aplikasi Anda, Android dirancang untuk itu.RESULT
-caching bilah kemajuan yang berarti perlu beberapa saat untuk memuat. GIF sebaiknya di-SOURCE
cache untuk efisiensi; tetapi karena ini adalah file lokal, cache harusNONE
tidak menduplikasinya di disk, sehingga menghabiskan lebih banyak ruang pengguna.