国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android圖片緩存之初識Glide(三)

2019-12-12 05:50:02
字體:
來源:轉載
供稿:網友

前言:

前面總結學習了圖片的使用以及Lru算法,今天來學習一下比較優秀的圖片緩存開源框架。技術本身就要不斷的更迭,從最初的自己使用SoftReference實現自己的圖片緩存,到后來做電商項目自己的實現方案不能滿足項目的需求改用Afinal,由于Afinal不再維護而選擇了師出同門的Xutils,中間也接觸過別的開源框架比如Picasso,對Picasso的第一次印象就不太好,初次接觸是拿到了公司剛從外包公司接手過來的圖片社交類app,對內存占用太大,直接感受就是導致ListView滑動有那么一點卡頓,老牌的圖片緩存框架universalImageLoader聽說過一直沒有真正使用過,之前項目都很小,差不多幾百萬級別的app,一直使用的都是Xutils,最近覺得項目大起來了,萬一Xutils不維護了或者說要求支持的圖片格式多起來的時候,可能Xutils就不是最佳選擇了,這也是來學習Gilde的根本動機吧。其實本來想著去學習Facebook的Fresco圖片框架,但是簡單的看了一下,需要連同自定義控件一起使用,功能雖然強大,但是對于已經在維護的項目修改成本那可不是一般的高,以后有興趣在學習吧! 

Glide簡介:

Glide 是 Google 員工的開源項目, Google I/O 上被推薦使用,一個高效、開源、Android設備上的媒體管理框架,它遵循BSD、MIT以及Apache 2.0協議發布。Glide具有獲取、解碼和展示視頻劇照、圖片、動畫等功能,它還有靈活的API,這些API使開發者能夠將Glide應用在幾乎任何網絡協議棧里。創建Glide的主要目的有兩個,一個是實現平滑的圖片列表滾動效果,另一個是支持遠程圖片的獲取、大小調整和展示。
 gitHub地址:https://github.com/bumptech/glide 

Glide特點
 •使用簡單
 •可配置度高,自適應程度高
 •支持常見圖片格式 Jpg png gif webp
 •支持多種數據源  網絡、本地、資源、Assets 等
 •高效緩存策略    支持Memory和Disk圖片緩存 默認Bitmap格式采用RGB_565內存使用至少減少一半
 •生命周期集成   根據Activity/Fragment生命周期自動管理請求
 •高效處理Bitmap  使用Bitmap Pool使Bitmap復用,主動調用recycle回收需要回收的Bitmap,減小系統回收壓力 

Glide簡單使用
 1.)添加引用 build.gradle 中添加配置
 compile 'com.github.bumptech.glide:glide:3.7.0'
2.)設置綁定生命周期 
我們可以更加高效的使用Glide提供的方式進行綁定,這樣可以更好的讓加載圖片的請求的生命周期動態管理起來 

 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.)設置加載中以及加載失敗圖片 
api里面對placeholder()、error()函數中有多態實現 用的時候可以具體的熟悉一下

復制代碼 代碼如下:
Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

5.)設置跳過內存緩存 
 Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);
6.)設置下載優先級 
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);
7.)設置緩存策略 
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);
策略解說: 
all:緩存源資源和轉換后的資源 
none:不作任何磁盤緩存 
source:緩存源資源 
result:緩存轉換后的資源 
8.)設置加載動畫 
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.)設置縮略圖支持 
這樣會先加載縮略圖 然后在加載全圖 
 Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);
10.)設置加載尺寸 
 Glide.with(this).load(imageUrl).override(800, 800).into(imageView);
11.)設置動態轉換 
 Glide.with(this).load(imageUrl).centerCrop().into(imageView); 

api提供了比如:centerCrop()、fitCenter()等函數也可以通過自定義Transformation,舉例說明:比如一個人圓角轉化器 

 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.)設置要加載的內容 
項目中有很多需要先下載圖片然后再做一些合成的功能,比如項目中出現的圖文混排,該如何實現目標下 

 Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget<GlideDrawable>() {   @Override   public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {    imageView.setImageDrawable(resource);   }  });

13 .)設置監聽請求接口 

 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);

設置監聽的用處 可以用于監控請求發生錯誤來源,以及圖片來源 是內存還是磁盤 

14.)設置動態GIF加載方式  

Glide.with(this).load(imageUrl).asBitmap().into(imageView);//顯示gif靜態圖片 Glide.with(this).load(imageUrl).asGif().into(imageView);//顯示gif動態圖片 

 15.)緩存的動態清理  

Glide.get(this).clearDiskCache();//清理磁盤緩存 需要在子線程中執行 Glide.get(this).clearMemory();//清理內存緩存 可以在UI主線程中進行 

以上是Glide的常規用法,基本上滿足開發需要了,然后再去學習一下其他相關知識。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平塘县| 方山县| 遵化市| 民县| 江陵县| 汕尾市| 比如县| 峨边| 云和县| 肇源县| 禹城市| 宁陵县| 洮南市| 交口县| 安丘市| 西和县| 彩票| 肥西县| 迁西县| 泾源县| 泊头市| 阳西县| 三门县| 德格县| 土默特右旗| 行唐县| 温州市| 晋中市| 竹山县| 彭泽县| 绥滨县| 绿春县| 嵊泗县| 桓台县| 宜宾市| 新兴县| 二手房| 焦作市| 密山市| 百色市| 昭通市|