Glide — 占位圖 & 漸變動畫
原文:Placeholders & Fade Animations
作者:Norman Peitek
翻譯:Dexter0218
在學習了如何從各種圖片源中加載圖片后,這節(jié)將要學習占位圖——在實際圖片加載完成前預加載的圖片。
Glide 系列概覽
- 入門簡介
- 高級加載
- 適配器(ListView, GridView)
- 占位圖& 淡入淡出動畫
- 圖片大小 & 縮放
- 播放GIF & 視頻
- 緩存基礎
- 請求優(yōu)先級
- 縮略圖
- 回調(diào):定制view中使用SimpleTarget和ViewTarget
- 通知欄和桌面小控件的圖片加載
- 異常: 調(diào)試和報錯處理
- 自定義變換
- 用animate()定制動畫
- 整合網(wǎng)絡協(xié)議棧
- 用Modules定制Glide
- Glide Module 案例: 接受自簽名HTTPS證書
- Glide Module 案例: 自定義緩存
- Glide Module 案例: 通過加載自定義大小圖片優(yōu)化
- 動態(tài)使用 Model Loaders
- 如何旋轉圖片
- 系列綜述
我們根本沒有必要討論或解釋:空白的ImageView在任何UI中看起來都是丑陋的绽昏。如果你在使用Glide,你很可能正在從網(wǎng)絡上加載圖片商模。假如你網(wǎng)絡的環(huán)境不好憔涉,加載過程可能需要花費大量的時間遥椿。這時候就需要一個占位圖先顯示出來楣责,直到實際的圖片加載并處理完畢。
Glide的流接口讓這個工作變得很簡單坯台!只要調(diào)用.placeHolder() 炬丸,并傳遞進去一個圖片資源,Glide會顯示那個占位圖蜒蕾,直到實際圖片準備完畢稠炬。
Glide
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.into(imageViewPlaceholder);
顯然,你不能設置一個網(wǎng)絡的url當作占位圖咪啡。假如那樣首启,占位圖也需要時間去下載。App內(nèi)的資源和圖片毫無疑問是可以使用的撤摸。同時毅桃,由于Glide的load()可以接受各式的參數(shù),這些參數(shù)可能是不能加載的(無網(wǎng)絡連接愁溜,服務器掛了疾嗅,等等),被刪除的或者其他無法訪問的冕象。在下一節(jié)代承,我們會介紹出錯占位圖。
出錯占位圖: .error()
我們假設我們的app嘗試從網(wǎng)頁加載一張圖片渐扮,但網(wǎng)頁不可訪問论悴,Glide會給我們選項去進行出錯的回調(diào),并采取合適的行動墓律。(選項問題以后再討論膀估,目前來說還是比較復雜的)。在大多數(shù)情況下耻讽,占位圖可以完全足夠用來表明圖片無法加載察纯。
跟之前栗子中預加載的占位圖一樣,調(diào)用Glide的流接口即可针肥,只是有命名上有點不一樣饼记,叫error():
Glide
.with(context)
.load("http://futurestud.io/non_existing_image.png")
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded
.into(imageViewError);
上面的代碼中,如果從load()里傳入的圖片無法被加載慰枕,Glide會顯示R.mipmap.future_studio_launcher來代替具则。再次強調(diào)一下,error()可以接受的只能是已經(jīng)被初始化的圖片資源或者指向圖片資源的id(R.drawable.<drawable-keyword>)具帮。
crossFade()的使用
無論你是否使用占位圖博肋,對于UI來說低斋,圖片的改變是相當大的一個動作。一個簡單的方法可以讓這個變化更平滑匪凡,更讓人眼接受膊畴,這就是使用crossfade動畫。Glide支持標準的crossfade動畫病游,(對于目前版本3.6.1)是默認可用的巴比。如果你想要使用crossfade動畫,你只要在在構造器里添加另外一個調(diào)用:
Glide
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded
.crossFade()
.into(imageViewFade);
crossFade()方法有另外一個特征:.crossFade(int duration),如果你想要減慢(或加快)動畫礁遵,隨便傳入一個毫秒級的時間進去感受一下。默認的動畫時間是300毫秒采记。
dontAnimate()的使用
如果你只是直接顯示圖片佣耐,而不需要crossfade效果,那就在Glide的請求構造里調(diào)用.dontAnimate():
Glide
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded
.dontAnimate()
.into(imageViewFade);
你會直接看到圖片唧龄,沒有漸入的過程兼砖。請你確認你有自己的理由要這么做。
提醒你個很重要的事既棺,這些參數(shù)都是獨立的讽挟,并且設置不依賴彼此。例如丸冕,你可以只設置.error()耽梅,而不用調(diào)用.placeholder()。你可以設置crossFade()動畫胖烛,而不用設置占位圖眼姐。參數(shù)的任意結合都是可行的。
展望
很希望你能從這篇文章中理解并學到許多佩番。圖片的意外顯示對于用戶體驗來說是相當糟糕的众旗。另外,當出錯的時候趟畏,用明顯的方式告訴用戶贡歧。Glide幫助你用簡單的方法調(diào)用這些功能,讓你的app體驗更出色赋秀。
但是利朵,我們還沒有結束我們的優(yōu)化。后續(xù)沃琅,我們會學習圖片大小的調(diào)整和縮放哗咆。