欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-01-29 16:08:52
当前较为知名的几个图片加载库是universal-imageloader、glide、fresco、picasso 比较如下: universal-imageloade...

当前较为知名的几个图片加载库是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的库。

总结

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