Android網(wǎng)絡加載框架Glide解析

前言

Glide是Google推薦的用于Android平臺的圖片加載框架,Glide和Picasso有90%的相似度,可以說Glide是Picasso的克隆版本,只是在細節(jié)上存在不少區(qū)別。還不是很了解Gilde的同學,可以先看看下面這兩篇文章:

Glide有以下特點。

  • GIF 動畫的解碼

  • 本地視頻劇照的解碼

  • 縮略圖的支持

  • Activity 生命周期的集成: 當Activity暫停和重啟時,Glide能夠做到智能的暫停和重新開始請求,并且當Android設備的連接狀態(tài)變化時,所有失敗的請求能夠自動重新請求

  • 轉(zhuǎn)碼的支持: Glide的toBytes() 和transcode() 兩個方法可以用來獲取、解碼和變換背景圖片,并且transcode() 方法還能夠改變圖片的樣式

  • 動畫的支持: 新增支持圖片的淡入淡出動畫效果(調(diào)用crossFade()方法)和查看動畫的屬性的功能

  • OkHttp 和Volley 的支持: 默認選擇HttpUrlConnection作為網(wǎng)絡協(xié)議棧,還可以選擇OkHttp和Volley作為網(wǎng)絡協(xié)議棧

  • 其他功能: 如在圖片加載過程中,使用Drawables對象作為占位符、圖片請求的優(yōu)化、圖片的寬度和高度可重新設定、縮略圖和原圖的緩存等功能


glide的使用

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}
  • 加載圖片
    Glide.with(context)
                .load(url)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView);

Glide的with方法不光接受Context,還接受Activity 和Fragment,Context會自動的從他們獲取。gif圖片加載無需任何處理即可,glide會自動判斷圖片是否是gif格式。

  • 占位圖

placeholder:還沒加載出來時的占位圖

error:加載失敗時的占位圖

fallback:url為null時的占位圖

     Glide.with(context)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)//loading時的占位圖
                .error(R.mipmap.ic_launcher)//加載失敗的占位圖
                .fallback( R.drawable.wuyanzu)//url為空時的占位圖
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView);

-** 動畫**

嗯,其實這個是默認的,但是你還是可以寫出來,漸顯動畫

Glide.with(context)
.load().placeholder(R.mipmap.ic_launcher) 
.error(R.mipmap.future_studio_launcher)
.crossFade()
.into(imageViewFade);

這里還有一個.fadeFade(int duration),設置動畫時間。如果你不想要動畫可以加上.dontAnimate()

Glide.with(context)
.load( null)//加載空指針的時候
.fallback( R.drawable.wuyanzu)//嗯,吳彥祖。
.into( imageViewNoFade );
  • 調(diào)整圖片大小

單位是像素,裁剪你的圖片大小。其實Glide已經(jīng)會自動根據(jù)你mageView裁剪照片來放在緩存中了。但是不想適應ImageView大小的時候,可以調(diào)用這個方法.override()。

Glide.with(context)
.load(image)
.override(600, 200) 
.into(imageViewResize);
  • 圖片的縮放

使用centerCrop是利用圖片圖填充ImageView設置的大小,如果ImageView的Height是match_parent則圖片就會被拉伸填充

Glide.with(context).load(imageUrl).centerCrop().into(imageView);

使用fitCenter即縮放圖像讓圖像都測量出來等于或小于 ImageView 的邊界范圍,該圖像將會完全顯示,但可能不會填滿整個ImageView。

Glide.with(context).load(imageUrl).fitCenter().into(imageView);
  • 縮略圖

縮略圖有什么用就不說了,方正在一些條件下好處大大的,相當于一個動態(tài)的placeHolder。還有一種方法。
.thumbnail()方法的目的就是讓用戶先看到一個低解析度的圖,點開后,再加載一個高解析度的圖。

Glide.
with( context )
.load(image)
.thumbnail( 0.1f )//表示為原圖的十分之一
.into( imageView2 );
  • 顯示本地視頻
String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with( context ).load( Uri.fromFile( new File( filePath ) ) ).into(imageViewGifAsBitmap );
  • 緩存策略
Glide.with( context ).load(imageUrl).skipMemoryCache(true).into(imageViewInternet );//跳過內(nèi)存緩存

Glide.with( context ).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into( imageViewInternet );//跳過硬盤緩存

DiskCacheStrategy.NONE 什么都不緩存

DiskCacheStrategy.SOURCE 僅僅只緩存原來的全分辨率的圖像

DiskCacheStrategy.RESULT 僅僅緩存最終的圖像,即降低分辨率后的(或者是轉(zhuǎn)換后的)

DiskCacheStrategy.ALL 緩存所有版本的圖像(默認行為)

  • 圖片請求優(yōu)先級

加載圖片肯定也是有先后順序,Glide提供了priority()這個方法,它接收以下幾個參數(shù):

Priority.LOW

Priority.NORMAL

Priority.HIGH

Priority.IMMEDIATE

但是Glide并不一定會按照你的順序來,只是盡量按照你的順序來。(比如給一張很大的圖片最高的優(yōu)先權(quán),但是它并不一定比低優(yōu)先級的圖先加載出來)

Glide.with(context).load(imageUrl).priority( Priority.HIGH).into( imageView);

一些使用技巧

  • Glide.with(context).resumeRequests()和 Glide.with(context).pauseRequests()

當列表在滑動的時候,調(diào)用pauseRequests()取消請求,滑動停止時,調(diào)用resumeRequests()恢復請求。這樣是不是會好些呢?

  • Glide.clear()

當你想清除掉所有的圖片加載請求時,這個方法可以幫助到你。

  • ListPreloader

如果你想讓列表預加載的話,不妨試一下ListPreloader這個類。


一些基于Glide的優(yōu)秀庫

一個基于Glide的transformation庫,擁有裁剪(圓形,圓角),著色,模糊,濾鏡等多種轉(zhuǎn)換效果,贊的不行不行的~~

 /* 圓角圖片
 *
 * @param context
 * @param imageView
 * @param url
 */
public static void loadRoundCornerImage(Context context, final ImageView imageView, String url) {

    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new RoundedCornersTransformation(context, 100, 0))
            .into(imageView);

}

/**
 * 模糊加載圖片
 *
 * @param context
 * @param imageView
 * @param url
 */
public static void loadBlurredImage(Context context, final ImageView imageView, String url) {

    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new BlurTransformation(context))
            .into(imageView);

}

/**
 * 加載圓形圖片
 * @param context
 * @param imageView
 * @param url
 */
public static void loadCircleImage(Context context, final ImageView imageView, String url) {

    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new CropCircleTransformation(context))
            .into(imageView);
}

/**
各種濾鏡效果:
 ToonFilterTransformation
 SepiaFilterTransformation,
 ContrastFilterTransformation
 InvertFilterTransformation,
 PixelationFilterTransformation,
 SketchFilterTransformation
 SwirlFilterTransformation,
 BrightnessFilterTransformation,
 KuwaharaFilterTransformation
 VignetteFilterTransformation
 */

public static void loadFilterEffectImage(Context context, final ImageView imageView, String url){
    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new VignetteFilterTransformation(context))
            .into(imageView);
}

Palette 是讓界面顯示一致的利器,它的作用是取到一張圖的色彩,然后返回一系列顏色,可供我們選擇設置我們的文本顏色,背景顏色,從而達到界面的一致性。

具體參考:http://www.itdecent.cn/p/ccf5230dbcca


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容