Glide的用法

最基本用法

glide採用的都是流接口方式java

簡單的從網絡加載圖片

Glide.with(context).load(internetUrl).into(targetImageView);

 

從文件加載

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);

 

從資源id

int resourceId = R.mipmap.ic_launcher;
Glide.with(context).load(resourceId).into(imageViewResource);

從uri

Glide.with(context).load(uri).into(imageViewUri);

加載gif

String gifUrl = "xxxxx";
Glide.with( context ).load( gifUrl ).into( imageViewGif );

一些常規方法(待加載時顯示,加載出錯時顯示)

Glide.with( context ).load( gifUrl ).placeholder( R.drawable.cupcake ).error( R.drawable.full_cake ).into( imageViewGif );

強制轉化爲gif

Glide.with( context ).load( gifUrl ).asGif().error( R.drawable.full_cake ).into( imageViewGif );

用bitMap播放Gif

Glide.with( context ).load( gifUrl ).asBitmap().into( imageViewGifAsBitmap );

播放本地mp4,只能是本地

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with( context ).load( Uri.fromFile( **new **File( filePath ) ) ).into( imageViewGifAsBitmap );

進一步

RecyclerView的結合(一樣適用於ListView,GridView等)

在上面這些等價ScrollView中,Glide會自動的請求取消,清楚ImageView,在合適的ImageView中加載合適的Image.當須要裁剪大小時,有個*.centerCrop*方法,這個方法的裁剪會讓你的ImageView周圍不會留白,還有一個.fitCenter()方法,表示讓你的Image徹底顯示,尺寸不對時,周圍會留白。這裏有驚喜,圓ImageViewnode

等會兒補充

Glide的緩存

用過手機的都知道,當劃上劃下一個ListView的時候,第二次都比第一次快,就是由於爲GlideView對資源進行了緩存,並且封裝的很好,甚至不須要本身去設定緩存大小,Glide會智能地本身給咱們根據設備設置緩存大小。緩存

placeHolder

聽名字都知道這傢伙是幹嗎的,加載圖片,可是圖片尚未加載完的時候,總不能給用戶看空白吧,這個就是用來填充着一段是時間的。網絡

Glide.with(context).
        load(UsageExampleListViewAdapter.eatFoodyImages[0])
            .placeholder(R.mipmap.ic_launcher) *// 一樣也能夠是drawble
            .into(imageViewPlaceholder);

 

這裏只能用本地資源,不能用網絡資源,由於網絡資源也有可能加載不出來。dom

當加載出錯,或者加載不出來的時候.error()方法來幫忙

其實大多數時候用placeHolder就能夠了。異步

Glide.with(context)
.load("http://futurestud.io/non_existing_image.png")
.placeholder(R.mipmap.ic_launcher) // 一樣也能夠是drawble
.error(R.mipmap.future_studio_launcher)// 當不能加載時載入

 

.fallback

除了上面兩種‘異常狀況’,還有一種情形就是打開手機的通信錄的時候,能夠看到你給有些喜歡的人設置了照片,然而有些可憐的人並沒給有,總不能在那裏留下一片空白吧,這個時候至關於傳遞了Null,傳遞null時,這個callback方法就會被調用,推薦在這裏給我設置一張吳彥祖或者小貝的照片。嗯。。(QAQ)ide

Glide.with(context)
.load( null)//加載空指針的時候
.fallback( R.drawable.wuyanzu)//嗯,吳彥祖。
.into( imageViewNoFade );

 

加點動畫

嗯,其實這個是默認的,可是你仍是能夠寫出來,漸顯動畫性能

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

 

這裏還有一個.fadeFade(int duration),設置動畫時間。若是你不想要動畫能夠加上.dontAnimate()動畫

調整圖片大小.resize(int ,int )

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

Glide.with(context)
.load(image)
.override(600, 200) 
.into(imageViewResize);

裁剪圖片

就是上名講的.fitCenter.CenterCrop

來點縮略圖

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

Glide.
with( context )
.load(image)
.thumbnail( 0.1f )//表示爲原圖的十分之一
.into( imageView2 );

一種更高級的縮略圖加載方式

當縮略圖也須要經過網絡加載所有解析度的時候。

private void loadImageThumbnailRequest() {
DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( eatFoodyImages[2] );
Glide.with( context ).load( UsageExampleGifAndVideos.gifUrl ).thumbnail( thumbnailRequest ).into( imageView3 );
}

關於緩存

要想性能好,怎能夠不用緩存。緩存就是爲了減小或者杜絕多的網絡請求。爲了不緩存,Glide用了內存緩存和‘外存緩存機制’,而且 提供了相應的方法,徹底封裝,不須要處理細節。Glide會自動緩存到內存,除非調用. skipMemoryCache( true )。儘管調用了這個,Glide仍是會緩存到外存,還有一種情形,就是有一張圖片,可是這張圖變化很是快,這個時候可能並不想緩存到外存中,就使用.diskCacheStrategy( DiskCacheStrategy.NONE )。若是你兩種都不須要,能夠兩個方法組合着一塊兒使用。

自定義外存緩存機制

Glide默認會緩存Image的不少個版本,好比原圖,若是你的imageView大小的緩存。.diskCacheStrategy( )有如下幾種緩存策略:

  • DiskCacheStrategy.NONE 什麼都不緩存
  • DiskCacheStrategy.SOURCE 只緩存最高解析圖的image
  • DiskCacheStrategy.RESULT 緩存最後一次那個image,好比有可能你對image作了轉化
  • DiskCacheStrategy.ALL image的全部版本都會緩存
Glide
.with( context ).load( image )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );

 

請求優先級.request()

加載圖片確定也是有前後順序,Glide提供了.request()這個方法,它接收如下幾個參數:

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE
    可是Glide並不必定會按照你的順序來,只是儘可能按照你的順序來。(好比給一張很大的圖片最高的優先權,可是它並不必定比低優先級的圖先加載出來,這個時候只有使用縮略圖了)

利用callback在非標準狀況下加載圖片

上名全部的狀況都是加載圖片到ImageView中,可是並非全部的狀況都是這樣。

Glide中的回調:Targets

從上面的介紹,已經能夠看出Glide內部封裝了全部的細節,什麼網絡請求,什麼緩存機制,當全部都就緒事後,自動切換回UI線程,更新ImageView。Targets就是Glide中的回調,當異步線程中全部的工做作完事後返回結果。說白了就是,當請求圖片完成後,須要回調的方法。

SimplerTarget
private SimpleTarget target = new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
// do something with the bitmap
// for demonstration purposes, let's just set it to an ImageView
imageView1.setImageBitmap( bitmap );
  }
};
private void loadImageSimpleTarget() {
Glide.with( context ) *// could be an issue!*
.load( eatFoodyImages[0] )
.asBitmap()//強制Glide返回一個Bitmap
.into( target );}

 

注意事項:

  1. 上面這段代碼不要寫成匿名內部類的機制,緣由就是java的自動垃圾回收機制可能在圖片尚未加載好的時候就已經把你的Target回收了。
  2. 注意.with()裏面的參數,Glide的請求是和傳進去的Context共存亡的,若是傳一個Activity進去,當Activity GG事後,你的請求也就GG了,可是若是這樣傳:.with(context.getApplicationContext() ).當你的Activity GG事後,請求仍是會繼續,回調仍是會繼續。
有size的Target

若是傳給.into()的是一個ImageView,可是圖片的size比ImageView的Size打,Glide爲了節省時間,會加載小的那個size的Image。可是這對Target並不適用,覺得這裏並不知道SIze。可是若是知道image應該多大,能夠傳遞給Target.就像下面這樣:

private SimpleTarget target2 = new SimpleTarget<Bitmap>( 250, 250 ) {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {imageView2.setImageBitmap( bitmap );
}
};
private void loadImageSimpleTargetApplicationContext() {
Glide.with( context.getApplicationContext() ) *// safer!*
.load( eatFoodyImages[1] )
.asBitmap()
.into( target2 );
}

 

ViewTarget

適用於想Glide加載到自定義View中去,

public class FutureStudioView extends FrameLayout {
ImageView iv;
TextView tv;
public void nitialize(Context context) {
inflate( context, R.layout.custom_view_futurestudio, this );
iv = (ImageView) findViewById( R.id.custom_view_image );
tv = (TextView) findViewById( R.id.custom_view_text );
}
public FutureStudioView(Context context, AttributeSet attrs) {
super( context, attrs );
initialize( context );
}
public FutureStudioView(Context context,AttributeSet attrs,int defStyleAttr) {
super( context, attrs, defStyleAttr );
initialize( context );
}
public void setImage(Drawable drawable) {
iv = (ImageView) findViewById( R.id.custom_view_image );
iv.setImageDrawable( drawable );
}}

 

notificationTarget 和AppWidget中的使用

這個下一篇再補充,有點點複雜。

做者:lxacoder 連接:https://www.jianshu.com/p/c9efd313e79e 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索