前言
Glide是Google推荐的用于Android平台的图片加载框架,Glide和Picasso有90%的相似度,可以说Glide是Picasso的克隆版本,只是在细节上存在不少区别。还不是很了解Gilde的同学,可以先看看下面这两篇文章:
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的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);
}
Palette 是让界面显示一致的利器,它的作用是取到一张图的色彩,然后返回一系列颜色,可供我们选择设置我们的文本颜色,背景颜色,从而达到界面的一致性。
具体参考:http://www.jianshu.com/p/ccf5230dbcca