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);
int resourceId = R.mipmap.ic_launcher; Glide.with(context).load(resourceId).into(imageViewResource);
Glide.with(context).load(uri).into(imageViewUri);
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 );
Glide.with( context ).load( gifUrl ).asGif().error( R.drawable.full_cake ).into( imageViewGif );
Glide.with( context ).load( gifUrl ).asBitmap().into( imageViewGifAsBitmap );
String filePath = "/storage/emulated/0/Pictures/example_video.mp4"; Glide.with( context ).load( Uri.fromFile( **new **File( filePath ) ) ).into( imageViewGifAsBitmap );
在上面這些等價ScrollView中,Glide會自動的請求取消,清楚ImageView,在合適的ImageView中加載合適的Image.當須要裁剪大小時,有個*.centerCrop*
方法,這個方法的裁剪會讓你的ImageView周圍不會留白,還有一個.fitCenter()方法,表示讓你的Image徹底顯示,尺寸不對時,周圍會留白。這裏有驚喜,圓ImageViewnode
等會兒補充
用過手機的都知道,當劃上劃下一個ListView的時候,第二次都比第一次快,就是由於爲GlideView對資源進行了緩存,並且封裝的很好,甚至不須要本身去設定緩存大小,Glide會智能地本身給咱們根據設備設置緩存大小。緩存
聽名字都知道這傢伙是幹嗎的,加載圖片,可是圖片尚未加載完的時候,總不能給用戶看空白吧,這個就是用來填充着一段是時間的。網絡
Glide.with(context). load(UsageExampleListViewAdapter.eatFoodyImages[0]) .placeholder(R.mipmap.ic_launcher) *// 一樣也能夠是drawble .into(imageViewPlaceholder);
這裏只能用本地資源,不能用網絡資源,由於網絡資源也有可能加載不出來。dom
其實大多數時候用placeHolder就能夠了。異步
Glide.with(context) .load("http://futurestud.io/non_existing_image.png") .placeholder(R.mipmap.ic_launcher) // 一樣也能夠是drawble .error(R.mipmap.future_studio_launcher)// 當不能加載時載入
除了上面兩種‘異常狀況’,還有一種情形就是打開手機的通信錄的時候,能夠看到你給有些喜歡的人設置了照片,然而有些可憐的人並沒給有,總不能在那裏留下一片空白吧,這個時候至關於傳遞了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( )
有如下幾種緩存策略:
Glide
.with( context ).load( image )
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into( imageViewFile );
.request()
加載圖片確定也是有前後順序,Glide提供了.request()
這個方法,它接收如下幾個參數:
上名全部的狀況都是加載圖片到ImageView中,可是並非全部的狀況都是這樣。
從上面的介紹,已經能夠看出Glide內部封裝了全部的細節,什麼網絡請求,什麼緩存機制,當全部都就緒事後,自動切換回UI線程,更新ImageView。Targets就是Glide中的回調,當異步線程中全部的工做作完事後返回結果。說白了就是,當請求圖片完成後,須要回調的方法。
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 );}
注意事項:
.with(context.getApplicationContext() ).
當你的Activity GG事後,請求仍是會繼續,回調仍是會繼續。若是傳給.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 ); }
適用於想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 ); }}
這個下一篇再補充,有點點複雜。