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(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/video.mp4"; glide.with( context ).load( uri.fromfile( new file( 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(new simpletarget<bitmap>(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(); } }
//圆角图片 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("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(new glideroundtransform(context,10)).into(imageview); glide.with(this).load("https://www.baidu.com/img/bdlogo.png").transform(new glidecircletransform(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的库。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接