来自于 Glide - 开始!
1、依赖:
compile 'com.github.bumptech.glide:glide:3.6.0'
2、基本使用:
Glide.with(context) //参数Activity/Fragment
//设置路径
.load(circleItem.getPics())
//缓存策略,缓存最终图片
.diskCacheStrategy(DiskCacheStrategy.RESULT)
//占位图
.error(R.drawable.ic_default_img).placeholder(R.drawable.ic_default_img)
//动画
.crossFade()
//调整图片像素大小
.override(320, 320)
//目标图片进行裁剪
.fitCenter().into(((ItemViewHolder) holder).img);
其中几个方法:
1、CenterCrop()和fitCenter()
分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER。
- CenterCrop():会缩放图片让图片充满整个ImageView的边框,然后裁掉超出的部分。ImageVIew会被完全填充满,但是图片可能不能完全显示出。
- fitCenter():会缩放图片让两边都相等或小于ImageView的所需求的边框。图片会被完整显示,可能不能完全填充整个ImageView。
2、硬盘缓存diskCacheStrategy():
- DiskCacheStrategy.NONE 什么都不缓存
- DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
- DiskCacheStrategy.RESULT 仅仅缓存最终的图像(转换后的)
- DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)
如果已经缓存过全尺寸图片,则根据全尺寸图片进行调整,不用重新下载了
3、override
如果没有为图片指定尺寸(override),默认会以View的大小去限制图片的大小
3、特点:
-
Glide支持远程图片/本地图片的获取、大小调整和展示
参考:使用Glide加载图片系列之一从不同的数据源加载图片 - 图片加载会和Activity/Fragment的生命周期保持一致,如paused状态暂停加载,resumed状态又自动重新加载
- 支持GIF:Glide.with(context).load(““):GIF动画图片可以自动显示为动画效果
- 加载静态图片:Glide.with(context).load(“图片路径“).asBitmap(),如果是gif,仅仅显示第一帧。
- 加载gif:Glide.with(context).load(“图片路径“).asGif(),如果不是gif,会被当作error处理。
- 如果相关的item已经滚出了屏幕的范围,Glide会自动取消超出屏幕的图片请求。Glide是通过在ImageView上设置一个tag,在加载另外一张图片之前检查这个tag,如果存在就取消第一次请求。
- 内存缓存 更小的图片 : Glide 以 url、viewwidth、viewheight、屏幕的分辨率等做为联合 key,将处理后的图片缓存在内存缓存中,而不是原始图片以节省大小
4、一些方法
1、关于downloadOnly、preload
- downloadOnly方法
downloadOnly不是用来重置图片大小的,即便设置了大小,也只会预缓存原始图像,不会缓存“结果”图像;参数通常为Target.SIZE_ORIGINAL,如下:
Glide.with(this).load(url)
.downloadOnly(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL);
- preload
如果想要预缓存图片,可以使用preload,注意前后的transformation(fitCenter)和size必须一致
Glide.with(this).load(url)
.diskCacheStrategy(DiskCacheStrategy.RESULT).fitCenter()
.preload(260,260);
downloadOnly仅仅进行硬盘缓存(缓存SOURCE),preload进行硬盘和内存缓存
参考:Difference between downloadOnly() and preload()、Is that downloadOnly not cache the image?
2、 Glide 中的回调:Targets
Glide 提供了各种的 targets ,可以在 Glide 做完网络请求和处理之后,在这里得到返回的结果。
- SimpleTarget
只是想通过Glide加载一个Bitmap而不是把它显示到View中
private SimpleTarget<Bitmap> simpleTarget=new SimpleTarget<Bitmap>(200,200) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
}
};
- ViewTarget:
通过Glide加载图片到对应的View中, 默认不支持加载图片到非ImageView 中,但是可以通过继承 ViewTarget 和其子类实现。- ViewTarget<T,Z>
- ImageViewTarget<Z>
- BitmapImageViewTarget:使用asBitmap()进行加载的默认目标
- DrawableImageViewTarget
- GlideDrawableImageViewTarget:正常加载和使用asGif()进行加载的默认目标.
加载图片到RelativeLayout中
private ViewTarget<RelativeLayout, GlideDrawable> viewTarget=new ViewTarget<RelativeLayout, GlideDrawable>(bgContainer) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
this.view.setBackground(resource.getCurrent());
}
};
Glide.with(getActivity()).load(R.drawable.ic_main_bg).diskCacheStrategy(DiskCacheStrategy.NONE)
.into(viewTarget);
注意:
1、在into()方法中,不要使用匿名内部类:在 Glide 做完图片请求之前, Android 垃圾很可能会回收这个匿名内部类对象,最终这可能会导致,当图像加载完成了,但是回调再也不会被调用。
2、使用SimpleTarget<Bitmap>时,需要为target指定一个尺寸
参考: Glide之Target
3、用 GlideModule自定义 Glide
- 实现GlideModule接口,全局改变 Glide 行为
public class ConfigurationGlide implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 设置别的get/set tag id,以免占用View默认的,Glide的3.6.0可以
ViewTarget.setTagId(R.id.glide_tag_id);
/*
内存缓存
Glide提供了一个类MemorySizeCalculator,用于决定内存缓存大小以及 bitmap 的缓存池。
bitmap 池维护了你 App 的堆中的图像分配。
正确的 bitmpa 池是非常必要的,因为它避免很多的图像重复回收,这样可以确保垃圾回收器的管理更加合理。
它的默认计算实现
*/
MemorySizeCalculator memorySizeCalculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = memorySizeCalculator.getMemoryCacheSize();
int defaultBitmapPoolSize = memorySizeCalculator.getBitmapPoolSize();
builder.setMemoryCache(new LruResourceCache((int) (defaultMemoryCacheSize*1.2f)));
builder.setBitmapPool(new LruBitmapPool((int) (defaultBitmapPoolSize * 1.2f)));
/*
磁盘缓存
Glide图片缓存有两种情况,一种是内部磁盘缓存另一种是外部磁盘缓存。
我们可以通过 builder.setDiskCache()设置,并且Glide已经封装好了两个类实现外部和内部磁盘缓存,
分别是InternalCacheDiskCacheFactory和ExternalCacheDiskCacheFactory
*/
//磁盘缓存100M,默认250M
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,100*1024*1024));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
磁盘缓存可以位于应用的私有目录(除了它自己,没有别的应用可以访问),也可以位于外部存储,不能一起设置这两个
- 声明:Glide 会扫描 AndroidManifest.xml 为 GlideModule 的 meta 声明。
<meta-data android:name="com.hqgj.shareimgtransition.common.ConfigurationGlide" android:value="GlideModule"/>
尽量不要使用太大的图片,一般页面上图片显示多大就把图片设置成多大,如果是后台上传的图片,可以使用组件把图片生成缩略图,如ASPJPEG上传组件。
4、为不同的分辨率设备,加载不同尺寸的图片
需要使用我们自己的ModeLoader(.using(new MyUrlLoader(this))),加载自己的数据源(.load(T model)),如下:
Glide.with(this).using(new MutImgUrlLoader(this))
.load(new MutImgDataModel() {
@Override
public String buildUrl(int width, int height) {
if(width>=1440){
return result.getImg()+ ThumbnailUtil.IMG1440;
}else if(width>=1080){
return result.getImg()+ThumbnailUtil.IMG1080;
}else if(width>=720){
return result.getImg()+ThumbnailUtil.IMG720;
}else if(width>=480){
return result.getImg()+ThumbnailUtil.IMG480;
}else {
return result.getImg()+ThumbnailUtil.IMG1080;
}
}
})
.asBitmap()
.transform(new GlideCircleTransform(this))
.error(R.mipmap.ic_launcher)
.animate(animator)
.into(new BitmapImageViewTarget(imageView){
@Override
protected void setResource(Bitmap resource) {
super.setResource(resource);
}
});
实现自定义的ModelLoader,继承BaseGlideUrlLoader。
public class MutImgUrlLoader extends BaseGlideUrlLoader<MutImgDataModel> {
public MutImgUrlLoader(Context context) {
super(context);
}
@Override
protected String getUrl(MutImgDataModel model, int width, int height) {
return model.buildUrl(width,height);
}
}
自定义数据源:
public interface MutImgDataModel {
public String buildUrl(int width, int height);
}
这样,我们在高分率的设备上加载大图的url1,在低分辨率的设备上加载小图url2。从而实现了根据不同手机上的像素值大小加载不同尺寸的图片的需求。
5、集成网络库
用 Glide 集成一个网络库,需要一个 Glide 的 ModeLoader 的接口。为了让你更加易用,Glide 为2个网络库提供了实现: OkHttp 和 Volley 。
Volley
dependencies {
...
// Glide
compile 'com.github.bumptech.glide:glide:3.6.1'
// Glide's Volley Integration
compile 'com.github.bumptech.glide:volley-integration:1.3.1@aar'
compile 'com.mcxiaoke.volley:library:1.0.8'
}
这将添加 Volley 并集成该库到你的项目中。集成库添加GlideModule 到你的 Android.Manifest 。Glide 会自动认出它,然后使用 Volley 作为网络库。并不要求做其他的配置!
6、取消缓存
取消内存缓存(在主线程中调用)
Glide.get(this).clearMemory();
7、在listview中加载高度不固定图片,加载刷新图片跳动解决?
为啥高度不固定的时候会闪烁呢,应该跟图片高度不同有关,在更新listview时候,会去重新计算listview高度,绘制item,不同高度图片会重新计算.
8、-实现滚动加载,不滚动时不加载
Glide.with(context).resumeRequests()/Glide.with(context).pauseRequests()
参考:
Android图片库--Glide Wiki中文翻译、图片加载框架Glide解析、对比Picasso内存占用、Yelp app是如何使用Glide优化图片加载的、Glide的使用大法与内伤治疗方案