★40.Glide

前言

在写本教程时, Glide 的版本号是3.7。

简介

  • 相关网址:GitHub地址、英文文档。
  • Glide 是一个媒体管理框架,支持图片、原生视频的加载,包括从网络上加载。

相关概念

  • Target:可以指ViewTarget(含View)或SimpleTarget(不含View)。
  • Signature:签名,可以唯一地标识一个对象。
  • Resource.recycle():表示该资源不被引用,可以被回收。

简单示例

创建Glide

Glide.with(this)
        .load(/* 加载源 */)
        .into(imageView);

Glide的简单配置项

  • 设置绑定的生命周期:with(this)
  • 设置加载资源:load(/* 加载源 */),加载源可以是如下几种类型对象:
    • byte[]:字节数组。
    • String:可以是文件路径或者Url等。
    • Integer:资源id。
    • File:文件。
    • Uri:数据。
  • 设置加载的优先级:priority(/* 优先级 */)
    • Priority.LOW
    • Priority.NORMAL
    • Priority.HIGH
    • Priority.IMMEDIATE
  • 设置“加载中”占位图片:placeholder(/* 加载源 */)
  • 设置“加载失败”占位图片:error(/* 加载源 */)
  • 设置gif为静态:asBitmap()
  • 设置gif为动态:asGif()
  • 设置加载动画为无动画:dontAnimate()
  • 设置加载动画为淡入淡出动画:crossFade(/* 动画时间 */)
  • 设置加载动画为自定义动画:animate(R.anim.id)
  • 设置尺寸:override(800, 800)
  • 设置裁剪策略为拉伸裁剪:centerCrop()
  • 设置裁剪策略为拉伸不裁剪:fitCenter()

Glide的复杂配置项

缩略图

简介

  • 缩略图 :在图片加载过程中显示的图片。

简单的缩略图加载

  • 简单的 缩略图 是和 原图 一起加载的。
.thumbnail(0.1f)

独立的缩略图加载

  • 缩略图 的加载是和 原图 的加载相互独立的。
  • 以下代码可以多次递归,即设置 原图缩略图缩略图 又设置其 缩略图 ,可实现从模糊到清晰的加载过程。
DrawableRequestBuilder thumbnailRequest = Glide
        .with(context)
        .load(eatFoodyImages[2]);
.thumbnail(thumbnailRequest)

错误调试

简介

  • RequestListener.onException(...):资源加载出错时调用。
  • RequestListener.onResourceReady(...):资源加载完成时调用。

1. 创建RequestListener

RequestListener errorListener = new RequestListener() {
    @Override
    public boolean onException(Exception e, String model, Target target,
                               boolean isFirstResource) {
        Log.e("onException", e.toString() + "  model:" + model + " isFirstResource: " + isFirstResource);
        imageView.setImageResource(R.mipmap.ic_launcher);
        return false;
    }

    @Override
    public boolean onResourceReady(GlideDrawable resource, String model, Target target,
                                   boolean isFromMemoryCache, boolean isFirstResource) {
        Log.e("onResourceReady", "isFromMemoryCache:" + isFromMemoryCache + "  model:" + model
                + " isFirstResource: " + isFirstResource);
        return false;
    }
};

2. 绑定RequestListener

.listener(errorListener)

加载图片到通知

  • 先创建一个NotificationTarget对象,再load(NotificationTarget)即可实现目标。具体使用方法看NotificationTarget构造方法。

加载图片到应用小控件

  • 先创建一个AppWidgetTarget对象,再load(AppWidgetTarget)即可实现目标。具体使用方法看AppWidgetTarget构造方法。

缓存

简介

  • Glide 默认使用 内存缓存磁盘缓存 来避免不必要的网络请求。

缓存策略

  • 跳过 内存缓存skipMemoryCache(true)
  • 跳过 磁盘缓存diskCacheStrategy(/* 磁盘缓存策略 */)
    • DiskCacheStrategy.ALL:如果你请求一个 1000x1000像素 的图片,你的ImageView500x500像素Glide 会缓存两种尺寸的图片。
    • DiskCacheStrategy.NONE
    • DiskCacheStrategy.SOURCE:只缓存图片转换前的数据。
    • DiskCacheStrategy.RESULT:只缓存图片转换后的数据。如果你请求一个 1000x1000像素 的图片,你的ImageView500x500像素 ,则只缓存后者。

缓存失效【Todo】

官方教程

自定义Target

SimpleTarget

简介

  • SimpleTarget泛型 参数可以是BitmapDrawable
  • SimpleTarget不可用于自定义 View
  • 可以通过SimpleTarget获取BitmapDrawable对象,手动加载到需要的地方。
  • 不要把SimpleTarget对象定义为 匿名内部类 ,而是定义为 类属性 ,以避免被Android回收机制回收,从而永远不会进行回调。

1. 创建SimpleTarget

SimpleTarget target = new SimpleTarget(/* 长 */, /* 宽 */) {
    @Override
    public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
        // 获取到bitmap
        imageView1.setImageBitmap(bitmap);
    }
};

2. 绑定SimpleTarget

// noinspection unchecked
Glide
        .with(context)      // 如果是在Activity生命周期外请求的话,需要使用application context。
        .load(url)
        .asBitmap()         // 通过asBitmap(),避免当资源是视频等,会出现未知格式的情况。
        .into(target);

ViewTarget

简介

  • ViewTarget可用于自定义 View
  • ViewTargetSimpleTarget的区别是ViewTarget内部含有 View

1. 创建ViewTarget

ViewTarget viewTarget = new ViewTarget(customView) {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
        this.view.setImage(resource.getCurrent());
    }
};

2. 绑定ViewTarget

.into(target)

自定义BitmapTransformation

1. 定义BitmapTransformation

public class BlurTransformation extends BitmapTransformation {
    private RenderScript rs;

    public BlurTransformation(Context context) {
        super(context);
        rs = RenderScript.create(context);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        Bitmap blurredBitmap = toTransform.copy(Bitmap.Config.ARGB_8888, true);

        // 分配内存
        Allocation input = Allocation.createFromBitmap(
                rs,
                blurredBitmap,
                Allocation.MipmapControl.MIPMAP_FULL,
                Allocation.USAGE_SHARED
        );
        Allocation output = Allocation.createTyped(rs, input.getType());

        // Load up an instance of the specific script that we want to use.
        ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        script.setInput(input);

        // Set the blur radius
        script.setRadius(10);

        // Start the ScriptIntrinisicBlur
        script.forEach(output);

        // Copy the output to the blurred bitmap
        output.copyTo(blurredBitmap);

        toTransform.recycle();
        return blurredBitmap;
    }

    @Override
    public String getId() {
        return "blur";
    }
}

2. 应用变换

  • 方式一:
    .transform(new BlurTransformation(context))
    
  • 方式二:
    .bitmapTransform(new BlurTransformation(context))
    
  • 方式三(多重变换):
    .transform(new GreyscaleTransformation(context), new BlurTransformation(context))
    

Glide Modules

简介

  • 通过实现GlideModule接口并在 AndroidManifest.xml 中注册来实现。
  • 可以同时注册多个GlideModule类,不过要确保没有冲突。
  • 如果想要禁止GlideModule,只要从 AndroidManifest.xml 里移除它。

1. 定义GlideModules

GlideModules外壳

public class SimpleGlideModule implements GlideModule {
    @Override public void applyOptions(Context context, GlideBuilder builder) {
        // todo
    }

    @Override public void registerComponents(Context context, Glide glide) {
        // todo
    }
}

重写applyOptions()

1. 自定义内存缓存

MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();

int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);

builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));

2. 自定义磁盘缓存

int cacheSize100MegaBytes = 104857600;
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, cacheSize100MegaBytes));
// builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheSize100MegaBytes));
int cacheSize100MegaBytes = 104857600;
String downloadDirectoryPath = Environment.getDownloadCacheDirectory().getPath();
builder.setDiskCache(new DiskLruCacheFactory(downloadDirectoryPath, cacheSize100MegaBytes));
// 子目录
// builder.setDiskCache(new DiskLruCacheFactory(downloadDirectoryPath, "glidecache", cacheSize100MegaBytes));

3. 自定义图片质量

builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
// builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565);

4. 其他

  • GlideBuilder.setDiskCacheService():设置请求的资源在 磁盘缓存 里的时候需要执行的ExecutorService
  • GlideBuilder.setResizeService():设置请求的资源不在 磁盘缓存 里的时候需要执行的ExecutorService

重写registerComponents()

使用OkHttp实现从Https中加图片

工具类:OkHttpUrlLoader、OkHttpStreamFetcher

glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(httpsOkHttpClient));

2. 注册

AndroidManifest.xml 中:


    ...
    

Glide Transformations

简介

  • 官网:Glide Transformations
  • 例子:Glide Transformations
  • 可以对 Glide 加载的图片进行转换。

简单示例

单个转换

Glide.with(this).load(R.drawable.demo)
        .bitmapTransform(new BlurTransformation(context))
        .into((ImageView) findViewById(R.id.image));

多个转换

Glide.with(this).load(R.drawable.demo)
        .bitmapTransform(new BlurTransformation(context, 25), new CropCircleTransformation(context))
        .into((ImageView) findViewById(R.id.image));

Crop

  • CropTransformation
  • CropCircleTransformation
  • CropSquareTransformation
  • RoundedCornersTransformation

Color

  • ColorFilterTransformation
  • GrayscaleTransformation

Blur

  • BlurTransformation

Mask(掩模)

  • MaskTransformation

GPU Filter(滤镜)

  • ToonFilterTransformation
  • SepiaFilterTransformation
  • ContrastFilterTransformation
  • InvertFilterTransformation
  • PixelationFilterTransformation
  • SketchFilterTransformation
  • SwirlFilterTransformation
  • BrightnessFilterTransformation
  • KuwaharaFilterTransformation
  • VignetteFilterTransformation

你可能感兴趣的:(★40.Glide)