private SimpleTarget target = new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
// do something with the bitmap
// for demonstration purposes, let's just set it to an ImageView
imageView1.setImageBitmap( bitmap );
}
};
private void loadImageSimpleTarget() {
Glide.with(context)
.load(uri)
.override(600, 600)
.fitCenter()
.into(target);
}
J'ai essayé de le convertir en Kotlin comme suit.
val finish_target = object : SimpleTarget<Bitmap>() {
override fun onResourceReady(bitmap: Bitmap?, glideAnimation: GlideAnimation<in Bitmap>?) {
preview_image.setImageBitmap(bitmap)
}
}
Glide.with(context)
.load(uri)
.override(600, 600)
.fitCenter()
.into(finish_target)
Mais l'erreur de compilation montre que
public open fun <Y : Target<GlideDrawable!>!> into(target: (???..???)): (???..???) defined in com.bumptech.glide.DrawableRequestBuilder
public open fun into(view: ImageView!): Target<GlideDrawable!>! defined in com.bumptech.glide.DrawableRequestBuilder
Merci de bien vouloir m'aider à résoudre ce problème.
Glide.with(context)
.load(url)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(p0: GlideException?, p1: Any?, p2: Target<Drawable>?, p3: Boolean): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onResourceReady(p0: Drawable?, p1: Any?, p2: Target<Drawable>?, p3: DataSource?, p4: Boolean): Boolean {
Log.d(TAG, "OnResourceReady")
//do something when picture already loaded
return false
}
})
.into(imgView)
Avec Glide, vous pouvez ajouter Listener à votre chaîne, qui surveille l'état du chargement de votre image. Vous devez remplacer deux méthodes, dans la méthode onResourceReady vous rappelez que votre image est déjà chargée et vous pouvez faire quelque chose, par exemple masquer le chargeur ou laisser terminer l'animation à partir d'une autre vue. Dans onLoadFailed vous obtenez des informations sur une erreur lors du chargement et vous pouvez également réagir d'une manière ou d'une autre. De cette façon, vous pouvez éviter ces erreurs.
Le problème est que dans le Java, vous avez utilisé le type SimpleTarget
comme type de target
. Il s'agit d'un type brut (paramètres génériques manquants), et est l'un des gros problèmes hérités des génériques Java. Kotlin n'autorise pas les types bruts, et c'est pourquoi vous avez rencontré des problèmes lors de la conversion.
Pour résoudre ce problème, vous devez procéder comme suit en Java:
private SimpleTarget<Bitmap> target = new SimpleTarget<Bitmap>() { ... }
Ce qui vous obligera à ajouter asBitmap()
à votre appel Glide:
Glide.with(context)
.load(uri)
.asBitmap()
.override(600, 600)
.fitCenter()
.into(target);
Maintenant que votre code utilise des génériques en toute sécurité, il peut être traduit en Kotlin sans problème:
Glide.with(context)
.load(uri)
.asBitmap()
.override(600, 600)
.fitCenter()
.into<SimpleTarget<Bitmap>>(target)
Pour ceux qui utilisent Glide 3.8:
Glide.with(this)
.load(imgUrl)
.listener(object : RequestListener<String, GlideDrawable> {
override fun onException(e: Exception?, model: String?, target: Target<GlideDrawable>?, isFirstResource: Boolean): Boolean {
return false
}
override fun onResourceReady(resource: GlideDrawable?, model: String?, target: Target<GlideDrawable>?, isFromMemoryCache: Boolean, isFirstResource: Boolean): Boolean {
return false
}
})
.into(image)
Android Studio 3.5 - Kotlin 1.3.41 - Glide 4.9.0
ajoutez cette dépendance à votre build.gradle sous dependencies
:
implémentation 'com.github.bumptech.glide: glide: 4.9.0'
Allez en haut de votre classe et ajoutez ces importations (faites particulièrement attention à la classe target
qui est différente de l'annotation de la classe cible kotlin):
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.gif.GifDrawable
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import Android.graphics.drawable.Drawable
import Android.support.graphics.drawable.Animatable2Compat
J'ai mis un paramètre supplémentaire comme override(600, 600)
, si vous n'avez pas besoin de le supprimer ..
// Start animation
Glide
.with(this)
.load(R.drawable.tossina_pose1)
.centerCrop()
.override(600, 600)
.placeholder(R.drawable.tossina_idle_0)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(p0: GlideException?, p1: Any?, p2: Target<Drawable>?, p3: Boolean): Boolean {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onResourceReady(p0: Drawable?, p1: Any?, p2: Target<Drawable>?, p3: DataSource?, p4: Boolean): Boolean {
(p0 as GifDrawable).setLoopCount(1)
p0.registerAnimationCallback(object : Animatable2Compat.AnimationCallback() {
override fun onAnimationEnd(drawable: Drawable) {
println("animation ends")
}
})
return false
}
})
.into(img)
Quelques indications: R.drawable.tossina_pose1
Est mon GIF, vous pouvez aussi mettre une image locale gif comme cet exemple. La dernière ligne .into(img)
a img
qui est mon imageView
Si vous souhaitez uniquement définir le Bitmap
dans le ImageView
en utilisant Glide
, vous pouvez essayer un Fonction d'extension in Kotlin avec lequel vous n'aurez qu'à passer les paramètres comme uri/url or size
.
Par exemple:
class KotlinActivity : AppCompatActivity() {
var sampleImageView : ImageView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
sampleImageView = findViewById(R.id.imageView) as ImageView?
sampleImageView?.setImage("https://kbob.github.io/images/sample-3.jpg")
}
//Extension function for ImageView
fun ImageView.setImage(url:String, context:Context){
Glide.with(context).load(url).into(this)
}
}