Glide 常见用法

用法

  1. 基本用法
Glide.with(fragment)
    .load(url)
    .into(imageView);

Glide.with(fragment).clear(imageView);
  1. 模块的定义
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(fragment)
   .load(myUrl)
   .placeholder(placeholder)
   .fitCenter()
   .into(imageView);
  1. RecyclerView 中的使用
    Glide 已经处理了 View 的复用并且会自动取消请求
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    String url = urls.get(position);
    Glide.with(fragment)
        .load(url)
        .into(holder.imageView);
}
  1. 非View
Glide.with(context
  .load(url)
  .into(new CustomTarget<Drawable>() {
    @Override
    public void onResourceReady(Drawable resource, Transition<Drawable> transition) {
      // Do something with the Drawable here.
    }

    @Override
    public void onLoadCleared(@Nullable Drawable placeholder) {
      // Remove the Drawable provided in onResourceReady from any Views and ensure 
      // no references to it remain.
    }
  });
  1. 后台线程使用 submit
FutureTarget<Bitmap> futureTarget =
  Glide.with(context)
    .asBitmap()
    .load(url)
    .submit(width, height);

Bitmap bitmap = futureTarget.get();
...
Glide.with(context).clear(futureTarget);

同样也可以在后台线程启动异步加载,哪怕你后台线程根本不需要 Bitmap 或 Drawable

Glide.with(context)
  .asBitmap()
  .load(url)
  .into(new Target<Bitmap>() {
    ...
  });
  1. 占位符
    Glide允许用户指定三种不同类型的占位符,分别在三种不同场景使用
  • placeholder
    占位符是当请求正在执行时被展示的 Drawable 。当请求成功完成时,占位符会被请求到的资源替换。
  • error
    error Drawable 在请求永久性失败时展示
  • fallback
    fallback Drawable 在请求的url/model为 null 时展示。
GlideApp.with(fragment)
  .load(url)
  .placeholder(R.drawable.placeholder) // error(R.drawable.error) | fallback(new ColorDrawable(Color.GREY))
  .into(view);
  1. Options
  • RequestBuilder
    RequestBuilder 通过 Glide.with() 返回,可以应用 placeHolder、Transformations、cacheStrategies、Component options
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).asDrawable();

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment).load(url);
  • RequestOptions
RequestOptions cropOptions = new RequestOptions().centerCrop(context);
...
Glide.with(fragment)
    .load(url)
    .apply(cropOptions)
    .into(imageView);

这里主要说明的是 apply() 方法,它可以被调用很多次,如果调用中会有重复的,以最后一次为准

  • TransitionOptions
    它主要是应用在请求加载完成以后,我们可以用它渐入、从placeholder渐入、无
Glide.with(fragment)
    .load(url)
    .transition(withCrossFade())
    .into(view);
  • Thumbnail Request
    用来加载缩略图
Glide.with(fragment)
  .load(url)
  .thumbnail(Glide.with(fragment) // thumbnail(/*sizeMultiplier=*/ 0.25f) 原图的百分比
    .load(thumbnailUrl))
  .into(imageView);
  • Component Options
    主要是用来设置组件,如 ModelLoaders, ResourceDecoders, ResourceEncoders, Encoders
Glide.with(context)
  .load(url)
  .apply(option(MyCustomModelLoader.TIMEOUT_MS, 1000L))
  .into(imageView);

RequestOptions options = new RequestOptions()
  .set(MyCustomModelLoader.TIMEOUT_MS, 1000L);
Glide.with(context)
  .load(url)
  .apply(options)
  .into(imageView);
  1. 变换
    是获取资源并修改它,然后返回被修改后的资源。通常变换操作是用来完成剪裁或过滤,也可以用于转换GIF动画,甚至自定义的资源类型。
  • 内置变换 CenterCrop, FitCenter, CircleCrop
RequestOptions options = new RequestOptions();
options.centerCrop();

Glide.with(fragment)
    .load(url)
    .apply(options)
    .into(imageView);
  • 多重变换
Glide.with(fragment)
  .load(url)
  .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
  .into(imageView);
  • 自定义变换
    主要是是继承 BitmapTransformation,然后重写 transform方法,以及 equals(), hashCode(),
    updateDiskCacheKey()
  1. Target
Target<Drawable> target = 
  Glide.with(fragment)
    .load(url)
    .into(new Target<Drawable>() {
      ...
    });
... 
// Some time in the future:
Glide.with(fragment)
  .load(newUrl)
  .into(target);
  1. 过渡
    在 Glide 中,图像可能从四个地方中的任何一个位置加载出来:
    1. Glide 的内存缓存
    2. Glide 的磁盘缓存
    3. 设备本地可用的一个源文件或 Uri
    4. 仅远程可用的一个源 Url 或 Uri
  2. 配置
  • 添加组件
    • 添加 AppGlideModule
    • (可选)添加 LibraryGlideModule 一个或多个
    • module 都需要加上 @GlideModule 注解
    • 添加 gradle 依赖
    • 在 proguard 中,添加对 AppGlideModule的 keep
  • 缓存
// 内存缓存
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
        .setMemoryCacheScreens(2)
        .build();
    builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
  }
}
// Bitmap池
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
        .setBitmapPoolScreens(3)
        .build();
    builder.setBitmapPool(new LruBitmapPool(calculator.getBitmapPoolSize()));
  }
}
// 磁盘缓存
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
  }
}
  • 默认选项
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setDefaultRequestOptions(
        new RequestOptions()
          .format(DecodeFormat.RGB_565)
          .disallowHardwareBitmaps());
    // 在加载图片时假如发生了一个异常 (例如, OOM), 
    //Glide 将会使用一个 GlideExecutor.UncaughtThrowableStrategy
    final UncaughtThrowableStrategy myUncaughtThrowableStrategy = new ...
    builder.setDiskCacheExecutor(newDiskCacheExecutor(myUncaughtThrowableStrategy));
    builder.setResizeExecutor(newSourceExecutor(myUncaughtThrowableStrategy));
  }
}

一旦创建了新的请求,这些选项将通过 GlideBuilder 中的 setDefaultRequestOptions 被应用上。因此,任何单独请求里应用的选项将覆盖 GlideBuilder 里设置的冲突选项。

  • 缓存
GlideApp.with(fragment)
  .load(url)
  .diskCacheStrategy(DiskCacheStrategy.ALL) // 本地和远程
  // .onlyRetrieveFromCache(true) 仅从缓存加载图片
  // .skipMemoryCache(true) 跳过缓存
  // .signature(new ObjectKey(yourVersionMetadata)) 定制签名用于定制缓存
  .into(imageView);
  • 资源重用
    每次调用 into() 来加载一个资源,这个资源的引用计数会被加一。如果相同的资源被加载到两个不同的 Target,则在两个加载都完成后,它的引用计数将会为二。我们可以通过 clear() 和请求新的资源来减少计数。当计数为0 时,资源会被释放给 Glide以重用。
    也可以用我们在 配置中提到的 BitmapPool

转载于:https://www.jianshu.com/p/8a993d66dcb2

猜你喜欢

转载自blog.csdn.net/weixin_34218579/article/details/91067729