前言:
? ? ?前面總結(jié)學(xué)習(xí)了圖片的使用以及Lru算法祠肥,今天來學(xué)習(xí)一下比較優(yōu)秀的圖片緩存開源框架灾馒。技術(shù)本身就要不斷的更迭全肮,從最初的自己使用SoftReference實(shí)現(xiàn)自己的圖片緩存扒秸,到后來做電商項(xiàng)目自己的實(shí)現(xiàn)方案不能滿足項(xiàng)目的需求改用Afinal,由于Afinal不再維護(hù)而選擇了師出同門的Xutils蹬挤,中間也接觸過別的開源框架比如Picasso,對(duì)Picasso的第一次印象就不太好棘幸,初次接觸是拿到了公司剛從外包公司接手過來的圖片社交類app焰扳,對(duì)內(nèi)存占用太大,直接感受就是導(dǎo)致ListView滑動(dòng)有那么一點(diǎn)卡頓误续,老牌的圖片緩存框架universalImageLoader聽說過一直沒有真正使用過吨悍,之前項(xiàng)目都很小,差不多幾百萬級(jí)別的app蹋嵌,一直使用的都是Xutils育瓜,最近覺得項(xiàng)目大起來了,萬一Xutils不維護(hù)了或者說要求支持的圖片格式多起來的時(shí)候栽烂,可能Xutils就不是最佳選擇了躏仇,這也是來學(xué)習(xí)Gilde的根本動(dòng)機(jī)吧。其實(shí)本來想著去學(xué)習(xí)Facebook的Fresco圖片框架腺办,但是簡單的看了一下焰手,需要連同自定義控件一起使用,功能雖然強(qiáng)大菇晃,但是對(duì)于已經(jīng)在維護(hù)的項(xiàng)目修改成本那可不是一般的高册倒,以后有興趣在學(xué)習(xí)吧!
?圖片緩存相關(guān)博客地址:
Glide簡介:
? ? ? ??Glide 是 Google 員工的開源項(xiàng)目磺送, Google I/O 上被推薦使用驻子,一個(gè)高效、開源估灿、Android設(shè)備上的媒體管理框架崇呵,它遵循BSD、MIT以及Apache 2.0協(xié)議發(fā)布馅袁。Glide具有獲取域慷、解碼和展示視頻劇照、圖片汗销、動(dòng)畫等功能犹褒,它還有靈活的API,這些API使開發(fā)者能夠?qū)lide應(yīng)用在幾乎任何網(wǎng)絡(luò)協(xié)議棧里弛针。創(chuàng)建Glide的主要目的有兩個(gè)叠骑,一個(gè)是實(shí)現(xiàn)平滑的圖片列表滾動(dòng)效果,另一個(gè)是支持遠(yuǎn)程圖片的獲取削茁、大小調(diào)整和展示宙枷。
?gitHub地址:https://github.com/bumptech/glide
Glide特點(diǎn)
?使用簡單
可配置度高掉房,自適應(yīng)程度高
支持常見圖片格式?Jpg png gif webp
支持多種數(shù)據(jù)源網(wǎng)絡(luò)、本地慰丛、資源卓囚、Assets 等
高效緩存策略支持Memory和Disk圖片緩存 默認(rèn)Bitmap格式采用RGB_565內(nèi)存使用至少減少一半
生命周期集成?根據(jù)Activity/Fragment生命周期自動(dòng)管理請(qǐng)求
高效處理Bitmap?使用Bitmap Pool使Bitmap復(fù)用,主動(dòng)調(diào)用recycle回收需要回收的Bitmap诅病,減小系統(tǒng)回收壓力
Glide簡單使用
1.)添加引用 build.gradle 中添加配置
? compile 'com.github.bumptech.glide:glide:3.7.0'
2.)設(shè)置綁定生命周期
我們可以更加高效的使用Glide提供的方式進(jìn)行綁定哪亿,這樣可以更好的讓加載圖片的請(qǐng)求的生命周期動(dòng)態(tài)管理起來
Glide.with(Context context);// 綁定ContextGlide.with(Activity activity);// 綁定ActivityGlide.with(FragmentActivity activity);// 綁定FragmentActivityGlide.with(Fragment fragment);// 綁定Fragment
3. )簡單的加載圖片實(shí)例
Glide.with(this).load(imageUrl).into(imageView);
4.)設(shè)置加載中以及加載失敗圖片
api里面對(duì)placeholder()、error()函數(shù)中有多態(tài)實(shí)現(xiàn) 用的時(shí)候可以具體的熟悉一下
Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);
5.)設(shè)置跳過內(nèi)存緩存
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
6.)設(shè)置下載優(yōu)先級(jí)
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è)置加載動(dòng)畫
api也提供了幾個(gè)常用的動(dòng)畫:比如crossFade()
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);
R.anim.item_alpha_in
? ? ? ? android:duration="500"? ? ? ? android:fromAlpha="0.0"? ? ? ? android:toAlpha="1.0"/>
9.)設(shè)置縮略圖支持
這樣會(huì)先加載縮略圖 然后在加載全圖
Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
10.)設(shè)置加載尺寸
Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
11.)設(shè)置動(dòng)態(tài)轉(zhuǎn)換
Glide.with(this).load(imageUrl).centerCrop().into(imageView);
? ? api提供了比如:centerCrop()睬隶、fitCenter()等函數(shù)也可以通過自定義Transformation锣夹,舉例說明:比如一個(gè)人圓角轉(zhuǎn)化器
publicclassGlideRoundTransformextends BitmapTransformation {
? ? ? ? privatefloatradius = 0f;
? ? ? ? public GlideRoundTransform(Context context) {
? ? ? ? ? ? this(context, 4);
? ? ? ? }
? ? ? ? publicGlideRoundTransform(Context context,int dp) {
? ? ? ? ? ? super(context);
? ? ? ? ? ? this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
? ? ? ? }
? ? ? ? @Override
? ? ? ? protectedBitmap transform(BitmapPool pool, Bitmap toTransform,intoutWidth,int outHeight) {
? ? ? ? ? ? return roundCrop(pool, toTransform);
? ? ? ? }
? ? ? ? private Bitmap roundCrop(BitmapPool pool, Bitmap source) {
? ? ? ? ? ? if(source ==null)returnnull;
? ? ? ? ? ? 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() {
? ? ? ? ? ? returngetClass().getName() + Math.round(radius);
? ? ? ? }
? ? }
具體使用
Glide.with(this).load(imageUrl).transform(newGlideRoundTransform(this)).into(imageView);
12.)設(shè)置要加載的內(nèi)容
項(xiàng)目中有很多需要先下載圖片然后再做一些合成的功能页徐,比如項(xiàng)目中出現(xiàn)的圖文混排苏潜,該如何實(shí)現(xiàn)目標(biāo)下
Glide.with(this).load(imageUrl).centerCrop().into(newSimpleTarget() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicvoidonResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
? ? ? ? ? ? ? ? imageView.setImageDrawable(resource);
? ? ? ? ? ? }
? ? ? ? });
13 .)設(shè)置監(jiān)聽請(qǐng)求接口
Glide.with(this).load(imageUrl).listener(newRequestListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? publicbooleanonException(Exception e, String model, Target target,boolean isFirstResource) {
? ? ? ? ? ? ? ? returnfalse;
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? publicbooleanonResourceReady(GlideDrawable resource, String model, Target target,booleanisFromMemoryCache,boolean isFirstResource) {
? ? ? ? ? ? ? ? //imageView.setImageDrawable(resource);returnfalse;
? ? ? ? ? ? }
? ? ? ? }).into(imageView);
設(shè)置監(jiān)聽的用處 可以用于監(jiān)控請(qǐng)求發(fā)生錯(cuò)誤來源,以及圖片來源 是內(nèi)存還是磁盤
15.)設(shè)置動(dòng)態(tài)GIF加載方式
Glide.with(this).load(imageUrl).asBitmap().into(imageView);//顯示gif靜態(tài)圖片Glide.with(this).load(imageUrl).asGif().into(imageView);//顯示gif動(dòng)態(tài)圖片
?16.)緩存的動(dòng)態(tài)清理
Glide.get(this).clearDiskCache();//清理磁盤緩存 需要在子線程中執(zhí)行Glide.get(this).clearMemory();//清理內(nèi)存緩存? 可以在UI主線程中進(jìn)行
小結(jié):
? ?以上是Glide的常規(guī)用法变勇,基本上滿足開發(fā)需要了恤左,然后再去學(xué)習(xí)一下其他相關(guān)知識(shí)。
干我們這行搀绣,啥時(shí)候懈怠飞袋,就意味著長進(jìn)的停止,長進(jìn)的停止就意味著被淘汰链患,只能往前沖巧鸭,直到鳳凰涅槃的一天!