Glide V4使用笔记

一、前言

Glide分为V3.版本和V4.版本,在V3.版本中,选项由一系列复杂的异构建造者(multityped builders)单独处理。比如BitmapRequestBuilder、DrawableRequestBuilder、GifRequestBuilder等。但是在Gilde V4中,由一个单一类型的唯一一个建造者接管一系列选项对象,即RequesetBuilder。本博客主要介绍Glide V4*版本的使用规则和技巧。

二、配置和简单的使用

2.1 配置
在app目录下的build.gradle中添加依赖

compile 'com.github.bumptech.glide:glide:4.3.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.3.0'
compile 'com.android.support:support-v4:26.1.0' //glide需要support库的支持

如果使用了proguard混淆,需要添加混淆规则:

-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 *;
    }

权限声明

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.2 基本使用
将图片资源加载进ImageView控件中去

Glide.with(context) //with()方法可以接收Context、Activity或者Fragment类型参数
    .load(myUrl)    //load方法中不仅可以传入图片的url地址,还可以传入图片文件File,resource,图片的byte数组等
    .into(imageView);

三、高级使用

3.1 RequestOptions
通过RequestOptions类和apply()方法完成Glide选项的设置,可以通过RequestOptions设置的选项大致可以包括如下:
1.占位符(placeholders)
请求过程中显示,请求完成后再被替换成为请求到的资源。如果请求的资源是内存中的,placeholder可能就不会被显示。如果请求失败且error Drawable没有设置,placeholder将继续被显示。如果请求的url/model为空且error Drawable和fallback Drawable都没设置,placeholder将继续被显示。
2.error
请求失败时显示error Drawable,当请求的url/model为空且fallback Drawable没设置时显示error Drawable
3.fallback
当请求的url/model为空时显示fallback Drawable。fallback Drawable主要目的是允许用户表明“空”是否被允许,因为Glide默认把空的url/model当做error处理。一个典型的场景就是未设置头像用户的avatar字段可能是null,而显示的时候我们需要显示一个默认的用户头像,此时设置fallback是个很好地选择。
4.skipMemoryCache
是否禁用内存缓存功能
5.diskCacheStrategy
缓存策略设置,DiskCacheStrategy.NONE表示不缓存任何内容;DiskCacheStrategy.DATA表示只缓存原始图片;DiskCacheStrategy.RESOURCE表示只缓存转换过后的图片;DiskCacheStrategy.ALL表示即缓存原始图片,也缓存转换过后的图片;DiskCacheStrategy.AUTOMATIC表示让Glide根据图片资源智能选择使用一种缓存策略。
6.transform
将图像变换,比如将图片裁剪成圆形图片,圆角图片,变换成高斯模糊或黑白等。在V4中提供的Transformation有圆角和圆形图片,如果需要实现其它变换,还需要实现自定义的Transformation。

3.2 Transition(动画)和TransitionOptions
TransitionOptions决定图片加载完成之后如何从占位符图片(或者之前的图片)过渡。过渡效果有淡入、交叉淡入和不过渡,参考如下:

Glide.with(fragment)
    .load(url)
    .transition(DrawableTransitionOptions.withCrossFade())
    .into(view);

注意
TransitionOptions是和想要加载的资源类型绑定的,也就是说,如果请求一张位图(Bitmap),就需要使用BitmapTransition,而不是DrawableTransitionOptions。因此,请求的这张位图,需要使用简单的淡入,而不能用交叉淡入(DrawableTransitionOptions.withCrossFade)。如果既不是Bitmap也不是Drawable可以使用GenericTransitions。

3.3 RequestBuilder
每次调用Glide.with()都会得到一个RequestBuilder,而RequestBuilder就是Glide请求的主干,负责将options和请求的url/model结合起来并开始新的加载。

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment);

RequestBuilder的作用有:

1.指定加载类型。asBitmap()、asGif()、asDrawable()、asFile()。
2.指定要加载的url/model。
3.指定要加载到那个view。
4.指定要应用的RequestOption
5.指定要应用的TransitionOption
6.指定要加载的缩略图

RequestBuilder应用RequestOptions和transitionOptions

RequestBuilder<Drawable> requestBuilder = Glide.with(fragment);
requestBuilder.apply(requestOptions);
requestBuilder.transition(transitionOptions);

RequestBuilder也可重复使用:

RequestBuilder<Drawable> requestBuilder =
        Glide.with(fragment)
            .asDrawable()
            .apply(requestOptions);

for (int i = 0; i < numViews; i++) {
   ImageView view = viewGroup.getChildAt(i);
   String url = urls.get(i);
   requestBuilder.load(url).into(view);
}

3.4 Transformation
Glide的图形变换,当使用Glide为ImageView加载图片时,Glide会根据ImageView的ScaleType自动应用相应的变换,如果scale type是CENTER_CROP,Glide将自动应用CentreCrop transformation, 如果scale type是FIT_CENTER或CENTER_INSIDE,glide将自动应用FitCenter transformation。Glide内置的transformation包括如下:

1.CenterCrop缩放宽和高都达到View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能超过边界。
2.CenterInside如果宽和高都在View的边界内,那就不缩放,否则缩放宽和高都进入View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能在边界内。
3.CircleCrop圆形且结合了CenterCrop的特性
4.FitCenter缩放宽和高都进入View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能在边界内。
5.RoundedCorners圆角。

Transformations的应用场景:
1.应用RequestOptions

RequestOptions requestOptions = new RequestOptions()
        .fitCenter();
Glide.with(fragment)
        .load(url)
        .apply(requestOptions)
        .into(imageView);

2.使用RequestOptions中的transform方法

import static com.bumptech.glide.request.RequestOptions.fitCenterTransform;
Glide.with(fragment)
    .load(url)
    .apply(fitCenterTransform())
    .into(imageView);

3.V4特性,使用GlideApp,GlideApp需要配置生成。

GlideApp.with(fragment)
  .load(url)
  .fitCenter()
  .into(imageView);

GlideApp.with(fragment)
  .load(url)
  .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
  .into(imageView);

GlideApp.with(fragment)
  .load(url)
  .transforms(new FitCenter(), new YourCustomTransformation())
  .into(imageView);

4.多个变换

Glide.with(fragment)
  .load(url)
  .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation())
  .into(imageView);

3.5 配置内存缓存
Glide会自动分配内存和缓存,但是也可以选择在代码中自定义分配。
通过MemeorySizeCalculater设置

//方法一
@GlideModule
public class CustomGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
                .setMemoryCacheScreens(2) //缓存多少屏图像,默认是2
                .build();
        builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
    }
}
//方法二
@GlideModule
public class CustomGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb
        builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
    }
}
//方法三
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setMemoryCache(new CustomGlideMemoryCache());
  }
}

在主线程中清理内存缓存

GlideApp.get(context).clearMemory();

3.6 配置磁盘缓存
Glide使用DiskLurCacheWrapper作为默认的磁盘缓存,默认大小是250M,缓存文件放在APP的缓存文件夹下。

//在用法上可以指定内部存储或外部存储,也可以指定缓存文件大小和文件夹
@GlideModule
public class CustomGlideModule extends AppGlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
//        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes));
//        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
    }
}

自定义磁盘缓存

@GlideModule
public class CustomGlideModule extends AppGlideModule {
  @Override
  public void applyOptions(Context context, GlideBuilder builder) {
    builder.setDiskCache(new DiskCache.Factory() {
        @Override
        public DiskCache build() {
          return new YourAppCustomDiskCache();
        }
    });
  }
}

清理磁盘缓存,在子线程中调用

GlideApp.get(context).clearDiskCache();

加载图片时设置磁盘缓存策略

GlideApp.with(getActivity())
         .load(url)
         .diskCacheStrategy(DiskCacheStrategy.ALL) //默认的策略是DiskCacheStrategy.AUTOMATIC 
         .dontAnimate()
         .centerCrop()
         .into(imageView);

转载参考

官方文档
Glide v4详解
Glide最新版V4使用指南
Google推荐——Glide使用详解
GLide加载图片还能这样干——基于Glide4.0完美封装

猜你喜欢

转载自blog.csdn.net/polo2044/article/details/82147589
今日推荐