Glide用法与技巧以及优秀库的推荐
当前较为知名的几个图片加载库是Universal-ImageLoader、Glide、Fresco、Picasso
比较如下:
Universal-ImageLoader库2015年年底作者已经停止维护Gilde是Picasso的优化版最后就是Facebook的Fresco,听说极为强大和高效率,但是大小有4M。最后Glide,google维护。Picasson的优化版,使用简单,也许没有Fresco那么强大,但是觉得完全可以hold住大部分项目。
比较Picasso与Glide
- 1.两者使用方式类似,但Glide的with()接受的不仅仅是Context,还可以是Activity或是Fragment,Context会自动的从他们获取。同时将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载。所以我建议传参的时候传递Activity和Fragment给Glide,而不是Context。
- 2.Glide加载的图片质量要略差于Picasso,这又是为什么呢?这是因为Glide默认的Bitmap格式是RGB_565,比ARGB_8888格式的内存开销要小一半。Glide当然也可以通过GlideModule设置格式。
- 3.两者在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的。Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟。
- 4.Glide可以加载GIF动态图,而Picasso不能。
- 5.Picasso(v2.5.1)大小约为118KB,然而Glide(v3.5.2)的大小约为430KB。Picasso的方法数大约480,然而Glide的方法数约2678。
导入
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:24.0.0' }
Glide的with方法不光接受Context,还接受Activity和Fragment,Context会自动的从他们获取。
1.网络加载图片到ImageView中
Glide.with(context).load(imageUrl).into(imageView);
2.当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法
Glide.with(context).load(imageUrl).placeholder(R.mipmap.ic_launcher).into(imageView);
3.当加载图片失败时,通过error(Drawabledrawable)方法设置加载失败后的图片显示:
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.显示本地视频
StringfilePath="/storage/emulated/0/Pictures/video.mp4"; Glide.with(context).load(Uri.fromFile(newFile(filePath))).into(imageViewGifAsBitmap);
7.缓存策略
Glide.with(context).load(imageUrl).skipMemoryCache(true).into(imageViewInternet);//跳过内存缓存
Glide.with(context).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageViewInternet);//跳过硬盘缓存
- DiskCacheStrategy.NONE 什么都不缓存
- DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
- DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
- DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)
8.优先级,设置图片加载的顺序:
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 publicvoidonResourceReady(Bitmapbitmap,GlideAnimationanim){ //setImageBitmap(bitmap)onCircleImageView } };
10.加载圆形图片和圆角图片
//圆形图片 publicclassGlideCircleTransformextendsBitmapTransformation{ publicGlideCircleTransform(Contextcontext){ super(context); } @OverrideprotectedBitmaptransform(BitmapPoolpool,BitmaptoTransform,intoutWidth,intoutHeight){ returncircleCrop(pool,toTransform); } privatestaticBitmapcircleCrop(BitmapPoolpool,Bitmapsource){ if(source==null)returnnull; intsize=Math.min(source.getWidth(),source.getHeight()); intx=(source.getWidth()-size)/2; inty=(source.getHeight()-size)/2; //TODOthiscouldbeacquiredfromthepooltoo Bitmapsquared=Bitmap.createBitmap(source,x,y,size,size); Bitmapresult=pool.get(size,size,Bitmap.Config.ARGB_8888); if(result==null){ result=Bitmap.createBitmap(size,size,Bitmap.Config.ARGB_8888); } Canvascanvas=newCanvas(result); Paintpaint=newPaint(); paint.setShader(newBitmapShader(squared,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); floatr=size/2f; canvas.drawCircle(r,r,r,paint); returnresult; } @OverridepublicStringgetId(){ returngetClass().getName(); } }
//圆角图片 publicclassGlideRoundTransformextendsBitmapTransformation{ privatestaticfloatradius=0f; publicGlideRoundTransform(Contextcontext){ this(context,4); } publicGlideRoundTransform(Contextcontext,intdp){ super(context); this.radius=Resources.getSystem().getDisplayMetrics().density*dp; } @OverrideprotectedBitmaptransform(BitmapPoolpool,BitmaptoTransform,intoutWidth,intoutHeight){ returnroundCrop(pool,toTransform); } privatestaticBitmaproundCrop(BitmapPoolpool,Bitmapsource){ if(source==null)returnnull; Bitmapresult=pool.get(source.getWidth(),source.getHeight(),Bitmap.Config.ARGB_8888); if(result==null){ result=Bitmap.createBitmap(source.getWidth(),source.getHeight(),Bitmap.Config.ARGB_8888); } Canvascanvas=newCanvas(result); Paintpaint=newPaint(); paint.setShader(newBitmapShader(source,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); RectFrectF=newRectF(0f,0f,source.getWidth(),source.getHeight()); canvas.drawRoundRect(rectF,radius,radius,paint); returnresult; } @OverridepublicStringgetId(){ returngetClass().getName()+Math.round(radius); } }
Glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(newGlideRoundTransform(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()
当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。这样是不是会好些呢?
2.Glide.clear()
当你想清除掉所有的图片加载请求时,这个方法可以帮助到你。
3.ListPreloader
如果你想让列表预加载的话,不妨试一下ListPreloader这个类。
一些基于Glide的优秀库
1.glide-transformations
一个基于Glide的transformation库,拥有裁剪,着色,模糊,滤镜等多种转换效果,赞的不行不行的~~
2.GlidePalette
一个可以在Glide加载时很方便使用Palette的库。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接