原文地址:https://github.com/bumptech/glide/wiki/Custom-targets
一、自定义target
Glide中可以通过自定义的Target的实现来加载多媒体
1.SimpleTarget
若需要加载一张Bitmap并与之交互(如在通知中显示等),就需要用到SimpleTarget。SimpleTarget为一些更大的Target接口提供了默认实现,并使得你只需关注加载结果。
 ;  ;为了使用SimpleTarget,你需要在SimpleTarget的构造函数中传入欲加载资源的高宽(单位:像素),并实现onResourceReady(T resource, GlideAnimation animation)方法。
int myWidth = 512;
int myHeigth = 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中。当fragment或activity暂停或销毁时,Glide会暂停或取消资源加载。对于大部分SimpleTarget的实现来说,这种行为并不好,所以这种情况下,最好在Glide.with(context)中传入应用的Application而不是fragment或activity。
此外,由于长时间运行的操作容易照成内存泄漏,因此,这种情况下,考虑使用静态内部类取代匿名内部类。
2.ViewTarget
若存在当view加载图片时观察或重写Glide的一些默认行为的需求,可以重写ViewTarget或其子类。
若需要加载动态图片或在自定义控件中加载图片时并且Glide内置的ImageViewTarget及其子类无法适配时,就需要自定义ViewTarget子类。
可以通过定义一个静态子类或匿名内部类的方式实现此功能。
Glide.with(yourFragment)
.load(yourUrl)
.into(new ViewTarget<YourViewClass, GlideDrawable>(yourViewObject) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation anim) {
YourViewClass myView = this.view;
}
});
注意:若需要加载Bitmap或GifDrawable,需要在.load(yourUrl)
后加.asBitmap()
或.asGif()
方法,并将GlideDrawable替换为你实际加载的类型。
可以通过实现Target的LifecycleListener回调实现更多控制,如onStart()
,onStop()
,onDestory()
方法,这些方法将在包含你的控件的Fragment的生命周期中同步调用。
二、重新默认行为
若你只需要观察Glide的默认行为而非改变它,可以通过继承ImageViewTarget的两个子类实现:
1) GlideDrawableImageViewTarget:默认加载asGif()
的Target
2) BitmapImageViewTarget:默认加载asBitmap()
的Target
在onResourceReady方法中调用super可以保留默认的行为,并在调用super后可以添加任何你所需要的功能。
如生成Palette:
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
}
});
}
});
注意:上面仅仅是个例子,不建议通过这样的方式生成Palette。可以通过Glide的ResourceTranscoder接口以及.transcode()
方法在后台返回一个包含Bitmap与Palette的资源。上例的一个错误是关于一步操作:ViewHolder可以在Palette结束时已经被回收,这样可能导致会在错误的位置结束更新。