Glide V4 框架新特性(Migrating from v3 to v4)
Android Glide4 非同步圖片框架
不瞭解官方推舉使用Glide框架,可以先閱讀Glide框架介紹.
Glide v4版本前幾天新發布,一些新特性也需要學習下。
從V3到V4遷移,改變的行為和配置如下:
- Options
- RequestBuilder
- RequestOptions
- TransitionOptions
- Generated API
- Types and Targets
- Picking Resource Types
- Drawables
- Targets
- Cancellation
- Configuration
- Applications
- Libraries
- Manifest parsing
Options:
在Glide v3中,options是由一系列複雜的多個builder來處理。
在Glide v4中,處理options(centerCrop(),placeholder()等 )方式發生了改變。處理Options的方式將由單一型別的Builder和一系列提供Buidler的options物件所取代。 Glide`s generated API進一步簡化,通過合併多個options和來源inegration libraries使用的Builder去建立單個流暢的API.
RequestBuilder:
API方法:
- listener()
- thumbnail()
- load()
- into()
在Glide v4中,從幾種型別(Bitmap,Drawable,GifDrawable
等)中,選取一個來建立指定型別的RequestBuilder。RequstBuilder物件能控制自身的Options,包括Model(url,uri等等),thumbnail,lisRequestlistener。ReuqstBuilder的開啟使用通過into()或者preload()
。
使用案例如下:
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment)
.load(url);
requestBuilder
.thumbnail( Glide.with(fragment)
.load(thumbnailUrl) )
.listener(requestListener)
.load(url)
.into(imageView);
RequestOptions
API方法:
- centerCrop()
- placeholder()
- error()
- priority()
- diskCacheStrategy()
在v3中,大多數的options操作移到RequestOptions中。
一個包含一些列options的RequstOptions能夠被多個RequstBuilder所運用。
使用案例如下:
RequestOptions myOptions = new RequestOptions()
.fitCenter()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.override(100, 100);
Glide.with(fragment)
.load(url)
.apply(myOptions)
.into(drawableView);
Glide.with(fragment)
.asBitmap()
.apply(myOptions)
.load(url)
.into(bitmapView);
TransitionOptions
API方法:
- crossFade()
- animate()
TransitionOptions是用於控制佔點陣圖片或者thumbnails圖片切換到真正需要載入的圖片之間的過度。
TransitionOptions包含三個子類:
- GenericTransitionOptions
- DrawableTransitionOptions
- BitmapTransitionOptions
移除預設的transition,使用TransitionOptions.dontTransition()
使用案例:
Glide.with(fragment)
.load(url)
.transition(withCrossFade(R.anim.fade_in, 300));
Generated API
為了更好的使用Glide v4 , Glide為運用程式提供了一個generated API. 運用程式中應該建立一個帶有@GlideModule註解的AppGlideModule子類,來使用generated API。更多閒情,閱讀Generated API介紹.
Generated API新增一個GlideApp類,該類能夠提供對RequestBuilder和RequestOptions子類的訪問。RequestOptions子類包含RequestOptions包含的全部方法和GlideExtensions定義的方法。RequestBuilder子類不需要使用apply方法,來訪問RequestBuilder子類中全部方法。
注意點:使用GlideApp,需要新增annotationProcessor 的依賴:來源
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC0'
使用Generated AP,一個RequestOptions被內嵌呼叫:
GlideApp.with(fragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH)
.into(imageView);
不使用Generated API的方式案例:
Glide.with(fragment)
.load(url)
.apply(centerCropTransform()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH))
.into(imageView);
Types and Targets
Picking Resource Types
在使用Glide時,可以指定你想載入的資源型別。倘若你指定了一個超類的型別,Glide將嘗試載入一個可用的子類型別。例如,指定載入型別是Drawable,Glide會載入BitmapDrawable或者GifDrawable。
Glide預設的請求是Drawable型別的:
Glide.with(fragment).load(url)
指定Bitmap型別:
Glide.with(fragment).asBitmap()
指定檔案路徑(最適合本地圖片):
Glide.with(fragment).asFile()
去下載一個遠端的檔案寫入快取中,且獲得一個檔案路徑:
Glide.with(fragment).downloadOnly()
//或者你已經有一個Url。
Glide.with(fragmetn).download(url);
Drawables
在Glide v3中GlideDrwable已經被移除,有利於anroid標準的Drawable。GlideBitmapDrawable也已經被移除,有利於BitmapDrawable。
判斷一個Drawable是否是動畫的,通過Animatable可以判斷:
boolean isAnimated = drawable instanceof Animatable
Targets
onResourceReady()
的引數發生了改變
//原來的
onResourceReady(GlideDrawable drawable, GlideAnimation<? super GlideDrawable> anim)
//現在改成以下形式:
onResourceReady(Drawable drawable, Transition<? super Drawable> transition);
onLondFailed
的簽名也改變了:
//原來的
onLoadFailed(Exception e, Drawable errorDrawable)
//現在的
onLoadFailed(Drawable errorDrawable)
使用RquestListener可以知道,在載入過程中失敗的資訊。
Cancellation
原本的Glide.with(Target)
移到RequestManager中,使用方式如下:
Glide.with(fragment).clear(target)
清除不是必須要求的,但是使用RequestManger開啟載入,和清除載入,效果會更好。Glide v4跟蹤每個Activity和Fragment的請求,因此需要適當的生命週期去清除這些請求。
Configuration
在Glide v3中,使用一個或者多個GlideModules來執行配置。在Glide v4中,配置工作是類似的,但稍微更復雜的系統配置。
更多新配置,請閱讀Configuration頁面。
Applications
在Glide v4中,轉換和進入AppGlideModule:
@GlideModule
public class GiphyGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setMemoryCache(new LruResourceCache(10 * 1024 * 1024));
}
@Override
public void registerComponents(Context context, Registry registry) {
registry.append(Api.GifResult.class, InputStream.class, new GiphyModelLoader.Factory());
}
}
需注意:@GlideModule註解是必需的。
若是運用程式中具備多個GlideModules,將其中一個轉成AppGlideModule,其他的轉成LibraryGlideModules。倘若,存在AppGlideModule的時候,才會發現LibraryGlideModule。因此,不能僅適用LibraryGlideModules。
Libraries
擁有一個或者多個的GlideModule的庫應該使用LibraryGlideModule而不是AppGlideModule。庫不應是使用AppGlideModules,因為每個運用程式只有一個AppGliModules。因此,包含在唯一一個庫的AppGlideModules,不會阻止庫去設定庫本身的options。多個庫包含一個AppGlideMoudle,它會導致衝突。
在V4 中,Volley GlideModule的轉換:
@GlideModule
public class VolleyLibraryGlideModule extends LibraryGlideModule {
@Override
public void registerComponents(Context context, Registry registry) {
registry.replace(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(context));
}
}
Manifest parsing
為了簡化遷移,清單解析和舊的GlideModule介面已經被棄用,但是在V4中任然支援。AppGlideModules, LibraryGlideModules 和 棄用的 GlideModules已舊可以在程式中共存。
但是,為了避免檢查後設資料(和相關的錯誤)帶來的效能開銷。可以通過覆蓋AppGlideModule中的isManifestParsingEnabled()
來,控制是否解析清單。
@GlideModule
public class GiphyGlideModule extends AppGlideModule {
@Override
public boolean isManifestParsingEnabled() {
return false;
}
...
}
資源參考:
Glide框架:http://blog.csdn.net/hexingen/article/details/72577453
Migrating from v3 to v4:http://bumptech.github.io/glide/doc/migrating.html
相關文章
- Android開發中使用Glide V4 中Generated API特性AndroidIDEAPI
- React Router從V2/V3到V4的變化React
- Vue和d3.js(v4)力導向圖force結合使用,v3版本升級v4【一】VueJS
- Node v4 – Generator函式函式
- 65536問題理解v4
- KubeSphere v4 安裝指南
- React v16 與 Webpack v4 的多特性模板專案ReactWeb
- webpack v3 結合 react-router v4 做 dynamic import — 按需載入(懶載入)WebReactImport
- React Router v4 入坑指南React
- webpack v4 從dev到prdWebdev
- React Router v4 版本 完全指北React
- Intel Xeon E5-2620 v4(至強E5-2620 v4)Intel
- 每日一學 react-router ?v4React
- Node v4 – 字串的擴充套件字串套件
- 實現react-router v4(上)React
- ReactRouter升級 v2 to v4React
- react-router v4 路由規則解析React路由
- React-Router V4 簡單實現React
- Sequelize 中文文件 v4 – Hooks – 鉤子Hook
- GraphQL學習:Github GraphQL API v4初探GithubAPI
- 聊聊 React Router v4 的設計思想React
- KubeSphere v4 擴充套件元件使用指南套件元件
- Glide框架IDE框架
- FROM ASM Migrating to FILE SYSTEM Using RMAN(三)ASM
- 雲資料庫時代,DBA將走向何方?-v4資料庫
- SAP UI5 OData V4 模型的構造方式UI模型
- React Router v4 頁面傳值的三種方法React
- 在安卓系統上使用Google Analytics API V4安卓GoAPI
- 【譯】手摸手寫一個你自己的 React Router v4React
- 前端路由實現及 react-router v4 原始碼分析前端路由React原始碼
- 關於 SAP UI5 OData V4 模型的 refresh 方法UI模型
- Android Support v4、v7、v13 介紹Android
- 由淺入深地教你開發自己的 React Router v4React
- webpack v4 中的斷舍離 - 程式碼分離 SplitChunksPlugin(一)WebPlugin
- SAP UI5 OData V4 表格控制元件的批量修改UI控制元件
- Android studio無法提醒v4包的解決方案Android
- KubeSphere v4 開源併發布全新可插拔架構 LuBan架構
- 【資料遷移】XTTS跨平臺傳輸表空間v4TTS