Je charge des images à partir de sources dynamiques et les charge dans mon application. Cependant, parfois, les images sont si petites et semblent mauvaises dans mon application. Ce que je veux faire, c'est obtenir la taille de l'image et si elle est inférieure à 5x5, ne pas afficher du tout l'ImageView.
Comment y parvenir?
Lorsque j'utilise sizeReadyCallback, il renvoie la taille de ImageView au lieu de l'image. Lorsque j'utilise l'écouteur de demande, il renvoie 0,0.
Glide.with(getContext()).load(imageUrl).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) {
//This returns 0,0
Log.e("TAG","_width: " + resource.getBounds().width() + " _height:" +resource.getBounds().height());
return false;
}
}).into(ivImage).getSize(new SizeReadyCallback() {
@Override
public void onSizeReady(int width, int height) {
//This returns size of imageview.
Log.e("TAG","width: " + width + " height: " + height);
}
});
Mise à jour:
Une meilleure solution a été fournie par @TWiStErRob dans les commentaires: meilleure solution
Pour Glide v4:
Glide.with(getContext().getApplicationContext())
.asBitmap()
.load(path)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap,
Transition<? super Bitmap> transition) {
int w = bitmap.getWidth();
int h = bitmap.getHeight()
mImageView.setImageBitmap(bitmap);
}
});
Le point est d'obtenir le bitmap avant de le définir dans un ImageView
.
Cette question est ancienne, mais je suis tombé sur un scénario similaire où je devais vérifier la taille de l'image d'origine. Après quelques recherches, j'ai trouvé ce thread sur Github qui a la solution.
Je vais copier la dernière (glide v4) solution écrite par pandasys.
Ce code est Kotlin mais Java ne devraient avoir aucun problème. Le code pour faire le chargement ressemblerait à quelque chose comme:
Glide.with(activity)
.`as`(Size2::class.Java)
.apply(sizeOptions)
.load(uri)
.into(object : SimpleTarget<Size2>() {
override fun onResourceReady(size: Size2, glideAnimation: Transition<in Size2>) {
imageToSizeMap.put(image, size)
holder.albumArtDescription.text = size.toString()
}
override fun onLoadFailed(errorDrawable: Drawable?) {
imageToSizeMap.put(image, Size2(-1, -1))
holder.albumArtDescription.setText(R.string.Unknown)
}
})
Les options réutilisables sont:
private val sizeOptions by lazy {
RequestOptions()
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.DATA)}
Ma classe de taille est d'environ:
data class Size2(val width: Int, val height: Int) : Parcelable {
companion object {
@JvmField val CREATOR = createParcel { Size2(it) }
}
private constructor(parcelIn: Parcel) : this(parcelIn.readInt(), parcelIn.readInt())
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeInt(width)
dest.writeInt(height)
}
override fun describeContents() = 0
override fun toString(): String = "$width x $height"
}
Voici la partie pertinente de mon AppGlideModule
class BitmapSizeDecoder : ResourceDecoder<File, BitmapFactory.Options> {
@Throws(IOException::class)
override fun handles(file: File, options: Options): Boolean {
return true
}
override fun decode(file: File, width: Int, height: Int, options: Options): Resource<BitmapFactory.Options>? {
val bmOptions: BitmapFactory.Options = BitmapFactory.Options()
bmOptions.inJustDecodeBounds = true
BitmapFactory.decodeFile(file.absolutePath, bmOptions)
return SimpleResource(bmOptions)
}
}:
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.prepend(File::class.Java, BitmapFactory.Options::class.Java, BitmapSizeDecoder())
registry.register(BitmapFactory.Options::class.Java, Size2::class.Java, OptionsSizeResourceTranscoder())
class OptionsSizeResourceTranscoder : ResourceTranscoder<BitmapFactory.Options, Size2> {
override fun transcode(resource: Resource<BitmapFactory.Options>, options: Options): Resource<Size2> {
val bmOptions = resource.get()
val size = Size2(bmOptions.outWidth, bmOptions.outHeight)
return SimpleResource(size)
}
}
Revenons donc à la question d'origine, onResourceReady
rappel, vous pouvez vérifier la largeur et la hauteur et décider si vous montrez ou non l'image