Glide图片缓存
Glide工程依赖
dependencies {
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
}
Glide使用需要Support Library v4依赖支持
Glide基本使用
imageGlide.with()不仅可以接受Context,还可以接受Activity和Fragment,Glide会从Activity和Fragment中获取Context,在使用时,尽可能的将Activity或Fragment传递给Glide(好处:图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载)
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
默认Bitmap格式是RGB_565
Clide默认使用Bitmap格式是RGB_565加载图片,比ARGB_8888格式的内存开销要小一半,但同时会带来图片显示质量下降,可以通过创建一个新的GlideModule将Bitmap格式转换到ARGB_8888,提升图片质量
-
自定义GlideModule
public class GlideConfiguration implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // Apply options to the builder here. builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override public void registerComponents(Context context, Glide glide) { // register ModelLoaders here. } }
-
在AndroidManifest.xml中将GlideModule定义为meta-data
<meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration" android:value="GlideModule"/>
磁盘缓存
Glide会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。具体说来就是:假如在第一个页面有一个200x200的ImageView,在第二个页面有一个100x100的ImageView,这两个ImageView本来是要显示同一张图片,却需要下载两次;可以通过改变Glide的行为让它即加载全尺寸图片,也加载不同尺寸图片
Glide.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivImgGlide);
下次在任何ImageView中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。
Clide常用属性
-
占位符使用
如果要使用Gilde显示一张网络上的图片,当网络不好的时候加载图片可能需要很长的时间,一个空的ImageViewzai 在任何UI上都不好看,这就有了占位符,在图片加载完成以前显示占位符。
Glide 的流式接口让这个变得非常容易的去做到!只需要调用 .placeHolder() 用一个 drawable(resource) 引用,Glide 将会显示它作为一个占位符,直到你的实际图片准备好。
Glide .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .placeholder(R.mipmap.ic_launcher) // can also be a drawable .into(imageViewPlaceholder);
-
load():Glide接受所有的值(可以是本地的资源也可以是网络上的资源)
-
错误占位符
可以从字面的意思来理解什么是错误的占位符,也就是我们的APP从一个网站去加载一张图片的时候,返回时告诉我们获取失败,这时就用到了错误占位符来显示图片,如果想进行一些其他操作,可自己决定。
调用 Glide 的流式接口和之前显示预加载占位符的例子是相同的,不同的是调用了名为 error() 的函数。
Glide .with(context) .load("http://futurestud.io/non_existing_image.png") .placeholder(R.mipmap.ic_launcher) //添加占位图片 .error(R.mipmap.future_studio_launcher) //添加获取网络图片失败占位图片 .into(imageViewError);
-
crossFade()通过该方法Glide会默认提供一个平滑(渐入渐出)动画用于加载图片,crossFade() 方法还有另外重载方法.crossFade(intduration)。如果你想要去减慢(或加快)动画,随时可以传一个毫秒的时间给这个方法。动画默认的持续时间是 300毫秒。
-
dontAnimate():显示图片而没有任何淡入淡出效果,在Glide的建造者中调用.dontAnimate()
-
override(horizontalSize, verticalSize):用override(horizontalSize, verticalSize)调整图片大小
-
图像缩放
现在,对于任何图像操作,调整大小真的能让长宽比失真并且丑化图像显示。在你大多数的使用场景中,你想要避免发生这种情况。Glide 提供了一般变化去处理图像显示。提供了两个标准选项:centerCrop 和 fitCenter
CenterCrop:CenterCrop()是一个裁剪技术,即缩放图像让它填充到 ImageView 界限内并且侧键额外的部分。ImageView 可能会完全填充,但图像可能不会完整显示.
Glide .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .override(600, 200) //调整图片大小 .centerCrop() //图片缩放 .into(imageViewResizeCenterCrop);
FitCenter:fitCenter() 是裁剪技术,即缩放图像让图像都测量出来等于或小于ImageView的边界范围。该图像将会完全显示,但可能不会填满整个ImageView。
Glide .with(context) .load(UsageExampleListViewAdapter.eatFoodyImages[0]) .override(600, 200) //调整图片大小 .fitCenter() //图片缩放 .into(imageViewResizeFitCenter);
总结:平时在使用的时候还是CenterCrop()的时候多一些,就像ImageView里面也会用到android: scaleType="centerCrop"
-
内存缓存
调用了.skipMemoryCache(true) 去明确告诉 Glide 跳过内存缓存,这意味着 Glide 将不会把这张图片放到内存缓存中去,这里需要明白的是,这只是会影响内存缓,Glide将会仍然利用磁盘缓存来避免重复的网络请求。
Glide .with( context ) .load( eatFoodyImages[0] ) .skipMemoryCache( true ) //设置禁止Glide将图片写到内存缓存中 .into( imageViewInternet );
-
跳过磁盘缓存
用.diskCacheStrategy()方法为Glide改变磁盘缓存的行为,不同的于.skipMemoryCache() 方法,它需要一个枚举而不是一个简答的布尔值,如果你想要为一个请求禁用磁盘缓存,使用枚举 DiskCacheStrategy.NONE
Glide .with( context ) .load( eatFoodyImages[0] ) .diskCacheStrategy( DiskCacheStrategy.NONE )//禁止磁盘缓存 .skipMemoryCache(true) //禁止内存缓存 .into( imageViewInternet );
-
图片请求的优先级
通常,你会遇到这样的使用场景:你的App将会需要在同一时间内加载多个图像。让我们假设你正在构建一个信息屏幕,这里有一张很大的英雄图片在顶部,还有两个小的,在底部还有一些不那么重要的图片。对于最好的用户体验来说,应用图片元素是显示要被加载和显示的,然后才是底部不紧急的 ImageView。Glide 可以用 Priority 枚举来支持你这样的行为,调用 .priority() 方法。
.priority() 方法的参数priority(优先级):
按照递增priority(优先级)的列表:
Priority.LOW Priority.NORMAL Priority.HIGH Priority.IMMEDIATE
注意:优先级并不是完全严格遵守的。Glide将会用他们作为一个准则,并尽可能的处理这些请求,但是它不能保证所有的图片都会按照所要求的顺序加载。
private void loadImageWithHighPriority() { Glide .with( context ) .load( UsageExampleListViewAdapter.eatFoodyImages[0] ) .priority( Priority.HIGH ) .into( imageViewHero ); } private void loadImagesWithLowPriority() { Glide .with( context ) .load( UsageExampleListViewAdapter.eatFoodyImages[1] ) .priority( Priority.LOW ) .into( imageViewLowPrioLeft ); Glide .with( context ) .load( UsageExampleListViewAdapter.eatFoodyImages[2] ) .priority( Priority.LOW ) .into( imageViewLowPrioRight ); }