在泰國舉行的谷歌開發(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)秀庫
一個基于Glide的transformation庫潘鲫,擁有裁剪,著色肋杖,模糊溉仑,濾鏡等多種轉(zhuǎn)換效果,贊的不行不行的~~
一個可以在Glide加載時很方便使用Palette的庫状植。