开始
首先在app/build.gradle文件中增加如下依赖:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}
再添加上网络权限
加载图片
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="点击" />
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
public class MainActivity extends Activity {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
}
public void click(View view) {
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).into(imageView);
}
}
占位图
设置加载中图片:
RequestOptions options = new RequestOptions().placeholder(R.mipmap.ic_loading);
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).into(imageView);
设置加载失败图片:
RequestOptions options = new RequestOptions().placeholder(R.mipmap.ic_loading).error(R.mipmap.ic_fail);
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).into(imageView);
指定图片大小
Glide默认会根据ImageView的大小决定图片的大小,保证图片不会导致OOM,但是还是可以对图片的大小进行修改的
RequestOptions options = new RequestOptions().override(100,100);
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).into(imageView);
如果想加载一张原始尺寸的图片,可以使用Target.SIZE_ORIGINAL关键字
RequestOptions options = new RequestOptions().override(Target.SIZE_ORIGINAL);
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).into(imageView);
这样就不会压缩图片,会去加载原始图片,但是会导致出现OOM的风险。
缓存机制
Glide缓存的设计是三级缓存,两级内存缓存和一级硬盘缓存,默认情况下开启了内存缓存和硬盘缓存,如果需要将内存缓存禁掉,可以使用如下代码:
RequestOptions options = new RequestOptions().skipMemoryCache(true);
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).into(imageView);
如果想禁掉硬盘缓存:
RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE);
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).into(imageView);
对于硬盘缓存,有以下几种策略:
DiskCacheStrategy.NONE:表示不缓存
DiskCacheStrategy.DATA:只缓存原始图片
DiskCacheStrategy.RESOURCE:只缓存转换后的图片
DiskCacheStrategy.ALL:既缓存原始图片,也缓存转换后的图片
DiskCacheStrategy.AUTOMATIC:Glide根据图片资源自动的选择哪一种缓存策略(默认)
指定加载格式
Glide加载gif图片,会自动判断图片格式,显示出动态图片,但是如果即使是动态图片,也想让其静态显示,可以使用如下方法:
Glide.with(this).asBitmap().load(url).apply(options).into(imageView);
这样,Glide只会加载gif图片的第一帧,Glide还有asGif()、asFile()、asDrawable()
回调和监听
into
可以在加载图片到ImageView之前,对图片进行一些操作,可以使用此监听方法
SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
imageView.setImageDrawable(resource);
}
};
RequestOptions options = new RequestOptions();
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).into(simpleTarget);
preload
这个方法可以用于将图片预加载,然后在需要的时候可以直接从缓存中读取图片
RequestOptions options = new RequestOptions();
String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).preload();
submit
这个方法只会下载图片,不会加载图片,下载完毕之后,可以得到图片的下载路径,此时就可以进行一些后续处理
new Thread() {
@Override
public void run() {
final Context context = getApplicationContext();
FutureTarget<File> target = Glide.with(context).asFile().load(url).submit();
try {
final File file = target.get();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, file.getPath(), Toast.LENGTH_SHORT).show();
}
});
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}.start();
listener
这个方法可以用来监听图片的加载状态,可以通过此方法监听图片加载成功或失败
RequestOptions options = new RequestOptions();
final String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
}).apply(options).preload();
返回值false表示这个事件不会被处理,还会继续传递下去,比如我们在onResourceReady方法中返回了true,那么就会不会回调Target的onResourceReady()方法了
图片转换
图片转换的意思就是Glide将图片加载到Image显示之前会进行一些转换操作,比如实现一些更加丰富的效果,比如圆角化、圆形化、模糊化等等
添加方法是只需要在RequestOptions中串接transform方法即可
RequestOptions options = new RequestOptions().transform(...);
final String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539918930434&di=e9ce5f3b1888347b02d94ed2e090087c&imgtype=0&src=http%3A%2F%2Fc16.eoemarket.net%2Fapp0%2F576%2F576906%2Fscreen%2F2940682.jpg";
Glide.with(this).load(url).apply(options).preload();
一般情况下,进行如何的转换都是我们自己来实现的,但是Glide内置了一些转换的API
RequestOptions options = new RequestOptions()
.centerCrop();
RequestOptions options = new RequestOptions()
.fitCenter();
RequestOptions options = new RequestOptions()
.circleCrop();
从名称我们就可以知道是什么意思,当然我们也可以自定义transform,继承自BitmapTransformation,具体可以参考源码中的内置的API进行自定义
关于图片变换,我们也可以使用开源库glide-transformations,实现了需要通用的图片变化效果,如裁剪变化、颜色变化、模糊变换等
glide-transformations的项目主页地址是 https://github.com/wasabeef/glide-transformations 。
本文参考郭霖大神关于Glide的博客