原文地址: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結束時已經被回收,這樣可能導致會在錯誤的位置結束更新。