Android圖片加載框架Glide用法

Android圖片加載框架Glide用法

在泰國舉行的谷歌開發(fā)者論壇上展运,谷歌為我們介紹了一個名叫Glide的圖片加載庫泣特,作者是bumptech能庆。這個庫被廣泛的運用在google的開源項目中嘲恍,包括2014年google I/O大會上發(fā)布的官方app嘀趟。

它的成功讓我非常感興趣维哈。我花了一整晚的時間把玩绳姨,決定分享一些自己的經(jīng)驗。在開始之前我想說阔挠,Glide和Picasso有90%的相似度飘庄,準確的說,就是Picasso的克隆版本购撼。但是在細節(jié)上還是有不少區(qū)別的跪削。

導入

Picasso和Glide都在jcenter上。在項目中添加依賴非常簡單:

Picasso

dependencies {?

? ? compile 'com.squareup.picasso:picasso:2.5.1'?

}

Glide

? ? dependencies {?

? ? ? ? compile 'com.github.bumptech.glide:glide:3.5.2'?

? ? ? ? compile 'com.android.support:support-v4:22.0.0'?

? ? }?

當然現(xiàn)在v4包已經(jīng)是android項目標配了

Glide的with方法不光接受Context迂求,還接受Activity 和 Fragment切揭,Context會自動的從他們獲取。

1.網(wǎng)絡加載圖片到ImageView中

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

2.當加載網(wǎng)絡圖片時锁摔,由于加載過程中圖片未能及時顯示廓旬,此時可能需要設置等待時的圖片,通過placeHolder()方法

Glide.with(context).load(imageUrl).placeholder(R.mipmap.ic_launcher).into(imageView);

3.當加載圖片失敗時,通過error(Drawable drawable)方法設置加載失敗后的圖片顯示:

Glide.with(context).load(imageUrl).error(R.mipmap.ic_launcher).into(imageView);

4.圖片的縮放孕豹,centerCrop()和fitCenter():?

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

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

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

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

5.顯示gif動畫,asGif()判斷是否是gif動畫

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

6.顯示本地視頻

String filePath = "/storage/emulated/0/Pictures/example_video.mp4";

Glide.with( context ).load( Uri.fromFile( newFile( filePath ) ) ).into(imageViewGifAsBitmap );

7.緩存策略

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緩存所有版本的圖像(默認行為

8.優(yōu)先級指攒,設置圖片加載的順序:


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

9.獲取Bitmap叶眉,設置CircleImageVIew可以使用這個ImageView庫

Glide.with(mContext)

? ? .load(url)

? ? .placeholder(R.drawable.loading_spinner)

? ? .into(newSimpleTarget(width, height) {

? ? ? ? @Override

? ? ? ? publicvoid onResourceReady(Bitmap bitmap, GlideAnimation anim) {

? ? ? ? ? ? // setImageBitmap(bitmap) on CircleImageView? ? ? ? }

? ? };

10.加載圓形圖片和圓角圖片

//圓形圖片publicclassGlideCircleTransformextends BitmapTransformation {

? ? public GlideCircleTransform(Context context) {

? ? ? ? super(context);

? ? }

? ? @Override protectedBitmap transform(BitmapPool pool, Bitmap toTransform,intoutWidth,int outHeight) {

? ? ? ? return circleCrop(pool, toTransform);

? ? }

? ? privatestatic Bitmap circleCrop(BitmapPool pool, Bitmap source) {

? ? ? ? if(source ==null)returnnull;

? ? ? ? intsize = Math.min(source.getWidth(), source.getHeight());

? ? ? ? intx = (source.getWidth() - size) / 2;

? ? ? ? inty = (source.getHeight() - size) / 2;

? ? ? ? // TODO this could be acquired from the pool tooBitmap squared = Bitmap.createBitmap(source, x, y, size, size);

? ? ? ? Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);

? ? ? ? if(result ==null) {

? ? ? ? ? ? result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);

? ? ? ? }

? ? ? ? Canvas canvas =new Canvas(result);

? ? ? ? Paint paint =new Paint();

? ? ? ? paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

? ? ? ? paint.setAntiAlias(true);

? ? ? ? floatr = size / 2f;

? ? ? ? canvas.drawCircle(r, r, r, paint);

? ? ? ? return result;

? ? }

? ? @Override public String getId() {

? ? ? ? return getClass().getName();

? ? }

}

? ? Contact GitHub API Training Shop Blog About


//圓角圖片publicclassGlideRoundTransformextends BitmapTransformation {

? ? privatestaticfloatradius = 0f;

? ? public GlideRoundTransform(Context context) {

? ? ? ? this(context, 4);

? ? }

? ? publicGlideRoundTransform(Context context,int dp) {

? ? ? ? super(context);

? ? ? ? this.radius = Resources.getSystem().getDisplayMetrics().density * dp;

? ? }

? ? @Override protectedBitmap transform(BitmapPool pool, Bitmap toTransform,intoutWidth,int outHeight) {

? ? ? ? return roundCrop(pool, toTransform);

? ? }

? ? privatestatic Bitmap roundCrop(BitmapPool pool, Bitmap source) {

? ? ? ? if(source ==null)returnnull;

? ? ? ? Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);

? ? ? ? if(result ==null) {

? ? ? ? ? ? result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);

? ? ? ? }

? ? ? ? Canvas canvas =new Canvas(result);

? ? ? ? Paint paint =new Paint();

? ? ? ? paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

? ? ? ? paint.setAntiAlias(true);

? ? ? ? RectF rectF =new RectF(0f, 0f, source.getWidth(), source.getHeight());

? ? ? ? canvas.drawRoundRect(rectF, radius, radius, paint);

? ? ? ? return result;

? ? }

? ? @Override public String getId() {

? ? ? ? returngetClass().getName() + Math.round(radius);

? ? }

}


Glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context)).into(imageView);

Glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(newGlideRoundTransform(context, 10)).into(imageView);

Glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(newGlideCircleTransform(context)).into(imageView);


一些使用技巧

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

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

2.Glide.clear()

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

3.ListPreloader

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

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

1.glide-transformations

一個基于Glide的transformation庫潘鲫,擁有裁剪,著色肋杖,模糊溉仑,濾鏡等多種轉(zhuǎn)換效果,贊的不行不行的~~

2.GlidePalette

一個可以在Glide加載時很方便使用Palette的庫状植。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浊竟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浅萧,更是在濱河造成了極大的恐慌逐沙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洼畅,死亡現(xiàn)場離奇詭異吩案,居然都是意外死亡,警方通過查閱死者的電腦和手機帝簇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門徘郭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丧肴,你說我怎么就攤上這事残揉。” “怎么了芋浮?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵抱环,是天一觀的道長。 經(jīng)常有香客問我,道長镇草,這世上最難降的妖魔是什么眶痰? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮梯啤,結果婚禮上竖伯,老公的妹妹穿的比我還像新娘。我一直安慰自己因宇,他們只是感情好七婴,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著察滑,像睡著了一般打厘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杭棵,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天婚惫,我揣著相機與錄音氛赐,去河邊找鬼魂爪。 笑死,一個胖子當著我的面吹牛艰管,可吹牛的內(nèi)容都是我干的滓侍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼牲芋,長吁一口氣:“原來是場噩夢啊……” “哼撩笆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缸浦,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤夕冲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裂逐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歹鱼,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年卜高,在試婚紗的時候發(fā)現(xiàn)自己被綠了弥姻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡掺涛,死狀恐怖庭敦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薪缆,我是刑警寧澤秧廉,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響疼电,放射性物質(zhì)發(fā)生泄漏赔癌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一澜沟、第九天 我趴在偏房一處隱蔽的房頂上張望灾票。 院中可真熱鬧,春花似錦茫虽、人聲如沸刊苍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽正什。三九已至,卻和暖如春号杏,著一層夾襖步出監(jiān)牢的瞬間婴氮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工盾致, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留主经,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓庭惜,卻偏偏與公主長得像罩驻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子护赊,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容