首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

项目中如何快速将Glide3替换成Glide4

我想大多数人在自己的项目中还是使用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的功能在这里没有详细给出,需要了解,请看:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171226G03VL300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券