前言:由于本人今年小孩出生和公司各种原因,出现了一段迷茫期。但最近调整心态,回归初心。虽然这是个金钱至上的社会也要对的起自己。所以立几个flag。
1、坚持每天跑步,起床后和睡觉前的段落。
2、坚持学习,注重基础。不懂立马自我反馈
3、保持心态,虚心学习
好了废话不多说了。进入主题。
目前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' }
Glide.with(this).load(url).into(imageView);
注意参数1;参数1,可以传入Context,Activity,Fragment;文档的原话是:传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。(加入在fragment的列表页的适配器里,我建议传入fragment,让glide更好的工作)
Glide.with(this).clear(imageView);
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)
Glide.with(this).load(url) //加载圆角 .circleCrop() .dontAnimate() .into(imageView)
github transformations库
使用
implementation 'jp.wasabeef:glide-transformations:4.0.1'
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);
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.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 super Bitmap> transition) { //这里可实现保存resource成file文件后,可上传服务端,也可调用刷新,放进手机相册页 } @Override public void onLoadCleared(@Nullable Drawable placeholder) { } });
在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 :
经过测试。个人感觉GlideApp.get(MainActivity.this).clearMemory();有点疑惑;
官网的话是这么说的:清理所有内存并非特别经济,并且应该尽可能避免,以避免出现抖动和增加加载时间。
经过测试,获得的缓存,利用 GlideApp.get(MainActivity.this).clearDiskCache();清理磁盘缓存即可完成。再或许是设置缓存模式,磁盘和内存都缓存了才能利用到;如有比较理解的,或许有实践demo的大佬,希望给我借鉴借鉴。谢谢
再来看看监听图片加载的图片:
最后放个demo感觉更来的直接!!