Glide使用探索(四)——自定義顯示控件

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章