Android网络加载框架Glide解析

前言

Glide是Google推荐的用于Android平台的图片加载框架,Glide和Picasso有90%的相似度,可以说Glide是Picasso的克隆版本,只是在细节上存在不少区别。还不是很了解Gilde的同学,可以先看看下面这两篇文章:

  • glide的介绍
  • glide的使用

Glide有以下特点。

  • GIF 动画的解码

  • 本地视频剧照的解码

  • 缩略图的支持

  • Activity 生命周期的集成: 当Activity暂停和重启时,Glide能够做到智能的暂停和重新开始请求,并且当Android设备的连接状态变化时,所有失败的请求能够自动重新请求

  • 转码的支持: Glide的toBytes() 和transcode() 两个方法可以用来获取、解码和变换背景图片,并且transcode() 方法还能够改变图片的样式

  • 动画的支持: 新增支持图片的淡入淡出动画效果(调用crossFade()方法)和查看动画的属性的功能

  • OkHttp 和Volley 的支持: 默认选择HttpUrlConnection作为网络协议栈,还可以选择OkHttp和Volley作为网络协议栈

  • 其他功能: 如在图片加载过程中,使用Drawables对象作为占位符、图片请求的优化、图片的宽度和高度可重新设定、缩略图和原图的缓存等功能


glide的使用

  • 引入Glide
dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}
  • 加载图片
    Glide.with(context)
                .load(url)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView);

Glide的with方法不光接受Context,还接受Activity 和Fragment,Context会自动的从他们获取。gif图片加载无需任何处理即可,glide会自动判断图片是否是gif格式。

  • 占位图

placeholder:还没加载出来时的占位图

error:加载失败时的占位图

fallback:url为null时的占位图

     Glide.with(context)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)//loading时的占位图
                .error(R.mipmap.ic_launcher)//加载失败的占位图
                .fallback( R.drawable.wuyanzu)//url为空时的占位图
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView);

-** 动画**

嗯,其实这个是默认的,但是你还是可以写出来,渐显动画

Glide.with(context)
.load().placeholder(R.mipmap.ic_launcher) 
.error(R.mipmap.future_studio_launcher)
.crossFade()
.into(imageViewFade);

这里还有一个.fadeFade(int duration),设置动画时间。如果你不想要动画可以加上.dontAnimate()

Glide.with(context)
.load( null)//加载空指针的时候
.fallback( R.drawable.wuyanzu)//嗯,吴彦祖。
.into( imageViewNoFade );
  • 调整图片大小

单位是像素,裁剪你的图片大小。其实Glide已经会自动根据你mageView裁剪照片来放在缓存中了。但是不想适应ImageView大小的时候,可以调用这个方法.override()。

Glide.with(context)
.load(image)
.override(600, 200) 
.into(imageViewResize);
  • 图片的缩放

使用centerCrop是利用图片图填充ImageView设置的大小,如果ImageView的Height是match_parent则图片就会被拉伸填充

Glide.with(context).load(imageUrl).centerCrop().into(imageView);

使用fitCenter即缩放图像让图像都测量出来等于或小于 ImageView 的边界范围,该图像将会完全显示,但可能不会填满整个ImageView。

Glide.with(context).load(imageUrl).fitCenter().into(imageView);
  • 缩略图

缩略图有什么用就不说了,方正在一些条件下好处大大的,相当于一个动态的placeHolder。还有一种方法。
.thumbnail()方法的目的就是让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。

Glide.
with( context )
.load(image)
.thumbnail( 0.1f )//表示为原图的十分之一
.into( imageView2 );
  • 显示本地视频
String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with( context ).load( Uri.fromFile( new File( filePath ) ) ).into(imageViewGifAsBitmap );
  • 缓存策略
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 缓存所有版本的图像(默认行为)

  • 图片请求优先级

加载图片肯定也是有先后顺序,Glide提供了priority()这个方法,它接收以下几个参数:

Priority.LOW

Priority.NORMAL

Priority.HIGH

Priority.IMMEDIATE

但是Glide并不一定会按照你的顺序来,只是尽量按照你的顺序来。(比如给一张很大的图片最高的优先权,但是它并不一定比低优先级的图先加载出来)

Glide.with(context).load(imageUrl).priority( Priority.HIGH).into( imageView);

一些使用技巧

  • Glide.with(context).resumeRequests()和 Glide.with(context).pauseRequests()

当列表在滑动的时候,调用pauseRequests()取消请求,滑动停止时,调用resumeRequests()恢复请求。这样是不是会好些呢?

  • Glide.clear()

当你想清除掉所有的图片加载请求时,这个方法可以帮助到你。

  • ListPreloader

如果你想让列表预加载的话,不妨试一下ListPreloader这个类。


一些基于Glide的优秀库

  • glide-transformations

一个基于Glide的transformation库,拥有裁剪(圆形,圆角),着色,模糊,滤镜等多种转换效果,赞的不行不行的~~

 /* 圆角图片
 *
 * @param context
 * @param imageView
 * @param url
 */
public static void loadRoundCornerImage(Context context, final ImageView imageView, String url) {

    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new RoundedCornersTransformation(context, 100, 0))
            .into(imageView);

}

/**
 * 模糊加载图片
 *
 * @param context
 * @param imageView
 * @param url
 */
public static void loadBlurredImage(Context context, final ImageView imageView, String url) {

    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new BlurTransformation(context))
            .into(imageView);

}

/**
 * 加载圆形图片
 * @param context
 * @param imageView
 * @param url
 */
public static void loadCircleImage(Context context, final ImageView imageView, String url) {

    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new CropCircleTransformation(context))
            .into(imageView);
}

/**
各种滤镜效果:
 ToonFilterTransformation
 SepiaFilterTransformation,
 ContrastFilterTransformation
 InvertFilterTransformation,
 PixelationFilterTransformation,
 SketchFilterTransformation
 SwirlFilterTransformation,
 BrightnessFilterTransformation,
 KuwaharaFilterTransformation
 VignetteFilterTransformation
 */

public static void loadFilterEffectImage(Context context, final ImageView imageView, String url){
    Glide.with(context)
            .load(url)
            .placeholder(R.mipmap.ic_launcher)
            .error(R.mipmap.ic_launcher)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .bitmapTransform(new VignetteFilterTransformation(context))
            .into(imageView);
}

  • GlidePalette

Palette 是让界面显示一致的利器,它的作用是取到一张图的色彩,然后返回一系列颜色,可供我们选择设置我们的文本颜色,背景颜色,从而达到界面的一致性。

具体参考:http://www.jianshu.com/p/ccf5230dbcca


你可能感兴趣的:(Android网络加载框架Glide解析)