Скользящий обратный вызов после успеха в Котлине
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);
}
Я попытался преобразовать его в Kotlin, как показано ниже.
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)
Но ошибка компиляции показывает, что
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
Пожалуйста, помогите мне, как решить эту проблему.
4 ответа
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)
С Glide вы можете добавить Listener в свою цепочку, которая отслеживает состояние загрузки вашего изображения. Вы должны переопределить два метода, в методе onResourceReady у вас есть обратный вызов, что ваше изображение уже загружено, и вы можете что-то сделать, например, скрыть загрузчик или позволить завершить анимацию из другого представления. В onLoadFailed вы получаете информацию о какой-то ошибке при загрузке, а также вы можете как-то реагировать. Таким образом, вы можете избежать этих ошибок.
Android Studio 3.5 - Kotlin 1.3.41 - Glide 4.9.0
добавить эту зависимость в ваш build.gradle под
dependencies
:реализация 'com.github.bumptech.glide:glide:4.9.0'
Перейдите к началу вашего класса и добавьте этот импорт (обратите особое внимание на target
класс, который отличается от аннотации целевого класса 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
Я поставил дополнительный параметр как override(600, 600)
, если вам не нужно удалить его..
// 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)
Некоторые показания:R.drawable.tossina_pose1
это мой GIF, вы также можете поместить GIF локальное изображение, как в этом примере. Финальная строка .into(img)
имеют img
это мое imageView
Проблема в том, что в коде Java вы использовали тип SimpleTarget
как тип target
, Это необработанный тип (отсутствуют общие параметры), и он является одной из самых серьезных проблем в универсальных форматах Java. Kotlin не допускает необработанные типы, и поэтому у вас возникли проблемы при конвертации.
Чтобы это исправить, вы должны сделать следующее в Java:
private SimpleTarget<Bitmap> target = new SimpleTarget<Bitmap>() { ... }
Что заставит вас добавить asBitmap()
на ваш Glide вызов:
Glide.with(context)
.load(uri)
.asBitmap()
.override(600, 600)
.fitCenter()
.into(target);
Теперь, когда ваш код безопасно использует дженерики, его можно без проблем перевести на Kotlin:
Glide.with(context)
.load(uri)
.asBitmap()
.override(600, 600)
.fitCenter()
.into<SimpleTarget<Bitmap>>(target)
Для тех, кто использует 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)
Если вы хотите установить Bitmap
в ImageView
с помощью Glide
тогда вы можете попробовать функцию расширения в Kotlin, с которой вам нужно будет только передать параметры, такие как uri/url or size
,
Например:
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)
}
}