在Kotlin成功后滑行回调

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)

请帮助我如何解决这个问题.

Ale*_*ano 8

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


zsm*_*b13 5

问题是在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)


Pau*_*ina 5

 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中,您可以获得有关加载时某些错误的信息,并且您可以以某种方式做出反应。这样您可以避免这些错误。

  • 请记住“Target”是 kotlin 注释,因此您必须使用“com.bumptech.glide.request.target.Target&lt;Drawable&gt;” (8认同)