Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。
使用:
在使用glide的时候,需要将glide的依赖添加到我们的工程中,在新建完过程以后在app/build.gradle文件当中添加如下依赖:
dependencies {
compile 'com.github.bumptech.glide:glide:4.4.0'
}
- 1
- 2
- 3
另外,Glide中需要用到网络功能,因此你还得在AndroidManifest.xml中声明一下网络权限才行:
<uses-permission android:name="android.permission.INTERNET" />
- 1
添加完事儿以后,我们就可以自由地使用Glide中的功能了。
作为一个资深的Android图片加载库,能够自如的加载图片自然不在话下:
首先在我们的xml文件中写入:
<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:text="Load Image"
android:onClick="loadImage"
/>
<ImageView
android:id="@+id/image_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
通过点击button来实现图片的加载。
然后就是我们的Java文件了:
public class MainActivity extends AppCompatActivity {
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image_view);
}
public void loadImage(View view) {
//url为图片地址。
String url = "http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg";
//加载图片到imageview
Glide.with(this).load(url).into(imageView);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
然后来看一下效果:
看到没,就是这么简单,其实关键代码只有一句:
Glide.with(this).load(url).into(imageView);
- 1
那么这功能强大的一行代码到底做了些什么:
加载网络上的图片、加载手机本地的图片、加载应用资源中的图片等等。
是不是感觉很厉害,接下来就进去仔细看看:
首先,调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。那如果调用的地方既不在Activity中也不在Fragment中呢?也没关系,我们可以获取当前应用程序的ApplicationContext,传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。
接下来看一下load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。因此load()方法也有很多个方法重载,除了我们刚才使用的加载一个字符串网址之外,你还可以这样使用load()方法:
// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);
// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);
// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
最后看一下into()方法,这个方法就很简单了,我们希望让图片显示在哪个ImageView上,把这个ImageView的实例传进去就可以了。
那么回顾一下Glide最基本的使用方式,其实就是关键的三步走:先with(),再load(),最后into()。熟记这三步,你就已经入门Glide了。
但是请不要误会,对于glide的功能可不是仅仅就这些:
扩展一下:占位图
Glide.with(this)
.load(url)
//这就是占位用的图片
.placeholder(R.drawable.loading)
.into(imageView);
- 1
- 2
- 3
- 4
- 5
到了这里,相信很多性子急的已经跑了一遍,然后说为什么没看到,如果你用的还是刚才的URL,那么,我只能告诉你,图片被缓存了,第二次的加载将会很快,当然,想看也可以:
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
//禁用缓存功能
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
- 1
- 2
- 3
- 4
- 5
- 6
只要再添加一句就好。这样就可以禁用glide的缓存功能。
效果图就不贴了,大家可以试试。
有加载前的占位,那,加载错了怎么办。
不急,也有:
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
//异常情况的占位图
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
看吧,再试试,可以把网络关掉。
接下来是glide的大招
GIF图片的加载:
String url = "http://p1.pstatp.com/large/166200019850062839d3";
//加载图片到imageview
Glide.with(this).load(url).into(imageView);
- 1
- 2
- 3
有人会说,为什么一样。
那是因为我们的glide是支持GIF图片的,同时也会自己判断图片格式。
但是,如果我不知道到底是什么格式的图片,只要求加载静态或者动态的怎么办,
Glide.with(this)
.load(url)
//指定加载静态图
.asBitmap()
//指定加载动态图
//.asGif()
//如果指定加载动态图,却出入静态图片地址就会显示加载异常的占位图
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
注释都有写,我就不多说了。
接下来是指定加载图片的大小:
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
//指定图片的大小
.override(100, 100)
.into(imageView);