Glide 4.x集成及使用注意事项

一、集成

1、project gradle

repositories {
        mavenLocal()
 }

2、app gradle

compile 'com.android.support:support-v4:25.3.1'
compile 'com.github.bumptech.glide:glide:4.0.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0'

3、混淆

#glide4.0
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

# 从glide4.0开始,GifDrawable没有提供getDecoder()方法,
# 需要通过反射获取gifDecoder字段值,所以需要保持GifFrameLoader和GifState类不被混淆
-keep class com.bumptech.glide.load.resource.gif.GifDrawable$GifState{*;}
-keep class com.bumptech.glide.load.resource.gif.GifFrameLoader {*;}

4、在4.0中不用像3.X需要在AndroidManifest.xml配置GlideModule,而是通过注解继承AppGlideModule的子类来配置。

@GlideModule
public class GlideConfiguration extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        //自定义缓存目录,磁盘缓存给150M 另外一种设置缓存方式
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "GlideImgCache", 150 * 1024 * 1024));
        //配置图片缓存格式 默认格式为8888
        builder.setDefaultRequestOptions(RequestOptions.formatOf(DecodeFormat.PREFER_ARGB_8888));
        ViewTarget.setTagId(R.id.glide_tag_id);
    }

    /**
     * 禁止解析Manifest文件
     * 主要针对V3升级到v4的用户,可以提升初始化速度,避免一些潜在错误
     * @return
     */
    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }

}

二、使用

1、基本用法
多数情况下,使用Glide加载图片非常简单,一行代码足矣:

Glide.with(context)
        .load(myUrl)
        .into(imageView);

取消加载同样很简单:

Glide.with(context).clear(imageView);

尽管及时取消不必要的加载是很好的实践,但这并不是必须的操作。实际上,当 Glide.with() 中传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。

2、加载圆形图

Glide.with(this)
        .load(R.mipmap.ic_splash_bg)
        .apply(bitmapTransform(new CropCircleTransformation()))
        .into(mImageHead);

3、模糊过滤

Glide.with(this)
        .load(R.mipmap.ic_splash_bg)
        .apply(bitmapTransform(new BlurTransformation( 25, 4)))
        .into(mImageView);

4、在 Application 模块中的使用
在 Application 模块中,可创建一个添加有 @GlideModule 注解,继承自 AppGlideModule 的类。此类可生成出一个流式 API,内联了多种选项,和集成库中自定义的选项:

package com.example.myapp;

import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}

生成的 API 默认名为 GlideApp ,与 AppGlideModule 的子类包名相同。在 Application 模块中将 Glide.with() 替换为 GlideApp.with(),即可使用该 API 去完成加载工作。

GlideApp.with(context)
  			 .load(myUrl)
   			 .placeholder(placeholder)
 			 .fitCenter()
			 .into(imageView);

三、注意事项

1、使用GlideApp代替Glide,asBitmap、asGif、asDrawable、asFile都要放到load之前(glide3.7.0都是要在load之后调用)。

public static void loadImg(Context context,String url, ImageView imageView){
        GlideApp.with(context)
                	.asBitmap()
                	.load(url)
                	.placeholder(R.drawable.placeholder) //设置资源加载过程中的占位符
               	 	.into(imageView);
    }

2、占位符.placeholder(R.drawable.placeholder)不能用.9图,占位图片和加载的目标图片会同时显示,只是目标图片会先显示缩略图,然后显示正常。

3、加载gif图时,若调用dontAnimate()移除所有动画,gif就会加载失败。

4、设置淡入淡出动画
glide3.7.0

Glide.with(context)
                .load(url)
                .crossFade(100)  //系统渐变动画
                .placeholder(R.drawable.placeholder)
                .fallback(R.drawable.fallback) 
                .diskCacheStrategy(DiskCacheStrategy.ALL)  
                .into(imageView);

glide4.0

GlideApp.with(context)
                .load(url)
                .transition(DrawableTransitionOptions.withCrossFade(100))//淡入淡出100m
                .placeholder(R.drawable.placeholder)
                .fallback(R.drawable.fallback) 
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView);

5、磁盘缓存策略
glide3.7.0

DiskCacheStrategy 的枚举意义:
 DiskCacheStrategy.NONE 什么都不缓存
 DiskCacheStrategy.SOURCE 只缓存全尺寸图
 DiskCacheStrategy.RESULT 只缓存最终的加载图
 DiskCacheStrategy.ALL 缓存所有版本图(默认行为)

glide4.0

//DiskCacheStrategy.ALL 既缓存原始图片,也缓存转换过后的图片。
 // DiskCacheStrategy.NONE 不缓存任何内容
 // DiskCacheStrategy.DATA 在资源解码前就将原始数据写入磁盘缓存(即只缓存原始图片)
 // DiskCacheStrategy.RESOURCE 在资源解码后将数据写入磁盘缓存,即经过缩放等转换后的图片资源(即只缓存转换过后的图片)。
 // DiskCacheStrategy.AUTOMATIC 让Glide根据图片资源智能地选择使用哪一种缓存策略。
 //(默认采用)DiskCacheStrategy.AUTOMATIC策略
 /-------------------------------------------------------------------------------/
 //源码 RequestOptions.java
 private DiskCacheStrategy diskCacheStrategy = DiskCacheStrategy.AUTOMATIC;

6、占位符、错误图片设置
glide4.0 若into中设置的是target,占位符(placeholder、error)需要在回调中再次设置,否则无效。

public static void loadImg(String url, ImageView imageView) {
        //into中用Target,占位符(placeholder、error)需要在回调中设置
        GlideApp.with(FanhuanApplication.getInstance().getApplication())
                .asBitmap()
                .load(url)
                .placeholder(drawbleId) //设置资源加载过程中的占位符
                .fallback(drawbleId)
                .error(drawbleId)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                       imageView.setImageBitmap(resource);                    
                 }

                    @Override
                    public void onLoadFailed(@Nullable Drawable errorDrawable) {
                        super.onLoadFailed(errorDrawable);
                         if(errorDrawable!=null){
                            imageView.setImageDrawable(errorDrawable);
                        }                  
                    }

                    @Override
                    public void onLoadStarted(@Nullable Drawable placeholder) {
                        super.onLoadStarted(placeholder);
                       if(placeholder!=null){
                            imageView.setImageDrawable(placeholder);
                        }
                    }
                });
    }