Android--Glide

简介

Glide是 Google 主导的图片加载开源库。它稳定、速度快、可自适应图片尺寸、支持众多格式、支持加载不同来源的图片、内存和磁盘缓存的优化等。
是一款主流的图片加载库即可,包含了你能想到的所有功能,并且支持扩展。Glide在Picasso基础上进行的二次开发,可以其优势显而易见。
(Volley、Picasso、Glide、Fresco)
Github地址




依赖和混淆规则

依赖

implementation 'com.github.bumptech.glide:glide:4.9.0'

混淆规则

##Glide
-dontwarn com.bumptech.glide.**
-keep class com.bumptech.glide.**{*;}
-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 *;
}




基础使用

基本方法

Glide的一个完整的请求至少需要三个参数

Glide.with(context)
    .load(url)
    .into(imageView);
  • with(Context context) :上下文,这里还可以使用 Activity、Fragment的对象。将 Activity/Fragment 对象作为参数的好处是,图片的加载会和 Activity/Fragment 的生命周期保持一致,例如:onPaused 时暂停加载,onResume 时又会自动重新加载。所以在传参的时候建议使用 Activity/Fragment 对象,而不是 Context。
  • load(String url) - 这里我们所使用的一个图片的 URL
  • into(ImageView imageView) - 需要显示图片的目标 ImageView


占位图设置

Glide.with(context)
    .load(url)
    .placeholder(R.drawable.place_image)//图片加载出来前,显示的图片
    .error(R.drawable.error_image)//图片加载失败后,显示的图片
    .fallback(R.drawable.fallback_image)//指定传递加载资源为 null 的时候,显示的图片
    .into(imageView);
  • placeholder :指定加载前显示的图片资源。
  • error:指定加载失败显示的图片资源。
  • fallback:指定传递加载资源为 null 的时候,显示的图片资源。
  • 注:这里需要注意一点,placeholder() 和 error() 的参数都是只支持 int 和 Drawable 类型的参数,这种设计应该是考虑到使用本地图片比网络图片更加合适做占位图。


裁剪缩放

在项目开发过程中,指定图片显示大小长长可能用到,毕竟从服务器获取的图片不一定都是符合设计图的标准的。我们在这里就可以使用 override(width,height) 方法,在图片显示到 ImageView 之前,重新改变图片大小。

Glide.with(context)
    .load(url)
    .override(width,height)//这里的单位是px
    .into(imageView);

ImageView 本身提供了 ScaleType 属性,这个属性可以控制图片显示时的方式。
Glide 也提供了两个类似的方法 CenterCrop() 和 FitCenter()。

  • CenterCrop() 方法是将图片按比例缩放到足矣填充 ImageView 的尺寸,但是图片可能会显示不完整;
  • FitCenter() 则是图片缩放到小于等于 ImageView 的尺寸,这样图片是显示完整了,但是 ImageView 就可能不会填满了。

注:其实 Glide 的 CenterCrop() 和 FitCenter() 这两个方法分别对应 ImageView 的 ScaleType 属性中的 CENTER_CROP 和 FIT_CENTER 命名基本一致。


缩略图

Glide 的缩略图功能在这里不得不说,和占位图略有不同,占位图必须使用资源文件才行,而缩略图是动态的占位图可以从网络中加载。缩略图会在世纪请求加载完成或者处理完之后才显示。在原始图片到达之后,缩略图不会取代原始图片,只会被抹除。

Glide 为缩略图提供了2种不同的加载方式,比较简单的方式是调用 thumbnail() 方法,参数是 float 类型,作为其倍数大小。例如,你传入 0.2f 作为参数,Glide 将会显示原始图片的20%的大小,如果原图是 1000x1000 的尺寸,那么缩略图将会是 200x200 的尺寸。为缩略图明显比原图小得多,所以我们需要确保 ImageView 的 ScaleType 设置的正确。

Glide.with( context )
    .load( url )
    .thumbnail( 0.2f )
    .into( imageView );

注:应用于请求的设置也将应用于缩略图。

使用 thumbnail() 方法来设置是简单粗暴的,但是如果缩略图需要通过网络加载相同的全尺寸图片,就不会很快的显示了。所以 Glide 提供了另一种防止去加载缩略图

private void loadImageThumbnailRequest(){
    // setup Glide request without the into() method
    DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( url );
    // pass the request as a a parameter to the thumbnail request
    Glide.with( context )
        .load( url )
        .thumbnail( thumbnailRequest )
        .into( imageView );
}

与第一种方式不同的是,这里的第一个缩略图请求是完全独立于第二个原始请求的。该缩略图可以是不同的资源图片,同时也可以对缩略图做不同的转换,等等…


载入动画

Glide 在显示图片的时候,为了让显示效果不那么突兀,会以一种更柔和的方式去显示,就会在加载的时候给一个动画效果,它可以使用 crossFade() 方法进行配置,如果不特殊处理,默认它是开启的,并且本身默认动画的时长是 300ms。
crossFade() 的效果是默认开启的,所以如果我们不需要这样的一个动画效果,可以使用 dontAnimate() 来禁用动画效果。

Glide.with(context)
	.load(url)
    .dontAnimate()
    .placeholder(R.drawable.place_image)
    .error(R.drawable.error_image)
    .into(imageView);

PS:Glide 是可以自定义动画效果的


缓存处理

为了更快的加载图片,肯定希望可以直接拿到图片,而不是进行网络请求,所以我们需要缓存。Glide 通过使用默认的内存和磁盘缓存来避免不必要的网络请求。

Glide.with(context)
	.load(url)
    .skipMemoryCache(false)
    .diskCacheStrategy( DiskCacheStrategy.NONE )
    .into(imageView);

内存缓存
默认开启的,.skipMemoryCache(false)可以关闭。

磁盘缓存
默认开启,.diskCacheStrategy( DiskCacheStrategy strategy )可以关闭。

DiskCacheStrategy 的枚举意义:

  • DiskCacheStrategy.NONE 什么都不缓存
  • DiskCacheStrategy.SOURCE 只缓存全尺寸图
  • DiskCacheStrategy.RESULT 只缓存最终的加载图
  • DiskCacheStrategy.ALL 缓存所有版本图(默认)


优先级

对于同一个页面,如果需要在多个地方都加载线上图片,必然会存在一个优先级的问题。例如:正常来说,背景图是比其他图片优先级更高的图片。
Glide 是可以在加载中,对当前加载的图片,调整加载的优先级的。需要使用.priority() 方法,它可以接受一个 Priority 的枚举类型,包含四种值:LOW(低)HIGH(高)NORMAL(普通)IMMEDIATE(立即)


支持 Gif & 视频

Glide 支持 Gif

Glide.with( context )
    .load( gifUrl )
    .asGif()
    .error( R.drawable.error )
    .into( imageView );
  • .asGif(): 校验它是否是一个 Gif ,如果不是,则认为是一次错误的加载。这个时候就可以使用 asGif() 来进行校验,如果当前加载的图片不是一个正确的 Gif 格式,则会去显示 error() 配置的图片。
  • 有时候可能只为显示一张图片,可以强制显示 Gif 图片的第一帧,用 asBitmap() 方法替代asGif()即可。

Glide 还能显示视频(只能显示手机本地的视频)。但它和 Gif 显示的效果不一样的一点在于,它不会去播放视频文件,而只是将视频文件的第一帧做为一个图片去显示出来。

String filePath = "/storrage/emulated/0/Pictures/video.mp4";
Glide.with( context )
    .load( Uri.fromFile( new File( filePath ) ) )
    .into( imageView );


加载监听

Glide 加载的图片的结果可以进行监听,使用 listener() 方法设置一个监听器,它接收一个 RequestListener 的接口

RequestListener requestListener = new RequestListener() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
                return false;
            }
        };
Glide.with(context)
	.load(url)
	.listener(requestListener)
	.into(imageView);
  • 如果需要监听图片加载错误的原因,可以在 onLoadFailed() 中做处理。
  • 需要注意的是,这两个方法的返回值,最好都是 false。因为如果返回 true ,将表示你已经处理了这次的事件,而 Glide 将不会再做额外的处理。例如,如果 onLoadFailed() 返回了 true 的话,在图片加载失败之后,error() 中设置的图片,并不会被显示,因为 Glide 认为开发者已经在外部对这个错误进行了处理。


变换加载的图片

对于使用 Glide 加载的图片,如果想要在其显示之前,对其进行一些变换操作,例如,改变颜色、虚化、圆角子类的,都需要用到 transfrom() 方法,它主要用于支持在图片显示之前,自定义的变换效果。
变换有两个方法

  • transfrom():它可以添加一个通用的变换效果。
  • bitmapTransfrom():限制了变换的类型,只能设置 Bitmap 的变换。

变换这种操作,其实定制性非常的强,展开讲就比较复杂了,大家只需要知道,Glide 是可以对加载的图片在显示之前进行一些预处理的操作的,在具体使用的时候再回头来看相关资料即可。
这里推荐一个开源的库,来支持大多数变换的效果。(Github 地址


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值