android 图片加载库 Glide4 使用教程(项目中如何快速将 Glide3 替换成 Glide4)
获取 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);
回调与监听
/**
回调与监听
*/
SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<? super Drawable> 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
new Thread(new Runnable() {
@Override
public void run() {
try {
final Context context = getApplicationContext();
FutureTarget<File> target = Glide.with(context)
//.asDrawable()
.asFile()
.load(url)
.submit();
//final Drawable drawable = target.get();
final File imageFile = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextview.setText(imageFile.getPath());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
listener()方法
Glide.with(this.getApplicationContext())
.load(url)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
mTextview.setText("加载失败");
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
mTextview.setText("加载成功");
return false;
}
})
.into(mImage);
图片变换(圆角等)
RequestOptions options3 = new RequestOptions();
//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)!
package tsou.com.simple.glide4test.glidemodule;
import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.module.AppGlideModule;
/**
Created by Administrator on 2017/12/22 0022.
在 Glide3 中需要在 AndroidManifest.xml 中配置
<p>
Glide4,只要有 @GlideModule 注解就好
*/
@GlideModule
public class MyAppGlideModule extends AppGlideModule {
public static final int DISK_CACHE_SIZE = 500 * 1024 * 1024;
public static final String DISK_CACHE_NAME = "huangxiaoguo";
@Override
public void applyOptions(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(new ExternalPreferredCacheDiskCacheFactory(context, DISK_CACHE_NAME, DISK_CACHE_SIZE));
/**
Glide 也能使用 ARGB_8888 的图片格式
虽然图片质量变好了,但同时内存开销也会明显增大
*/
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public void registerComponents(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 这两个注解。创建一个我们自定义的扩展类
package tsou.com.simple.glide4test.glidemodule;
import com.bumptech.glide.annotation.GlideExtension;
import com.bumptech.glide.annotation.GlideOption;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import tsou.com.simple.glide4test.R;
/**
Created by Administrator on 2017/12/25 0025.
*/
@GlideExtension
public class MyGlideExtension {
/**
将这个类的构造函数声明成 private,这是必须要求的写法
*/
private MyGlideExtension() {
}
@GlideOption
public static void myGlideConfiguration(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 的功能在这里没有详细给出,需要了解,请看:
评论