Glide图片缓存

作者: heyzhuyue | 来源:发表于2017-05-11 15:45 被阅读107次

    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基本使用

    image

    Glide.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 );
        }
      

    原文链接

    http://blog.csdn.net/hshshshshs1/article/details/50786203

    相关文章

      网友评论

        本文标题:Glide图片缓存

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