Glide

最基本用法

glide採用的都是流接口方式

簡單的從網絡加載圖片

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完全顯示,尺寸不對時,周圍會留白。這裏有驚喜,圓ImageView

等會兒補充

Glide的緩存

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

placeHolder

聽名字都知道這傢伙是幹嘛的,加載圖片,但是圖片還沒有加載完的時候,總不能給用戶看空白吧,這個就是用來填充着一段是時間的。

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

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

當加載出錯,或者加載不出來的時候.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)

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

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


文/lxacoder(簡書作者)
原文鏈接:http://www.jianshu.com/p/c9efd313e79e
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章