我想大多数人在自己的项目中还是使用Glide3.7.1这个版本吧!不过Glide版本现在已经到4.4.0了!
当我们把Glide3更换成Glide4,会发现大部分地方都报错了,那么该怎样快速替换Glide3为Glide4呢?
下面我们一起来看看怎样实现Glide3到Glide4的快速替换。
Glide4的基本用法:
引入Glide
compiler:包含各种注解的使用,Glide3快速替换成Glide4时要用到。
添加网络权限
在这个地方可能你的项目会报个错:java.lang.NoSuchMethodError
这是因为Glide4中已经引入了appcompat-v7包,版本不一致引起。
解决方法:
Glide4.4.0引入的是27.0.2版本,所以把你项目中的appcompat-v7更换为:
implementation'com.android.support:appcompat-v7:27.0.2'
普通加载图片
Glide.with(this.getApplicationContext())
.load(url)
.into(mImage);
占位图和错误时显示图片
RequestOptions options =newRequestOptions();
options.placeholder(R.drawable.ic_launcher_background);
options.error(R.mipmap.load_error);
//禁用掉Glide的缓存功能
options.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this.getApplicationContext())
.load(url)
.apply(options)
.into(mImage);
这里就是Glide4和Glide3的最大不同,他将部分API功能封装在RequestOptions 中,在通过apply方法,传递给Glide使用,这样我们就可以很方便的在需要的地方可以进行不同的配置了,不用像Glide3一样传递很多参数!
指定图片大小
RequestOptions options1 =newRequestOptions();
//指定大小为200*100
//options1.override(200, 100);
//加载一张图片的原始尺寸的图片
options1.override(Target.SIZE_ORIGINAL);
Glide.with(this.getApplicationContext())
.load(url)
//请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,
// 就显示缩略图,否则就不显示。
// 系数sizeMultiplier必须在(0,1)之间,
// 可以递归调用该方法。
.thumbnail(0.1f)
.apply(options1)
.into(mImage);
禁用内存缓存&硬盘缓存功能
// DiskCacheStrategy.NONE: 表示不缓存任何内容。
// DiskCacheStrategy.DATA: 表示只缓存原始图片。
// DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
// DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
// DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。
RequestOptions options2 =newRequestOptions()
//禁用内存缓存
.skipMemoryCache(true)
//硬盘缓存功能
.diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this.getApplicationContext())
.load(url)
.apply(options2)
.into(mImage);
指定加载格式GIF
Glide.with(this.getApplicationContext())
.load("file:///android_asset/jdfw.gif")
.into(mImage);
获取gif第一帧
/**
* 注意:在Glide 3中的语法是先load()再asBitmap()的,
*
* 而在Glide 4中是先asBitmap()再load()的
*
* 如果写错了顺序就肯定会报错了
*/
Glide.with(this.getApplicationContext())
//.asBitmap()//强制指定加载静态图片
//.asGif()//强制指定加载动态图片
//.asFile()//强制指定文件格式的加载
.asDrawable()//强制指定Drawable格式的加载
.load("file:///android_asset/jdfw.gif")
.into(mImage);
回调与监听
/**
* 回调与监听
*/
SimpleTargetsimpleTarget=newSimpleTarget() {
@Override
public voidonResourceReady(Drawable resource,Transition
mImage.setImageDrawable(resource);
}
};
Glide.with(this.getApplicationContext())
.load(url)
.into(simpleTarget);
预加载后显示
预加载
Glide.with(this)
.load("https://unsplash.it/200/200?random&22")
.preload();
预加载后显示
Glide.with(this.getApplicationContext())
.load("https://unsplash.it/200/200?random&22")
.into(mImage);
submit()方法:类似Glide3中的downloadOnly
newThread(newRunnable() {
@Override
public voidrun() {
try{
finalContext context = getApplicationContext();
FutureTarget target = Glide.with(context)
//.asDrawable()
.asFile()
.load(url)
.submit();
//final Drawable drawable = target.get();
finalFile imageFile = target.get();
runOnUiThread(newRunnable() {
@Override
public voidrun() {
mTextview.setText(imageFile.getPath());
}
});
}catch(Exception e) {
e.printStackTrace();
}
}
}).start();
listener()方法
Glide.with(this.getApplicationContext())
.load(url)
.listener(newRequestListener() {
@Override
public booleanonLoadFailed(@NullableGlideException e,Object model,Target target, booleanisFirstResource) {
mTextview.setText("加载失败");
return false;
}
@Override
public booleanonResourceReady(Drawable resource,Object model,Target target,DataSource dataSource, booleanisFirstResource) {
mTextview.setText("加载成功");
return false;
}
})
.into(mImage);
图片变换(圆角等)
RequestOptions options3 =newRequestOptions();
//options3.centerCrop();
// options3.fitCenter();
options3.circleCrop();
Glide.with(this.getApplicationContext())
.load("https://unsplash.it/200/200?random&55")
.apply(options3)
.into(mImage);
自定义模块
在Glide3中定义了自定义模块之后,还必须在AndroidManifest.xml文件中去注册它才能生效,而在Glide 4中是不需要的,因为@GlideModule这个注解已经能够让Glide识别到这个自定义模块了(记得Build -> Rebuild Project)!
packagetsou.com.simple.glide4test.glidemodule;
importandroid.content.Context;
importcom.bumptech.glide.Glide;
importcom.bumptech.glide.GlideBuilder;
importcom.bumptech.glide.Registry;
importcom.bumptech.glide.annotation.GlideModule;
importcom.bumptech.glide.load.DecodeFormat;
importcom.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
importcom.bumptech.glide.module.AppGlideModule;
/**
* Created by Administrator on 2017/12/22 0022.
* 在Glide3中需要在AndroidManifest.xml中配置
*
* Glide4,只要有@GlideModule注解就好
*/
@GlideModule
public classMyAppGlideModuleextendsAppGlideModule {
public static final intDISK_CACHE_SIZE=500*1024*1024;
public static finalStringDISK_CACHE_NAME="huangxiaoguo";
@Override
public voidapplyOptions(Context context,GlideBuilder builder) {
super.applyOptions(context,builder);
/**
将所有Glide加载的图片缓存到SD卡上,
默认硬盘缓存大小都是250M,这里改为500
* */
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
/**
ExternalCacheDiskCacheFactory的默认缓存路径
是在sdcard/Android/data/包名/cache/image_manager_disk_cache目录当中
*/
//builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_SIZE));
/**
* 更改缓存最总文件夹名称
*
* 是在sdcard/Android/data/包名/cache/DISK_CACHE_NAME目录当中
*/
//此方法在Glide4已过时
// builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
builder.setDiskCache(newExternalPreferredCacheDiskCacheFactory(context,DISK_CACHE_NAME,DISK_CACHE_SIZE));
/**
* Glide也能使用ARGB_8888的图片格式
* 虽然图片质量变好了,但同时内存开销也会明显增大
*/
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public voidregisterComponents(Context context,Glide glide,Registry registry) {
super.registerComponents(context,glide,registry);
}
}
默认缓存路径
设置缓存路径为SD卡
Glide3替换成Glide4(Generated API)
在自定义模块完成以后,就可以使用Glide的模式啦!请看:
//使用Generated API(类似Glide3用法)
//使用GlideApp,首先确保你的代码中有一个自定义的模块,
// 并且给它加上了@GlideModule注解,也就是自定义模块
GlideApp.with(this.getApplicationContext())
.load(url)
.placeholder(R.drawable.ic_launcher_background)
.error(R.mipmap.load_error)
.skipMemoryCache(true)//清除缓存
.diskCacheStrategy(DiskCacheStrategy.NONE)//表示既缓存原始图片,也缓存转换过后的图片
.override(Target.SIZE_ORIGINAL)
.circleCrop()//切圆
.into(mImage);
把之前Glide替换成GlideApp,就可以使用Glide3的方式进行使用了!是不是很方便!
定制自己的API
定制自己的API需要借助@GlideExtension和@GlideOption这两个注解。创建一个我们自定义的扩展类
packagetsou.com.simple.glide4test.glidemodule;
importcom.bumptech.glide.annotation.GlideExtension;
importcom.bumptech.glide.annotation.GlideOption;
importcom.bumptech.glide.load.engine.DiskCacheStrategy;
importcom.bumptech.glide.request.RequestOptions;
importtsou.com.simple.glide4test.R;
/**
* Created by Administrator on 2017/12/25 0025.
*/
@GlideExtension
public classMyGlideExtension {
/**
* 将这个类的构造函数声明成private,这是必须要求的写法
*/
privateMyGlideExtension() {
}
@GlideOption
public static voidmyGlideConfiguration(RequestOptions options) {
//占位图
options.placeholder(R.drawable.ic_launcher_background);
//错误图片
options.error(R.mipmap.load_error);
//表示只缓存原始图片
options.diskCacheStrategy(DiskCacheStrategy.DATA);
//切圆
options.circleCrop();
//...等等所有的属性
}
}
使用自定义API方式
GlideApp.with(this.getApplicationContext())
.load(url)
.myGlideConfiguration()//自定义API
.into(mImage);
这样,我们就可以直接使用自己的API了,同时所有的Glide配置都在MyGlideExtension 进行配置,方便项目中的同意修改!
到此Glide4的基本使用到此结束,希望对你有所帮助!
同时欢迎大家的指教,谢谢!
Demo地址:http://download.csdn.net/download/huangxiaoguo1/10172358
Glide4的使用方式虽然和Glide3不同,但是主要的功能却和Glide3一样,其他关于Glide4的功能在这里没有详细给出,需要了解,请看:
领取专属 10元无门槛券
私享最新 技术干货