Glide4 使用

基本使用
Glide.with(this).load(url).into(imageView);

使用占位符
占位符是當請求正在執(zhí)行時被展示的 Drawable 。當請求成功完成時,占位符會被請求到的資源替換。如果被請求的資源是從內(nèi)存中加載出來的,那么占位符可能根本不會被顯示赖欣。如果請求失敗并且沒有設置 error Drawable ,則占位符將被持續(xù)展示。類似地戈毒,如果請求的url/model為 null ,并且 error Drawable 和 fallback 都沒有設置横堡,那么占位符也會繼續(xù)顯示埋市。

RequestOptions options = new RequestOptions().placeholder(R.drawable.loading);

Glide.with(this).load(url).apply(options).into(imageView);

錯誤占位符
error Drawable 在請求永久性失敗時展示。error Drawable 同樣也在請求的url/model為 null 命贴,且并沒有設置 fallback Drawable 時展示道宅。

RequestOptions options = new RequestOptions()

        .placeholder(R.drawable.ic_launcher_background)

        .error(R.drawable.error);

Glide.with(this).load(url).apply(options).into(imageView);

后備回調(diào)符(Fallback)
fallback Drawable 在請求的url/model為 null 時展示。

Glide.with(fragment).load(url).fallback(R.drawable.fallback).into(view);

占位符是在主線程從Android Resources加載的胸蛛,且Transformation僅被應用于被請求的資源污茵,而不會對任何占位符使用。

指定圖片大小
使用Glide在大多數(shù)情況下我們都是不需要指定圖片大小的葬项,因為Glide會自動根據(jù)ImageView的大小來決定圖片的大小泞当,以此保證圖片不會占用過多的內(nèi)存從而引發(fā)OOM。

RequestOptions options = new RequestOptions().override(200, 100);
Glide.with(this).load(url).apply(options).into(imageView);

加載圖片原始尺寸

RequestOptions options = new RequestOptions().override(Target.SIZE_ORIGINAL);

緩存相關
禁用內(nèi)存緩存

RequestOptions options = new RequestOptions().skipMemoryCache(true);

禁用硬盤緩存

RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE);

硬盤緩存選項

DiskCacheStrategy.NONE: 表示不緩存任何內(nèi)容民珍。

DiskCacheStrategy.DATA: 表示只緩存原始圖片襟士。

DiskCacheStrategy.RESOURCE: 表示只緩存轉(zhuǎn)換過后的圖片。

DiskCacheStrategy.ALL : 表示既緩存原始圖片嚷量,也緩存轉(zhuǎn)換過后的圖片陋桂。

DiskCacheStrategy.AUTOMATIC: 表示讓Glide根據(jù)圖片資源智能地選擇使用哪一種緩存策略(默認選項)。

其中蝶溶,DiskCacheStrategy.DATA對應Glide 3中的DiskCacheStrategy.SOURCE嗜历,DiskCacheStrategy.RESOURCE對應Glide 3中的DiskCacheStrategy.RESULT。而DiskCacheStrategy.AUTOMATIC是Glide 4中新增的一種緩存策略身坐,并且在不指定diskCacheStrategy的情況下默認使用就是的這種緩存策略秸脱。

加載gif

Picasso不支持此功能,glide會自行判斷圖片格式


Glide.with(this).load("http://guolin.tech/test.gif").into(imageView);

如果強制加載靜態(tài)圖片的話

Glide.with(this).asBitmap().load("http://guolin.tech/test.gif").into(imageView);

asGif()強制加載動態(tài)圖

Glide 4中又新增了asFile()方法和asDrawable()方法部蛇,分別用于強制指定文件格式的加載和Drawable格式的加載摊唇。

過渡選項
TransitionOptions 用于決定你的加載完成時會發(fā)生什么
例如交叉淡入效果

Glide.with(fragment).load(url).transition(withCrossFade()).into(view);

變換選項

RequestOptions options = new RequestOptions();
options.centerCrop();

多重變換
默認情況下,每個 transform() 調(diào)用涯鲁,或任何特定轉(zhuǎn)換方法(fitCenter(), centerCrop(), bitmapTransform() etc)的調(diào)用都會替換掉之前的變換巷查。
如果你想在單次加載中應用多個變換有序,請使用 MultiTransformation 類,或其快捷方法 .transforms() 岛请。

Glide.with(fragment)
  .load(url)
  .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
  .into(imageView);

—————————————————
apply()方法可以被調(diào)用多次旭寿,因此 RequestOption 可以被組合使用。如果 RequestOptions 對象之間存在相互沖突的設置崇败,那么只有最后一個被應用的 RequestOptions 會生效盅称。

Transformation可以復用
在多個加載中復用 Transformation 應當總是安全的
在Glide中,當你為一個 ImageView 開始加載時后室,Glide可能會自動應用 FitCenter 或 CenterCrop 缩膝,這取決于view的 ScaleType 。如果 scaleType 是 CENTER_CROP , Glide 將會自動應用 CenterCrop 變換岸霹。如果 scaleType 為 FIT_CENTER 或 CENTER_INSIDE 疾层,Glide會自動使用 FitCenter 變換。
—————————————————

圖片url存在token


public class MyGlideUrl extends GlideUrl {

    private String mUrl;

    public MyGlideUrl(String url) {

        super(url);

        mUrl = url;

    }

    @Override

    public String getCacheKey() {

        return mUrl.replace(findTokenParam(), "");

    }

    private String findTokenParam() {

        String tokenParam = "";

        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");

        if (tokenKeyIndex != -1) {

            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);

            if (nextAndIndex != -1) {

                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);

            } else {

                tokenParam = mUrl.substring(tokenKeyIndex);

            }

        }

        return tokenParam;

    }

}

Glide.with(this).load(newMyGlideUrl(url)).into(imageView);

利用Glide將圖片加載到不同控件或加載成不同使用方式
(1)拿到圖片實例

//1贡避、通過自己構造 target 可以獲取到圖片實例
SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        imageView.setImageDrawable(resource);
    }
};

//2痛黎、將圖片實例記載到指定的imageview上,也可以做其他的事情
public void loadImage(View view) {
    String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
    Glide.with(this)
         .load(url)
         .into(simpleTarget);
}

將圖片加載到任何位置

/*
*將圖片加載為控件背景
*/
public class MyLayout extends LinearLayout {

    private ViewTarget<MyLayout, GlideDrawable> viewTarget;

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
                MyLayout myLayout = getView();
                myLayout.setImageAsBackground(resource);
            }
        };
    }

    public ViewTarget<MyLayout, GlideDrawable> getTarget() {
        return viewTarget;
    }

    public void setImageAsBackground(GlideDrawable resource) {
        setBackground(resource);
    }

}


//引用圖片到指定控件作為背景
public class MainActivity extends AppCompatActivity {

    MyLayout myLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myLayout = (MyLayout) findViewById(R.id.background);
    }

    public void loadImage(View view) {
        String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
        Glide.with(this)
             .load(url)
             .into(myLayout.getTarget());
    }

}

————————————————————————————

圖片預加載

Glide.with(this).load("http://guolin.tech/book.png") .preload();

preload()方法有兩個方法重載刮吧,一個不帶參數(shù)湖饱,表示將會加載圖片的原始尺寸,另一個可以通過參數(shù)指定加載圖片的寬和高皇筛。

into()方法


SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {

    @Override

    public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {

        imageView.setImageDrawable(resource);

    }

};

public void loadImage(View view) {

    Glide.with(this)

        .load("http://guolin.tech/book.png")

        .into(simpleTarget);

}

submit()方法
submit()方法其實就是對應的Glide 3中的downloadOnly()方法琉历,和preload()方法類似,submit()方法也是可以替換into()方法的水醋。這個方法只會下載圖片旗笔,而不會對圖片進行加載。當圖片下載完成之后拄踪,我們可以得到圖片的存儲路徑蝇恶,以便后續(xù)進行操作。


public void downloadImage() {

    new Thread(new Runnable() {

        @Override

        public void run() {

            try {

                String url = "http://www.guolin.tech/book.png";

                final Context context = getApplicationContext();

                FutureTarget<File> target = Glide.with(context)

                        .asFile()

                        .load(url)

                        .submit();

                final File imageFile = target.get();

                runOnUiThread(new Runnable() {

                    @Override

                    public void run() {

                        Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();

                    }

                });

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }).start();

}

當調(diào)用了submit()方法后會立即返回一個FutureTarget對象惶桐,然后Glide會在后臺開始下載圖片文件撮弧。接下來我們調(diào)用FutureTarget的get()方法就可以去獲取下載好的圖片文件了,如果此時圖片還沒有下載完姚糊,那么get()方法就會阻塞住贿衍,一直等到圖片下載完成才會有值返回。

listener()方法


Glide.with(this)

    .load("http://www.guolin.tech/book.png")

    .listener(new RequestListener<Drawable>() {

        @Override

        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {

            return false;

        }

        @Override

        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {

            return false;

        }

    })

    .into(imageView);

onResourceReady()方法和onLoadFailed()方法都有一個布爾值的返回值救恨,返回false就表示這個事件沒有被處理贸辈,還會繼續(xù)向下傳遞,返回true就表示這個事件已經(jīng)被處理掉了肠槽,從而不會再繼續(xù)向下傳遞擎淤。舉個簡單點的例子奢啥,如果我們在RequestListener的onResourceReady()方法中返回了true,那么就不會再回調(diào)Target的onResourceReady()方法了嘴拢。

定制變換
盡管 Glide 提供了各種各樣的內(nèi)置 Transformation 實現(xiàn)桩盲,如果你需要額外的功能,你也可以實現(xiàn)你自己的 Transformation席吴。

BitmapTransformation
如果你只需要變換 Bitmap赌结,最好是從繼承 BitmapTransformation 開始。BitmapTransformation 為我們處理了一些基礎的東西孝冒,例如姑曙,如果你的變換返回了一個新修改的 Bitmap ,BitmapTransformation將負責提取和回收原始的 Bitmap迈倍。

public class FillSpace extends BitmapTransformation {
    private static final String ID = "com.bumptech.glide.transformations.FillSpace";
    private static final String ID_BYTES = ID.getBytes(STRING_CHARSET_NAME);

    @Override
    public Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        if (toTransform.getWidth() == outWidth && toTransform.getHeight() == outHeight) {
            return toTransform;
        }

        return Bitmap.createScaledBitmap(toTransform, outWidth, outHeight, /*filter=*/ true);
    }

    @Override
    public void equals(Object o) {
      return o instanceof FillSpace;
    }

    @Override
    public int hashCode() {
      return ID.hashCode();
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest)
        throws UnsupportedEncodingException {
      messageDigest.update(ID_BYTES);
    }
}

必需的方法
請?zhí)貏e注意,對于任何 Transformation 子類捣域,包括 BitmapTransformation啼染,你都有三個方法你 必須 實現(xiàn)它們,以使得磁盤和內(nèi)存緩存正確地工作:

equals()
hashCode()
updateDiskCacheKey
如果你的 Transformation 沒有參數(shù)焕梅,通常使用一個包含完整包限定名的 static final String 來作為一個 ID迹鹅,它可以構成 hashCode() 的基礎,并可用于更新 updateDiskCacheKey() 傳入的 MessageDigest贞言。如果你的 Transformation 需要參數(shù)而且它會影響到 Bitmap 被變換的方式斜棚,它們也必須被包含到這三個方法中。

例如该窗,Glide 的 RoundedCorners 變換接受一個 int弟蚀,它決定了圓角的弧度。它的equals(), hashCode() 和 updateDiskCacheKey 實現(xiàn)看起來像這樣:

  @Override
  public boolean equals(Object o) {
    if (o instanceof RoundedCorners) {
      RoundedCorners other = (RoundedCorners) o;
      return roundingRadius == other.roundingRadius;
    }
    return false;
  }

  @Override
  public int hashCode() {
    return Util.hashCode(ID.hashCode(),
        Util.hashCode(roundingRadius));
  }

  @Override
  public void updateDiskCacheKey(MessageDigest messageDigest) {
    messageDigest.update(ID_BYTES);

    byte[] radiusData = ByteBuffer.allocate(4).putInt(roundingRadius).array();
    messageDigest.update(radiusData);
  }

原來的 String 仍然保留酗失,但 roundingRadius 被包含到了三個方法中义钉。這里,updateDiskCacheKey 方法還演示了你可以如何使用 ByteBuffer 來包含基本參數(shù)到你的 updateDiskCacheKey 實現(xiàn)中规肴。

不要忘記 equals() / hashCode()!
值得重申的一點是捶闸,為了讓內(nèi)存緩存正常地工作你是否必須實現(xiàn) equals() 和 hashCode() 方法。很不幸拖刃,即使你沒有復寫這兩個方法删壮,BitmapTransformation 和 Transformation 也能通過編譯,但這并不意味著它們能正常工作兑牡。我們正在探索一些方案央碟,以使在 Glide 的未來版本中,使用默認的 equals() 和 hashCode 方法將拋出一個編譯時錯誤发绢。________________________________________

部分內(nèi)容轉(zhuǎn)自
郭神 Android圖片加載框架最全解析(八)硬耍,帶你全面了解Glide 4的用法

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垄琐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子经柴,更是在濱河造成了極大的恐慌狸窘,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坯认,死亡現(xiàn)場離奇詭異翻擒,居然都是意外死亡,警方通過查閱死者的電腦和手機牛哺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門陋气,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人引润,你說我怎么就攤上這事巩趁。” “怎么了淳附?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵议慰,是天一觀的道長。 經(jīng)常有香客問我奴曙,道長别凹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任洽糟,我火速辦了婚禮炉菲,結果婚禮上,老公的妹妹穿的比我還像新娘坤溃。我一直安慰自己拍霜,他們只是感情好,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布浇雹。 她就那樣靜靜地躺著沉御,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昭灵。 梳的紋絲不亂的頭發(fā)上吠裆,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機與錄音烂完,去河邊找鬼试疙。 笑死,一個胖子當著我的面吹牛抠蚣,可吹牛的內(nèi)容都是我干的祝旷。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怀跛!你這毒婦竟也來了距贷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤吻谋,失蹤者是張志新(化名)和其女友劉穎忠蝗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓拾,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡阁最,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骇两。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片速种。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖低千,靈堂內(nèi)的尸體忽然破棺而出配阵,到底是詐尸還是另有隱情某宪,我是刑警寧澤观蓄,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站个盆,受9級特大地震影響矾芙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜近上,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一剔宪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壹无,春花似錦葱绒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岖是,卻和暖如春帮毁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豺撑。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工烈疚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聪轿。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓爷肝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灯抛,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361