当前位置: 移动技术网 > IT编程>移动开发>Android > Glide用法与技巧以及优秀库的推荐

Glide用法与技巧以及优秀库的推荐

2019年07月31日  | 移动技术网IT编程  | 我要评论

板野友美金在中,洪荒道路,动漫萝莉御姐吸奶mv

当前较为知名的几个图片加载库是universal-imageloaderglidefrescopicasso

比较如下:

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的库。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。如果你想了解更多相关内容请查看下面相关链接

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网