Android圖片加載框架Glide用法
在泰國舉行的谷歌開發(fā)者論壇上,谷歌為我們介紹了一個(gè)名叫?Glide?的圖片加載庫,作者是bumptech。這個(gè)庫被廣泛的運(yùn)用在google的開源項(xiàng)目中,包括2014年google I/O大會(huì)上發(fā)布的官方app。
它的成功讓我非常感興趣。我花了一整晚的時(shí)間把玩,決定分享一些自己的經(jīng)驗(yàn)。在開始之前我想說,Glide和Picasso有90%的相似度,準(zhǔn)確的說,就是Picasso的克隆版本。但是在細(xì)節(jié)上還是有不少區(qū)別的。
導(dǎo)入
Picasso和Glide都在jcenter上。在項(xiàng)目中添加依賴非常簡單:
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'?? ????}
當(dāng)然現(xiàn)在v4包已經(jīng)是android項(xiàng)目標(biāo)配了
Glide的with方法不光接受Context,還接受Activity 和 Fragment,Context會(huì)自動(dòng)的從他們獲取。
1.網(wǎng)絡(luò)加載圖片到ImageView中
Glide.with(context).load(imageUrl).into(imageView);
2.當(dāng)加載網(wǎng)絡(luò)圖片時(shí),由于加載過程中圖片未能及時(shí)顯示,此時(shí)可能需要設(shè)置等待時(shí)的圖片,通過placeHolder()方法
Glide.with(context).load(imageUrl).placeholder(R.mipmap.ic_launcher).into(imageView);
3.當(dāng)加載圖片失敗時(shí),通過error(Drawable drawable)方法設(shè)置加載失敗后的圖片顯示:
Glide.with(context).load(imageUrl).error(R.mipmap.ic_launcher).into(imageView);
4.圖片的縮放,centerCrop()和fitCenter():
1)使用centerCrop是利用圖片圖填充ImageView設(shè)置的大小,如果ImageView的
Height是match_parent則圖片就會(huì)被拉伸填充
Glide.with(context).load(imageUrl).centerCrop().into(imageView);
2)使用fitCenter即縮放圖像讓圖像都測量出來等于或小于 ImageView 的邊界范圍,該圖像將會(huì)完全顯示,但可能不會(huì)填滿整個(gè)ImageView。
Glide.with(context).load(imageUrl).fitCenter().into(imageView);
5.顯示gif動(dòng)畫,asGif()判斷是否是gif動(dòng)畫
Glide.with(context).load(imageUrl).asGif().into(imageView);
6.顯示本地視頻
String?filePath?=?"/storage/emulated/0/Pictures/example_video.mp4"; Glide.with(?context?).load(?Uri.fromFile(?new?File(?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
?緩存所有版本的圖像(默認(rèn)行為)
8.優(yōu)先級,設(shè)置圖片加載的順序:
?
Glide.with(context).load(imageUrl).priority(?Priority.HIGH).into(?imageView);
9.獲取Bitmap,設(shè)置CircleImageVIew可以使用這個(gè)ImageView庫
Glide.with(mContext) ????.load(url)? ????.placeholder(R.drawable.loading_spinner) ????.into(new?SimpleTarget(width,?height)?{ ????????@Override? ????????public?void?onResourceReady(Bitmap?bitmap,?GlideAnimation?anim)?{ ????????????//?setImageBitmap(bitmap)?on?CircleImageView? ????????}? ????};
10.加載圓形圖片和圓角圖片
//圓形圖片 public?class?GlideCircleTransform?extends?BitmapTransformation?{ ????public?GlideCircleTransform(Context?context)?{ ????????super(context); ????} ????@Override?protected?Bitmap?transform(BitmapPool?pool,?Bitmap?toTransform,?int?outWidth,?int?outHeight)?{ ????????return?circleCrop(pool,?toTransform); ????} ????private?static?Bitmap?circleCrop(BitmapPool?pool,?Bitmap?source)?{ ????????if?(source?==?null)?return?null; ????????int?size?=?Math.min(source.getWidth(),?source.getHeight()); ????????int?x?=?(source.getWidth()?-?size)?/?2; ????????int?y?=?(source.getHeight()?-?size)?/?2; ????????//?TODO?this?could?be?acquired?from?the?pool?too ????????Bitmap?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); ????????float?r?=?size?/?2f; ????????canvas.drawCircle(r,?r,?r,?paint); ????????return?result; ????} ????@Override?public?String?getId()?{ ????????return?getClass().getName(); ????} } ????Contact?GitHub?API?Training?Shop?Blog?About
?
//圓角圖片 public?class?GlideRoundTransform?extends?BitmapTransformation?{ ????private?static?float?radius?=?0f; ????public?GlideRoundTransform(Context?context)?{ ????????this(context,?4); ????} ????public?GlideRoundTransform(Context?context,?int?dp)?{ ????????super(context); ????????this.radius?=?Resources.getSystem().getDisplayMetrics().density?*?dp; ????} ????@Override?protected?Bitmap?transform(BitmapPool?pool,?Bitmap?toTransform,?int?outWidth,?int?outHeight)?{ ????????return?roundCrop(pool,?toTransform); ????} ????private?static?Bitmap?roundCrop(BitmapPool?pool,?Bitmap?source)?{ ????????if?(source?==?null)?return?null; ????????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()?{ ????????return?getClass().getName()?+?Math.round(radius); ????} }
?
Glide.with(this).load("http://img.21ic.com/21ic_pic/CSDN/bdlogo.png").transform(new?GlideRoundTransform(context)).into(imageView); Glide.with(this).load("http://img.21ic.com/21ic_pic/CSDN/bdlogo.png").transform(new?GlideRoundTransform(context,?10)).into(imageView); Glide.with(this).load("http://img.21ic.com/21ic_pic/CSDN/bdlogo.png").transform(new?GlideCircleTransform(context)).into(imageView);
?
添加圖片淡入加載的效果
Glide.with(context) ????.load(url) ????.placeholder(R.drawable.loading) ????.error(R.drawable.failed)? ????.crossFade(1000)?//?可設(shè)置時(shí)長,默認(rèn)“300ms” ????.into(view);
獲得圖片緩存路徑
private?String?getImagePath(String?imgUrl)?{???? ??????String?path?=?null;???? ??????FutureTargetfuture?=?Glide.with(ViewBigImageActivity.this) ?????????????.load(imgUrl) ?????????????.downloadOnly(500,?500);???? ?????try?{???????? ????????????File?cacheFile?=?future.get();???????? ????????????path?=?cacheFile.getAbsolutePath();???? ?????}?catch?(InterruptedException?|?ExecutionException?e)?{? ????????????e.printStackTrace();???? ?????}???? ?????return?path; }
注意:應(yīng)在子線程中執(zhí)行。
使用:
new?Thread(new?Runnable()?{ ????@Override ????public?void?run()?{ ????????//?子線程獲得圖片路徑 ????????final?String?imagePath?=?getImagePath(imageUrl); ????????//?主線程更新 ????????MainActivity.this.runOnUiThread(new?Runnable()?{ ????????????@Override ????????????public?void?run()?{ ????????????????//?操作代碼 ????????????} ????????}); ????} }).start();
一些使用技巧
1.Glide.with(context).resumeRequests()和 Glide.with(context).pauseRequests()
當(dāng)列表在滑動(dòng)的時(shí)候,調(diào)用pauseRequests()取消請求,滑動(dòng)停止時(shí),調(diào)用resumeRequests()恢復(fù)請求。這樣是不是會(huì)好些呢?
2.Glide.clear()
當(dāng)你想清除掉所有的圖片加載請求時(shí),這個(gè)方法可以幫助到你。
3.ListPreloader
如果你想讓列表預(yù)加載的話,不妨試一下ListPreloader這個(gè)類。
一些基于Glide的優(yōu)秀庫
1.glide-transformations
一個(gè)基于Glide的transformation庫,擁有裁剪,著色,模糊,濾鏡等多種轉(zhuǎn)換效果,贊的不行不行的~~
2.GlidePalette
一個(gè)可以在Glide加載時(shí)很方便使用Palette的庫。