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
请帮助我解决这个问题。
答案 0 :(得分:5)
问题是在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)
答案 1 :(得分:3)
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,您可以将监听器添加到您的链中,该链监控图像加载的状态。您必须覆盖两个方法,在 onResourceReady 方法中,您已回调图像已加载并且您可以执行某些操作,例如隐藏加载程序或从另一个视图中完成动画。 在 onLoadFailed 中,您可以获得有关加载时出现错误的信息,也可以以某种方式做出反应。这样您就可以避免这些错误。
答案 2 :(得分:3)
For those who are using 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)
答案 3 :(得分:1)
Android Studio 3.5-科特林 1.3.41-滑行 4.9.0
将此依赖项添加到dependencies
下的build.gradle中:
实现'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)
的{{1}}是我的img
答案 4 :(得分:0)
如果您只想使用Bitmap
将ImageView
设置为Glide
,那么您可以尝试使用 Kotlin 中的Extension Function您只需要传递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)
}
}