Glide 使用简单总结(整理郭霖Glide系列文章)


文中内容整理自郭霖Glide系列文章
郭霖 Glide


Glide 使用简单总结

基本使用

  • 基本使用
Glide.with(this)
     .load(url)
     .into(imageView);
  • 添加占位图
Glide.with(this)
     .load(url)
     .placeholder(本地图片)
     .error(本地图片)
     .into(imageView);
  • 强制转换图片格式(动态gif图与静态bitmap)
// 强制静态图
Glide.with(this)
     .load(url)
     .asBitmap()
     .placeholder(本地图片)
     .error(本地图片)
     .into(imageView);

// 强制动态图(注意如果不是动态图,会报错,但是添加了error()方法之后可以捕获)
Glide.with(this)
     .load(url)
     .asGif()
     .placeholder(本地图片)
     .error(本地图片)
     .into(imageView);
  • 指定图片大小(使用override方法)
Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .override(100, 100) // 可以传入Target.SIZE_ORIGINAL表示原始图片大小
     .into(imageView);

缓存

  • 内存缓存(默认开启)
Glide.with(this)
     .load(url)
     .skipMemoryCache(true) // 传入true则表示不使用内存缓存
     .into(imageView);
  • 磁盘缓存(默认使用的是DiskCacheStrategy.RESULT)

DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

引申使用

缓存使用key来进行本地缓存查找,有时候会有这样的情况,地址在变,但是其实图片还是同一个图片,例如七牛的图片有时候可能会带有一个token,像这样http://url.com/image.jpg?token=d9caa6e02c990b0a, token可能会变,但是图片还是同一个图片,如果直接使用是无法使用缓存的。这个时候需要对glide的GlideUrl进行一下改造。代码如下:

public class MyGlideUrl extends GlideUrl {
    private String mUrl;
    public MyGlideUrl(String url) {
        super(url);
        mUrl = url;
    }
    /**
    * 关键就是这个getCacheKey, 在代码里面将它的token给屏蔽掉即可,那么Glide在缓存时使
    * 用的key就是去掉token之后的key
    * /
    @Override
    public String getCacheKey() {
        return mUrl.replace(findTokenParam(), "");
    }
    private String findTokenParam() {
        String tokenParam = "";
        int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
        if (tokenKeyIndex != -1) {
            int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
            if (nextAndIndex != -1) {
                tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
            } else {
                tokenParam = mUrl.substring(tokenKeyIndex);
            }
        }
        return tokenParam;
    }
}

使用如下:

Glide.with(this)
     .load(new MyGlideUrl(url))  // 在这里将url改为使用MyGlideUrl
     .into(imageView);

回调与监听

  • Target

先看一下Target的继承关系


Target 继承关系

其中有两个基本的Target

  1. SimpleTarget

单独使用比较灵活,但是写成代码有点难看

  1. ViewTarget

直接配合View写,将它添加到自定义View的内部,使用的时候简练

  • SimpleTarget使用(比较简单,不多赘述)
// 此处的泛型可以是GlideDrawable或者Bitmap。
// 但是如果是Bitmap的话,调用的时候就需要添加asBitmap()方法
SimpleTarget simpleTarget = new SimpleTarget() {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        // TODO 在此处做一些其他需要做的事情
        imageView.setImageDrawable(resource);
    }
};

public void loadImage() {
    String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
    Glide.with(this)
         .load(url)
         .into(simpleTarget);
}
  • ViewTarget

用于配合View集成使用,直接写到View的内部,其他和SimpleTarget差不多,只是写的位置不一样

// 写一个自定义View
public class MyLayout extends LinearLayout {
    
    // 定义一个ViewTarget, 注意泛型
    private ViewTarget viewTarget; 

    public MyLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        
        // 创建并重写代码,其实和SimpleTarget是一样的
        viewTarget = new ViewTarget(this) {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
                MyLayout myLayout = getView();
                myLayout.setImageAsBackground(resource);
            }
        };
    }

    // 重要的是这个方法,使用Glide的时候需要调用这个方法来得到一个Target
    public ViewTarget getTarget() {
        return viewTarget;
    }

    public void setImageAsBackground(GlideDrawable resource) {
        setBackground(resource);
    }
}

使用:

public void loadImage(MyLayout myLayout) {
        String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg";
        Glide.with(this)
             .load(url)
             .into(myLayout.getTarget()); // 就是这里调用
    }
  • preLoad

preLoad就是只加载,不显示,意思即可以先将图片缓存下来,在实际需要的时候再调用,那么就会从内存或者磁盘里面进行加载,这样速度快

Glide.with(this)
     .load(url)
     .diskCacheStrategy(DiskCacheStrategy.SOURCE) // 配合使用SOURCE
     .preload();
  • downloadOnly (略,可以查看郭霖 Glide)
  • listener
Glide.with(this)
            .load(url)
            .listener(new RequestListener() {
                @Override
                public boolean onException(Exception e, String model, Target target,
                    boolean isFirstResource) {
                    return false;
                }

                @Override
                public boolean onResourceReady(GlideDrawable resource, String model,
                    Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                    return false;
                }
            })
            .into(imageView);

图片变换

  • 基本变换

默认的图片变换是fitCenter,可能直接使用override进行大小指定,这样图片会按指定的大小进行加载显示,也可以使用图片变换,也可以两个同时使用

Glide.with(this)
     .load(url)
     .dontTransform() // 禁用变换
     .into(imageView);

Glide.with(this)
     .load(url)
     .transform(...) // 使用变换
     .into(imageView);

// 下面两个只是对transform的一个封装
Glide.with(this)
     .load(url)
     .centerCrop() // centerCrop
     .into(imageView);

Glide.with(this)
     .load(url)
     .fitCenter() // fitCenter
     .into(imageView);
  • 自定义变换

重写BitmapTransform类(略),调用时将重写的BitmapTransform加到transform方法里面

  • 使用变换库

Github Glide 变换库或者直接compile

dependencies {
    compile 'jp.wasabeef:glide-transformations:2.0.2'
}

可以多个同时使用

Glide.with(this)
     .load(url)
     .bitmapTransform(new BlurTransformation(this), new GrayscaleTransformation(this))
     .into(imageView);

Glide的自定义模块功能(略,参考郭霖 Glide 自定义模块)

  • 自定义配置,缓存策略等
  • 自定义组件,请求框架等

你可能感兴趣的:(Glide 使用简单总结(整理郭霖Glide系列文章))