自定义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.
        }
    };

一些警告

正常情况下,你加载一个资源会把他们放到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.
        }
    });

注意,如果你想指定加载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和调色板的自定义资源。调色板可在在后台线程生成。?????更多内容会在以后推出。。。