最基本用法
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 );
請求優先級
加載圖片肯定也是有先後順序,Glide提供了.request()
.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 );}
注意事項:
- 上面這段代碼不要寫成匿名內部類的機制,原因就是java的自動垃圾回收機制可能在圖片還沒有加載好的時候就已經把你的Target回收了。
- 注意.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 ); }}
原文鏈接:http://www.jianshu.com/p/c9efd313e79e
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。