Tha*_*ung 9 android kotlin android-glide
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);
}
Run Code Online (Sandbox Code Playgroud)
我尝试将其转换为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)
Run Code Online (Sandbox Code Playgroud)
但编译错误表明了这一点
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
Run Code Online (Sandbox Code Playgroud)
请帮助我如何解决这个问题.
Android Studio 3.5 - Kotlin 1.3.41 - Glide 4.9.0
将此依赖项添加到您的 build.gradle 下dependencies:
实现 'com.github.bumptech.glide:glide:4.9.0'
转到类的顶部并添加这些导入(特别注意与targetkotlin 目标类注释不同的类):
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
Run Code Online (Sandbox Code Playgroud)
我已经添加了一些额外的参数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)
Run Code Online (Sandbox Code Playgroud)
一些指示:
R.drawable.tossina_pose1是我的 GIF,你也可以像这个例子一样放入 gif 本地图像。最后一行.into(img)是img我的imageView
问题是在Java代码中,您使用的类型SimpleTarget作为的类型target。这是原始类型(缺少泛型参数),并且是Java泛型中的主要遗留问题之一。Kotlin不允许原始类型,这就是为什么您在转换时遇到问题。
要解决此问题,您应该使用Java执行以下操作:
private SimpleTarget<Bitmap> target = new SimpleTarget<Bitmap>() { ... }
Run Code Online (Sandbox Code Playgroud)
这将迫使您添加asBitmap()到Glide通话中:
Glide.with(context)
.load(uri)
.asBitmap()
.override(600, 600)
.fitCenter()
.into(target);
Run Code Online (Sandbox Code Playgroud)
现在您的代码已安全地使用泛型,因此可以毫无问题地将其转换为Kotlin了:
Glide.with(context)
.load(uri)
.asBitmap()
.override(600, 600)
.fitCenter()
.into<SimpleTarget<Bitmap>>(target)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
使用Glide,您可以将侦听器添加到链中,以监视图像加载的状态。您必须重写两个方法,在onResourceReady方法中,您必须回调图像已加载,并且可以执行某些操作,例如,隐藏加载器或让动画从另一个视图结束。在onLoadFailed中,您可以获得有关加载时某些错误的信息,并且您可以以某种方式做出反应。这样您可以避免这些错误。