美文网首页
Glide 常见用法

Glide 常见用法

作者: 莫库施勒 | 来源:发表于2019-06-05 16:53 被阅读0次

    用法

    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

    相关文章

      网友评论

          本文标题:Glide 常见用法

          本文链接:https://www.haomeiwen.com/subject/yessxctx.html