一拾弃、Glide簡介
Glide 是 Google 員工的開源項目, Google I/O上被推薦使用,一個高效锡足、開源纺棺、Android設備上的媒體管理框架,它遵循BSD柳刮、MIT以及Apache2.0協(xié)議發(fā)布。Glide具有獲取痒钝、解碼和展示視頻劇照秉颗、圖片、動畫等功能送矩,它還有靈活的API蚕甥,這些API使開發(fā)者能夠將Glide應用在幾乎任何網(wǎng)絡協(xié)議棧里。
二栋荸、Glide特點
1. 使用簡單
2. 可配置度高菇怀,自適應程度高
3. 支持常見圖片格式,jpg晌块、png爱沟、gif、webp
4. 支持多種數(shù)據(jù)源匆背,網(wǎng)絡呼伸、資源、assets 钝尸、File蜂大、Uri等
5. 高效緩存策略支持內存和硬盤緩存
6. 生命周期集成根據(jù)Activity/Fragment生命周期自動管理請求
7. 高效處理Bitmap
三、Android Studio導入依賴
compile 'com.github.bumptech.glide:glide:3.7.0'
四蝶怔、設置綁定生命周期
1. 綁定Context
Glide.with(Context context);
2. 綁定Activity
Glide.with(Activity activity);
3. 綁定FragmentActivity
Glide.with(FragmentActivity activity);
4. 綁定Fragment
Glide.with(Fragment fragment);
【注】將Activity/Fragment作為with()參數(shù)的好處是奶浦,圖片加載會和Activity/Fragment的生命周期保持一致,比如 Paused狀態(tài)在暫停加載踢星,在Resumed的時候又自動重新加載澳叉。
五、加載資源
1. 加載網(wǎng)絡資源
Glide.with(context).load("http://i.imgur.com/1opCuAV.jpg").into(imageView);
2. 加載assets資源
Glide.with(context).load("file:///android_asset/hb_head.png").into(imageView);
3. 加載Resources資源
Glide.with(context).load(R.mipmap.ic_launcher).into(imageView);
4. 加載File資源
Glide.with(context).load(file).into(imageView);
5. 加載Uri資源
Glide.with(context).load(uri).into(imageView);
6. 加載字節(jié)數(shù)組
Glide.with(context).load(byte[]).into(imageView);
六、設置加載中和加載失敗的圖片
設置加載中圖片
.placeholder(R.drawable.user_placeholder)
設置加載失敗圖片
.error(R.drawable.user_placeholder_error)
七成洗、設置縮略圖支持
Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
【注】先加載縮略圖 然后在加載全圖
八五督、加載GIF
顯示gif靜態(tài)圖片
Glide.with(this).load(imageUrl).asBitmap().into(imageView);
顯示gif動態(tài)圖片
Glide.with(this).load(imageUrl).asGif().into(imageView);
九、設置加載動畫
1. 淡入淡出效果
Glide.with(this).load(imageUrl).crossFade().into(imageView);
2. 無動畫
Glide.with(this).load(imageUrl).dontAnimate().into(imageView);
3. 自定義動畫
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
十瓶殃、設置請求監(jiān)聽
Glide.with(this).load(imageUrl).listener(RequestListener listener).into(imageView);
十一充包、設置加載尺寸
Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
centerCrop():拉伸截取中間部分顯示
fitCenter():等比拉伸填滿ImageView
十二、自定義圖片轉換
自定義BitmapTransformation
class RoundTransformation extends BitmapTransformation{
public RoundTransformation(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform,
int outWidth, int outHeight) {
//根據(jù)需要遥椿,進行Bitmap轉換
Bitmap roteBmp = BitmapUtils.getRoundCornerBitmap(toTransform, 360);
if (roteBmp != toTransform) {
toTransform.recycle();
}
return roteBmp;
}
@Override
public String getId() {
return "glide";
}
}
設置圖片轉換
Glide.with(this).load(imageUrl)
.transform(newRoundTransformation(this))
.into(imageView);
十三基矮、緩存策略
1. 設置跳過內存緩存
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
2. 設置緩存策略
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView;
【注】
DiskCacheStrategy.ALL? 緩存源資源和轉換后的資源
DiskCacheStrategy.NONE? 不作任何磁盤緩存
DiskCacheStrategy.SOURCE? 緩存源資源
DiskCacheStrategy.RESULT? 緩存轉換后的資源
3. 清理緩存
清理磁盤緩存 需要在子線程中執(zhí)行
Glide.get(this).clearDiskCache();
清理內存緩存? 可以在UI主線程中進
Glide.get(this).clearMemory();
十四、自定義GlideModule
GlideModule 是一個抽象類冠场,用來全局改變 Glide 行為的一個方式家浇。通過全局GlideModule 配置Glide,其中用GlideBuilder設置選項碴裙。
GlideModule的使用步驟
1. 自定義一個GlideModule
public class MyGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// Apply options to the builder here.
}
@Override
public void registerComponents(Context context, Glide glide) {
// register ModelLoaders here.
}
}
2. AndroidManifest.xml注冊
android:name="com.bodhixu.glide.CustomGlideModule"
android:value="GlideModule"/>
3. 混淆處理
-keepnames class com.mypackage.MyGlideModule
#-keep public class * implements com.bumptech.glide.module.GlideModule
GlideBuilder設置選項
1. 獲取默認的內存
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize =calculator.getMemoryCacheSize(); //獲得默認內存緩存大小
int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); //獲得bitmap緩存池大小
2. 設置BitmapPool緩存大小
int maxMemory = (int) Runtime.getRuntime().maxMemory();//獲取系統(tǒng)分配給應用的總內存大小
int memoryCacheSize = maxMemory /8;//設置圖片內存緩存占用八分之一//設置內存緩存大小
builder.setBitmapPool(newLruBitmapPool(memoryCacheSize));//設置BitmapPool緩存內存大小
3. 設置內存緩存大小
int maxMemory = (int) Runtime.getRuntime().maxMemory();//獲取系統(tǒng)分配給應用的總內存大小
int memoryCacheSize = maxMemory / 8;//設置圖片內存緩存占用八分之一//設置內存緩存大小
builder.setMemoryCache(new LruResourceCache(memoryCacheSize));
4. 設置Glide磁盤緩存大小
builder.setDiskCache(new InternalCacheDiskCacheFactory(context,10<<20)); //10M
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,10<<20));
5. 設置圖片解碼格式钢悲,默認是ARGB_565
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
十五、Picasso和Glide的區(qū)別
1. Glide比Picasso加載速度快
2. 默認情況Glide更有利于減少OutOfMemoryError的發(fā)生舔株,不過Picasso的圖片質量更高
3. Glide支持gif莺琳,Picasso不支持
十六、示例代碼
百度網(wǎng)盤:http://pan.baidu.com/s/1dFr7dgH