图片可以丰富App的显示效果,但是图片也是最难处理的,因为通常情况下,图片是最耗内存的。

iOS的同学都知道SDWebImage,它极大的简化了我们对图片的操作。而Android端的图片加载框架则有很多,VolleyPicassoGlide,今天我们主要说的就是Glide

基本用法

首先使用gradle导入Glide

dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}

在导入之前,最好先去Github上查看一下最新版本。当然,需要加入网络权限。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView mImageView;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.image_view);
mButton = (Button) findViewById(R.id.loadImage);
mButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String url = "https://f10.baidu.com/it/u=1863145503,1330064667&fm=72";
Glide.with(this)
.load(url)
.into(mImageView);
}
}
with()

先来看看with方法,with方法可以接收ContextActivityFragmentActivityFragment,这四种类型的参数。此方法传入的实例决定Glide加载图片的生命周期,如果传入的是Activity的实例,当Activity被销毁的时候,图片加载也会停止。此方法返回一个RequestManager对象。

load()

load方法用于指定加载的图片资源,可以是网络图片,本地图片,应用资源,二进制流,Uri对象等。

// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(mImageView);
// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(mImageView);
// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(mImageView);
// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(mImageView);
into()

into表示将下载好的图片显示在哪个ImageView上。当然,有时候我们需要在图片下载完成以后做一些事情,如下:

Glide.with(this)
.load(imageUri)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
//处理图片
}
});;

上面三个方法组成了一个完整的加载过程,在这个加载过程中,我们还可以添加其他的配置。下面的方法都是添加在loadinto之间。

asBitmap()

设置图片的格式为静态图片,如果要加载的图片格式是gif,那么会显示第一帧的静态图片。

asGif()

设置图片的格式为动态图片,如果要加载的图片格式是静态图片,那么会直接回显示错误图片。

placeholder()

此方法用于设置一个占位图

String url = "https://f10.baidu.com/it/u=1863145503,1330064667&fm=72";
Glide.with(this)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.into(mImageView);
diskCacheStrategy()

此方法主要用作与磁盘缓存,可传参数为:

  • DiskCacheStrategy.ALL: 即缓存原图又缓存压缩后的图
  • DiskCacheStrategy.NONE:不缓存
  • DiskCacheStrategy.SOURCE:原图缓存
  • DiskCacheStrategy.RESULT:缓存压缩后的图片,因为Glide通常不会把原图显示到界面上,例如我们的ImageView的大小是50x50,而图片的大小是200x200,如果我们原图显示,会造成不必要的内存浪费。所以Glide会根据图片的实际大小来压缩。

注意:如果显示的图片位gif格式的图片,最好不缓存,因为Glide会一帧一帧的缓存图片。

skipMemoryCache()

此方法表示是否跳过内存缓存,设置为true表示不进行内存缓存。

error()

设置一个加载失败的图片

animate()

设置加载成功后,显示的动画

override()

设置图片加载成功后的大小,例如:verride(300,300)

priority()

设置下载的优先级

clearDiskCache()

清理磁盘缓存,需要在子线程中执行 Glide.get(this).clearDiskCache();

clearMemory()

清理内存缓存,可以在UI线程执行 Glide.get(this).clearMemory();


GlideMoudle

GlideMoudle是一个抽象方法,全局改变Glide行为的一个方式,通过全局GlideMoudle配置Glide,用GlideBuilder设置选项,用Glide注册ModelLoader等。

自定义一个GlideMoudle
public class MyGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
//配置
}
@Override
public void registerComponents(Context context, Glide glide) {
//注册
}
}
AndroidManifest.xml注册
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.guiyongdong.wangyidemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
<meta-data android:name="com.guiyongdong.wangyidemo.MyGlideModule"
android:value="GlideModule"/>
</application>
</manifest>
添加混淆处理

因为我们的代码有可能添加混淆,所以不要给MyGlideModule添加混淆

-keepnames class com.guiyongdong.wangyidemo.MyGlideModule
设置Glide内存缓存大小
int maxMemory = (int) Runtime.getRuntime().maxMemory(); //获取系统分配给应用的总内存大小
int memoryCacheSize = maxMemory/8; //设置图片内存缓存占八分之一
builder.setMemoryCache(new LruResourceCache(memoryCacheSize)); //设置内存缓存大小
设置Glide磁盘缓存大小
File cacheDir = context.getExternalCacheDir(); //设置缓存路径
int diskCacheSize = 1024*1024*30; //缓存大小
builder.setDiskCache(new DiskLruCacheFactory(cacheDir.getParent(),"glide",diskCacheSize)); //设置磁盘缓存大小 glide 表示文件名

也可以通过如下两种方式:

//存放在data/data/xxxx/cache/
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "glide", diskCacheSize));
//存放在外置文件浏览器
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "glide", diskCacheSize));
设置图片的解码格式
//设置图片解码格式
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
设置缓存内存大小
//设置BitmapPool缓存内存大小
builder.setBitmapPool(new LruBitmapPool(memoryCacheSize));

基本上的关于Glide的用法已经了解的差不多了,接下来,如果有时间,会了解一下Glide的源码。