美文网首页
关于Glide使用

关于Glide使用

作者: 钦_79f7 | 来源:发表于2019-12-18 11:31 被阅读0次

    自定义Target

    除了可以加载图像,视频剧照,gif动画到View中,你还可以加载他们到实现了Target接口的自定义目标中。

    SimpleTarget

    如果你只是想加载一个Bitmap,并不想直接展示给用户而是有一些特殊用途,比如在通知栏中显示或者作为头像上传。 Glide也可以做到。 SimpleTarget为Target接口提供了大部分的默认实现。你可以专注于处理加载的结果。 为了使用SimpleTarget,你需要在它的构造函数中提供你要加载的资源的宽和高(单位像素),你还需要实现onResourceReady(T resource, GlideAnimation animation)方法。 一个典型的使用SimpleTarget的例子如下:

    int myWidth = 512;
    int myHeight = 384;
    
    Glide.with(yourApplicationContext))
        .load(youUrl)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>(myWidth, myHeight) {
            @Override
            public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
                // Do something with bitmap here.
            }
        };
    

    ==如果回调返回的是Bitmap .asBitmap()是必须的,否则会报错==

    一些警告

    正常情况下,你加载一个资源会把他们放到view中。当你的Activity或者Fragment被pause或者destroy时,Glide会暂停或取消加载,确保你不会加载那些根本不会显示的资源。 可是当我们使用SimpleTarget的时候,这可能并不是我们希望的行为。所以,当你调用Glide.with(context)的时候,你可以传入Application的context,而不是传入Activity或者Fragment。 此外,考虑到长时间的加载操作可能导致内存泄漏,请考虑使用静态内部类,而不是匿名内部类。

    ViewTarget

    如果你想加载一个图片到View中,但是你想观察或者覆盖Glide的默认行为。你可以覆盖ViewTarget或者它的子类。 当你想让Glide来获取view的的大小,但是由自己来启动动画和设置资源到view中,ViewTarget是个不错的选择。如果你要加载一个图片到ImageView之外的自定义view中,那么ImageViewTarget或者它的子类就不能满足你的要求,此时继承ViewTarget就特别合适。 你可以静态的定义一个ViewTarget的子类,或者传递一个匿名内部类到你的加载调用里:

    Glide.with(yourFragment)
        .load(yourUrl)
        .into(new ViewTarget<YourViewClass, GlideDrawable>(yourViewObject) {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation anim) {
                YourViewClass myView = this.view;
                // Set your resource on myView and/or start your animation here.
            }
        });
    

    ==如果想要回调返回的是Drawable,那么你需要传入泛型GlideDrawable,否则会报错;然后利用glideDrawable.getCurrent()得到Drawable对象==

    注意,如果你想指定加载Bitmap还是GifDrawable,请在.load(yourUrl)调用后面直接添加.asBitmap()或者.asGif(),同时将ViewTarget的类型参数GlideDrawable换成对应加载的类型。 为了更多控制,你也可以在Target实现LifecycleListener回调,onStart()、onStop()或者onDestroy()会和你view所在的fragment的生命周期保持同步。

    覆盖默认行为

    如果你只想观察不想修改Glide的默认行为,你可以继承任何一个Glide对ImageViewTargets的默认实现。

    GlideDrawableImageViewTarget - 默认的Target,用于正常的加载和asGif()。
    BitmapImageViewTarget - 当使用asBitmap()加载时,使用的默认Target。
    只有你在每个方法里面调用super(),将会保留默认的行为,同时还可以添加一些你希望的功能。

    例如,想要生成一个调色板,你可以这样做。

    Glide.with(yourFragment)
        .load(yourUrl)
        .asBitmap()
        .into(new BitmapImageViewTarget(yourImageView)) {
            @Override
            public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
                super.onResourceReady(bitmap, anim);
                Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {  
                    @Override
                    public void onGenerated(Palette palette) {
                        // Here's your generated palette
                    }
                });
            }
        });
    

    虽然这个例子还不错,但是,通常情况下,我不推荐用这个方式生成调色板。请查看Glide的 ResourceTranscoder 接口和.transcode()方法,考虑返回一个包含Bitmap和调色板的自定义资源。调色板可在在后台线程生成

    推荐阅读及参考

    相关文章

      网友评论

          本文标题:关于Glide使用

          本文链接:https://www.haomeiwen.com/subject/oqoynctx.html