Glide全面分析和使用(通俗易懂)

前言:由于本人今年小孩出生和公司各种原因,出现了一段迷茫期。但最近调整心态,回归初心。虽然这是个金钱至上的社会也要对的起自己。所以立几个flag。

1、坚持每天跑步,起床后和睡觉前的段落。

2、坚持学习,注重基础。不懂立马自我反馈

3、保持心态,虚心学习

好了废话不多说了。进入主题。

Glide全面分析和使用

glide简单使用,圆形图片,圆角图片,高斯模糊,黑白图片,加滤镜,监听glide加载图片进度等。

目前glide最新版本已经到4.9.0了,我们可以直接通过glide github地址,glide api文档 ,这里的很多api和之前的都不一样。有些坑人不习惯!

使用依赖:

repositories {
  mavenCentral()
  google()
}

dependencies {
  implementation 'com.github.bumptech.glide:glide:4.9.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}

 

1.1、简单使用

Glide.with(this).load(url).into(imageView);

注意参数1;参数1,可以传入Context,Activity,Fragment;文档的原话是:传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。(加入在fragment的列表页的适配器里,我建议传入fragment,让glide更好的工作)

 

  • 同时你还可以主动调用取消加载

Glide.with(this).clear(imageView);

 

  • 加载gif图
Glide.with(this).asGif().load(url).into(imageView);

 

  • 加载固定大小
//这里不是剪裁的意思,是根据你传入的最短边去取根绝原图片长宽比去压缩到指定尺寸,图片尺寸压缩
Glide.with(this).asBitmap().override(100,150).load(url).into(imageView);

 

  • 占位图,加载出错,加载动画
Glide.with(this).load(url)
         //占位图
        .placeholder(R.mipmap.ic_launcher)
         //错误占位图
        .error(R.mipmap.ic_launcher)
         //这里有点奇怪4.9的,不主动倒包。渐变加载动画,可以传参int durtion.默认300
        .transition(withCrossFade())
        //图片放在控件上的type
        .centerCrop()
        .into(imageView)

如果有图片变形建议不使用动画加上代码  .dontAnimate()

 

  • 取消图片缓存,比如有时候我们头像地址不变,但是你上传更新后缓存会是之前的头像,此时
Glide.with(this).load(url)
        .dontAnimate()
        //加上下2句取消缓存
        .skipMemoryCache(true)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .into(imageView)

 

  • 加载圆形图片,比如很多时候我们用到了圆角imageView。glide只有把图片变成圆形图片的功能
Glide.with(this).load(url)
        //加载圆角
        .circleCrop()
        .dontAnimate()
        .into(imageView)

 

1.2 glide搭配Glide Transformations库使用

github transformations库

使用

implementation 'jp.wasabeef:glide-transformations:4.0.1'

 

  • 使用 transformations加载高斯模糊图片
Glide.with(this)
        .load(url)
        // 设置高斯模糊,参数1:模糊程度(最大25)  参数2:缩放比例
        .transform(new BlurTransformation(25,2))
        .into(imageView)

 

  • 同时加载圆角,且高斯模糊图片
Glide.with(this)
        .load(url)
        .transform(new BlurTransformation(25,2),new CircleCrop())
        .into(imageView)

 

  •  把图片变成黑白图片(类似加滤镜,同理我们后面会结束真正加滤镜)
Glide.with(this)
        .load(url)
        .transform(new GrayscaleTransformation())
        .into(imageView)

 

  • 圆角图片 (带圆角的图片,不是圆形图片)
Glide.with(this)
        .load(url)
        .transform(new RoundedCorners(30))
        .into(imageView);

 //重点

如果是同一大小的imageView控件使用上面代码,圆角可能不同,因为有可能加载的原图片大小不一样。

所以此时常常会加上centerCrop使用,这样才能保证圆角大小一样

Glide.with(this)
        .load(url)
        .transform(new CenterCrop(),new RoundedCorners(30))
        .into(imageView);

 

1.3 glide搭配gpuImage使用,可以加滤镜效果

gpuImage 滤镜github地址

使用

implementation 'jp.co.cyberagent.android:gpuimage:2.0.3'

 

  • 加滤镜效果 
Glide.with(this)
        .load(urlsmall)
        .transform(new GPUFilterTransformation(new GPUImageSoftLightBlendFilter()))
        .into(imageView_test);

同时也可以这样使用,充满图片,加图片圆角,再加上滤镜效果

Glide.with(this)
        .load(urlsmall)
        .transform(new CenterCrop(),new RoundedCorners(30),new GPUFilterTransformation(new GPUImageSoftLightBlendFilter()))
        .into(imageView_test);

 

  • 利用glide这个效果我们就可以简单实现图片加滤镜效果,且可保持本地或者上传服务端功能。bitmap保存file文件 
Glide.with(this)
        .asBitmap()
        .load(urlsmall)
        .transform(new CenterCrop(), new RoundedCorners(30), new GPUFilterTransformation(new         
         GPUImageSoftLightBlendFilter()))
        .into(new CustomTarget() {
            @Override
            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition    
            transition) {
               
               //这里可实现保存resource成file文件后,可上传服务端,也可调用刷新,放进手机相册页
            }

            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {

            }
        });

 

2.1、AppGlideModule

在glide4.0后用的是AppGlideModule来自定义缓存。在3.0的时候还是用的GlideModule。想了解3.0的可以去我的github上看,其中也包括了监听图片加载进度 github包含glideModule及图片加载进度监听;但今天我们重点讲的是4.9.0的:

官网有句原话是:Glide 允许应用通过 AppGlideModule 实现来完全控制 Glide 的内存和磁盘缓存使用。Glide 试图提供对大部分应用程序合理的默认选项,但对于部分应用,可能就需要定制这些值。在你做任何改变时,请注意测量其结果,避免出现性能的倒退。(看到这句话,不是定制性的,我觉得用glide默认的即可)

官网配置讲解

官网缓存讲解

下面是我自己的理解(3.0需要再清单文件里注册,4.0后只需要注解@GlideModule):

@GlideModule
public class MyAppGlideModule extends AppGlideModule {

    int diskSize = 1024 * 1024 * 100;
    int memorySize = 1024 * 1024 * 20;
    int bitmapSize = 1024 * 1024 * 30;

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        super.applyOptions(context, builder);
        //内存缓存
        builder.setMemoryCache(new LruResourceCache(memorySize));
        //bitmap池 缓存
        builder.setBitmapPool(new LruBitmapPool(bitmapSize));
        /**
         * 磁盘缓存
         * */
        //磁盘缓存在 外部缓存
        builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, "/sdcard/LeoZan/",    diskSize)); //sd卡中
        //内存缓存
        builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskSize));  //内存中

    }

  
}

 

做完上一步后,你加载图片需要用你自己定义的这个api:GlideApp,如果找不到GlideApp,请先运行下app再使用

GlideApp.with(MainActivity.this)
        .load(url)
        .into(imageView_two);

 

加下来看一张gif :

Glide全面分析和使用(通俗易懂)_第1张图片

 

经过测试。个人感觉GlideApp.get(MainActivity.this).clearMemory();有点疑惑;

官网的话是这么说的:清理所有内存并非特别经济,并且应该尽可能避免,以避免出现抖动和增加加载时间。

经过测试,获得的缓存,利用 GlideApp.get(MainActivity.this).clearDiskCache();清理磁盘缓存即可完成。再或许是设置缓存模式,磁盘和内存都缓存了才能利用到;如有比较理解的,或许有实践demo的大佬,希望给我借鉴借鉴。谢谢

 

再来看看监听图片加载的图片:

Glide全面分析和使用(通俗易懂)_第2张图片

 

最后放个demo感觉更来的直接!!   

csdn下载

你可能感兴趣的:(开源库的使用分析)