Android圖片緩存之初識Glide(三)
前言:
前面總結(jié)學(xué)習(xí)了圖片的使用以及Lru算法,今天來學(xué)習(xí)一下比較優(yōu)秀的圖片緩存開源框架。技術(shù)本身就要不斷的更迭,從最初的自己使用SoftReference實現(xiàn)自己的圖片緩存,到后來做電商項目自己的實現(xiàn)方案不能滿足項目的需求改用Afinal,由于Afinal不再維護(hù)而選擇了師出同門的Xutils,中間也接觸過別的開源框架比如Picasso,對Picasso的第一次印象就不太好,初次接觸是拿到了公司剛從外包公司接手過來的圖片社交類app,對內(nèi)存占用太大,直接感受就是導(dǎo)致ListView滑動有那么一點卡頓,老牌的圖片緩存框架universalImageLoader聽說過一直沒有真正使用過,之前項目都很小,差不多幾百萬級別的app,一直使用的都是Xutils,最近覺得項目大起來了,萬一Xutils不維護(hù)了或者說要求支持的圖片格式多起來的時候,可能Xutils就不是最佳選擇了,這也是來學(xué)習(xí)Gilde的根本動機(jī)吧。其實本來想著去學(xué)習(xí)Facebook的Fresco圖片框架,但是簡單的看了一下,需要連同自定義控件一起使用,功能雖然強(qiáng)大,但是對于已經(jīng)在維護(hù)的項目修改成本那可不是一般的高,以后有興趣在學(xué)習(xí)吧!
Glide簡介:
Glide 是 Google 員工的開源項目, Google I/O 上被推薦使用,一個高效、開源、Android設(shè)備上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協(xié)議發(fā)布。Glide具有獲取、解碼和展示視頻劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發(fā)者能夠?qū)lide應(yīng)用在幾乎任何網(wǎng)絡(luò)協(xié)議棧里。創(chuàng)建Glide的主要目的有兩個,一個是實現(xiàn)平滑的圖片列表滾動效果,另一個是支持遠(yuǎn)程圖片的獲取、大小調(diào)整和展示。
gitHub地址:https://github.com/bumptech/glide
Glide特點
•使用簡單
•可配置度高,自適應(yīng)程度高
•支持常見圖片格式 Jpg png gif webp
•支持多種數(shù)據(jù)源 網(wǎng)絡(luò)、本地、資源、Assets 等
•高效緩存策略 支持Memory和Disk圖片緩存 默認(rèn)Bitmap格式采用RGB_565內(nèi)存使用至少減少一半
•生命周期集成 根據(jù)Activity/Fragment生命周期自動管理請求
•高效處理Bitmap 使用Bitmap Pool使Bitmap復(fù)用,主動調(diào)用recycle回收需要回收的Bitmap,減小系統(tǒng)回收壓力
Glide簡單使用
1.)添加引用 build.gradle 中添加配置
compile 'com.github.bumptech.glide:glide:3.7.0'
2.)設(shè)置綁定生命周期
我們可以更加高效的使用Glide提供的方式進(jìn)行綁定,這樣可以更好的讓加載圖片的請求的生命周期動態(tài)管理起來
Glide.with(Context context);// 綁定Context Glide.with(Activity activity);// 綁定Activity Glide.with(FragmentActivity activity);// 綁定FragmentActivity Glide.with(Fragment fragment);// 綁定Fragment
3. )簡單的加載圖片實例
Glide.with(this).load(imageUrl).into(imageView);
4.)設(shè)置加載中以及加載失敗圖片
api里面對placeholder()、error()函數(shù)中有多態(tài)實現(xiàn) 用的時候可以具體的熟悉一下
5.)設(shè)置跳過內(nèi)存緩存
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
6.)設(shè)置下載優(yōu)先級
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
7.)設(shè)置緩存策略
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
策略解說:
all:緩存源資源和轉(zhuǎn)換后的資源
none:不作任何磁盤緩存
source:緩存源資源
result:緩存轉(zhuǎn)換后的資源
8.)設(shè)置加載動畫
api也提供了幾個常用的動畫:比如crossFade()
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView); R.anim.item_alpha_in
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:duration="500" android:fromAlpha="0.0" android:toAlpha="1.0"/> </set>
9.)設(shè)置縮略圖支持
這樣會先加載縮略圖 然后在加載全圖
Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
10.)設(shè)置加載尺寸
Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
11.)設(shè)置動態(tài)轉(zhuǎn)換
Glide.with(this).load(imageUrl).centerCrop().into(imageView);
api提供了比如:centerCrop()、fitCenter()等函數(shù)也可以通過自定義Transformation,舉例說明:比如一個人圓角轉(zhuǎn)化器
public class GlideRoundTransform extends BitmapTransformation { private float radius = 0f; public GlideRoundTransform(Context context) { this(context, 4); } public GlideRoundTransform(Context context, int dp) { super(context); this.radius = Resources.getSystem().getDisplayMetrics().density * dp; } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); } private Bitmap roundCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } @Override public String getId() { return getClass().getName() + Math.round(radius); } }
具體使用
Glide.with(this).load(imageUrl).transform(new GlideRoundTransform(this)).into(imageView);
12.)設(shè)置要加載的內(nèi)容
項目中有很多需要先下載圖片然后再做一些合成的功能,比如項目中出現(xiàn)的圖文混排,該如何實現(xiàn)目標(biāo)下
Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { imageView.setImageDrawable(resource); } });
13 .)設(shè)置監(jiān)聽請求接口
Glide.with(this).load(imageUrl).listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { //imageView.setImageDrawable(resource); return false; } }).into(imageView);
設(shè)置監(jiān)聽的用處 可以用于監(jiān)控請求發(fā)生錯誤來源,以及圖片來源 是內(nèi)存還是磁盤
14.)設(shè)置動態(tài)GIF加載方式
Glide.with(this).load(imageUrl).asBitmap().into(imageView);//顯示gif靜態(tài)圖片 Glide.with(this).load(imageUrl).asGif().into(imageView);//顯示gif動態(tài)圖片
15.)緩存的動態(tài)清理
Glide.get(this).clearDiskCache();//清理磁盤緩存 需要在子線程中執(zhí)行 Glide.get(this).clearMemory();//清理內(nèi)存緩存 可以在UI主線程中進(jìn)行
以上是Glide的常規(guī)用法,基本上滿足開發(fā)需要了,然后再去學(xué)習(xí)一下其他相關(guān)知識。
相關(guān)文章
Android實現(xiàn)Bitmap位圖旋轉(zhuǎn)效果
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)Bitmap位圖旋轉(zhuǎn)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04android camera yuv幀水平翻轉(zhuǎn)實例
今天小編就為大家分享一篇android camera yuv幀水平翻轉(zhuǎn)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Android GridView實現(xiàn)動畫效果實現(xiàn)代碼
這篇文章主要介紹了 Android GridView實現(xiàn)動畫效果實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03基于android中讀取assets目錄下a.txt文件并進(jìn)行解析的深入分析
本篇文章是對在android需要中讀取assets目錄下a.txt文件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android學(xué)習(xí)之介紹Binder的簡單使用
BInder方面的資料雖然感覺看的比較多,但是真正用的時候才發(fā)現(xiàn)有很多地方模棱兩棵的,所以,打算用一個實例再來鞏固一下binder的使用方法。這篇文章主要介紹了Android中Binder的簡單使用,文中給出詳細(xì)的示例代碼,需要的朋友可以參考下2016-12-12Android 實現(xiàn)視頻字幕Subtitle和橫豎屏切換示例
下面小編就為大家分享一篇Android 實現(xiàn)視頻字幕Subtitle和橫豎屏切換示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01