一 Glide用法及介绍
1.1 什么是Glide?
Glide是一个加载图片的库,作者是bumptech,它是在泰国举行的google 开发者论坛上google为我们介绍的,这个库被广泛的运用在google的开源项目中。
1.2 Glide解决什么问题?
Glide是一个非常成熟的图片加载库,他可以从多个源加载图片,如:网路,本地,Uri等,更重要的是他内部封装了非常好的缓存机制并且在处理图片的时候能保持一个低的内存消耗。
1. 3 Glide的优缺点?
1.3.1 优点
Glide 不仅是一个图片缓存,它支持 Gif、WebP、缩略图。甚至是 Video
通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让
加载图片的请求的生命周期动态管理起来
A. 支持Memory和Disk图片缓存
B. Picasso 只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide 会根据你
ImageView 的大小来缓存相应大小的图片尺寸
比如你 ImageView 大小是200200,原图是 400400 ,而使用 Glide 就会缓存 200200 规格的图,
而 Picasso 只会缓存 400400 规格的。这个改进就会导致 Glide 比 Picasso 加载的速度要快,毕竟少了
每次裁剪重新渲染的过程,非常灵活 & 加载速度快
C. **内存开销小
默认的 Bitmap 格式是 RGB_565 格式,而 Picasso 默认的是 ARGB_8888 格式,这个内存开销要小一
半。
Android关于图片内存计算,共有四种,分别是:
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存(默认,色彩最细腻=显示质量最高=占用的内存也最大)
RGB_565:每个像素占用2byte内存(8bit = 1byte)
举例说明:一个32位的PNG=ARGB_8888=1204x1024,那么占用空间是:1024x1024x(32/8) =
4,194,304kb=4M左右
在解析图片的时候,为了避免oom和节省内存,最好使用ARGB_4444模式(节省一半的内存空间)
1.3.2缺点
- 使用方法复杂
Glide功能强大,但代码量大、流转复杂。在较深掌握的情况下才推荐使用,免得出了问题难以下手解决。
1.4 Glide与其他第三方库的比较
1.5 Glide用法
1.5.1首先添加依赖
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
1.5.2 Glide的一个完整的请求至少需要三个参数
代码如下:
ImageView imageView = findViewById(R.id.imageView);
Glide.with(context)
.load(url)
.into(imageView);
with(Context context) - 需要上下文,这里还可以使用 Activity、FragmentActivity、
android.support.v4.app.Fragment、android.app.Fragment 的对象。将 Activity/Fragment 对象作为
参数的好处是,图片的加载会和 Activity/Fragment 的生命周期保持一致,例如:onPaused 时暂停加
载,onResume 时又会自动重新加载。所以在传参的时候建议使用 Activity/Fragment 对象,而不是
Context.
? load(String url) - 这里我们所使用的一个字符串形式的网络图片的 URL,后面会讲解 load() 的更多使用方式.
? .into(imageView);into(ImageView imageView) - 你需要显示图片的目标 ImageView.
- 加载网络图片
Glide.with(context).load(internetUrl).into(targetImageView);
- 从文件加载图片
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);
- 从资源id加载图片
int resourceId = R.mipmap.ic_launcher;
Glide.with(context).load(resourceId).into(imageViewResource);
- 从uri加载图片
Glide.with(context).load(uri).into(imageViewUri);
- 播放本地mp4,只能是本地(获取MP4视频的缩略图)
String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
Glide.with(context).load(Uri.fromFile(new File(filePath))).into(imageViewGifAsBitmap);
- 加载Gif图片
String gifUrl = "xxxxx";
Glide.with(context).load(gifUrl).into(imageViewGif);
- 用bitMap播放Gif.asBitmap()
Glide.with(context).load(gifUrl).asBitmap().into(imageViewGifAsBitmap);
- 强制转化为Gif.asGif()
Glide.with(context).load(gifUrl).asGif().error(R.drawable.full_cake).into(imageViewGif);
1.5.3 占位图设置
偶尔出现图片加载慢或者加载不出来的情况是难以避免的,所以为了 UI 能好看一些,我们会使用占
位图。Glide 也为我们提供这种方法 placeHolder() 和 error()
ImageView imageView = (ImageView) findViewById(R.id.imageView);
Glide.with(context)
.load(url)
.placeholder(R.drawable.place_image)图片加载出来前,显示的图片
.error(R.drawable.error_image)
.into(imageView);
**这里需要注意一点,placeholder() 和 error() 的参数都是只支持 int 和 Drawable 类型的参数,这种设计应该是考虑到使用本地图片比网络图片更加合适做占位图。
1.5.4 缩略图
Glide.with(context)
.load(url)
.thumbnail(0.2f)
.into(imageView);
调用 thumbnail() 方法,参数是 float 类型,作为其倍数大小。例如,你传入 0.2f 作为参数,Glide 将会显示原始图片的20%的大小,使用 thumbnail() 方法来设置是简单粗暴的,但是如果缩略图需要通过网络加载相同的全尺寸图片,就不会很快的显示了。所以 Glide 提供了另一种防止去加载缩略图,先看
代码
private void loadImageThumbnailRequest(){
DrawableRequestBuilder<String> thumbnailRequest = Glide.with( context ).load( url );
Glide.with( context )
.load( url )
.thumbnail( thumbnailRequest )
.into( imageView );
}
与第一种方式不同的是,这里的第一个缩略图请求是完全独立于第二个原始请求的。该缩略图可以是不同的资源图片,同时也可以对缩略图做不同的转换,等等…
1.5.5 动画开关
动画效果可以让图片加载变得更加的平滑,crossFade() 方法强制开启 Glide 默认的图片淡出淡入动画,当前版本3.7.0是默认开启的。crossFade() 还有一个重载方法 crossFade(int duration)。可以控制动画的持续时间,单位ms。动画默认的持续时间是300ms。既然可以添加动画,那肯定就可以设置没有任何淡出淡入效果,调用 dontAnimate()
Glide.with(context)
.load(url)
.crossFade()
.placeholder(R.drawable.place_image)
.error(R.drawable.error_image)
.into(imageView);
1.5.6 图片大小与裁剪
在项目开发过程中,指定图片显示大小长长可能用到,毕竟从服务器获取的图片不一定都是符合设计 图的标准的。我们在这里就可以使用 override(width,height) 方法,在图片显示到 ImageView 之前, 重新改变图片大小。
Glide.with(context)
.load(url)
.override(width,height)
.into(imageView);
在设置图片到 ImageView 的时候,为了避免图片被挤压失真,ImageView 本身提供了 ScaleType 属性,这个属性可以控制图片显示时的方式,具体的属性使用还是去搜索吧!Glide 也提供了两个类似的方法 CenterCrop() 和 FitCenter(),CenterCrop() 方法是将图片按比例缩放到足矣填充 ImageView 的尺寸,但是图片可能会显示不完整;而 FitCenter() 则是图片缩放到小于等于 ImageView 的尺寸,这样图片是显示完整了,但是 ImageView 就可能不会填满了。
1.5.7 图片的缓存处理
为了更快的加载图片,我们肯定希望可以直接拿到图片,而不是进行网络请求,所以我们需要缓存。Glide 通过使用默认的内存和磁盘缓存来避免不必要的网络请求,之后我们再详细的去看它的实现
- 1.内存缓存
内存缓存是 Glide 默认帮我们做了的,除非你不需要,可以调用 skipMemoryCache(true) 告诉 Glide跳过内存缓存。这样 Glide 就不会把这张图片放到内存缓存中,该方法只影响内存缓存。(不要问调用skipMemoryCache(false)的问题,Glide 是默认将图片放入内存缓存中的) - 2.磁盘缓存
磁盘缓存也是默认开启的,当然也是可以关闭的,不过关闭的方式略微有点不一样。 Glide.with(context) .load(url) .skipMemoryCache(true) .diskCacheStrategy( DiskCacheStrategy.NONE ) .into(imageView); - 3.自定义磁盘缓存行为
使用 DiskCacheStrategy 可以为 Glide 配置磁盘缓存行为。Glide 的磁盘缓存比较复杂,这也是在图片加载可以比 Picasso 的原因(之一)。Picasso 只缓存了全尺寸的图片,而 Glide 的不同之处在于,Glide 不仅缓存了全尺寸的图,还会根据 ImageView 大小所生成的图也会缓存起来。比如,请求一个 800x600 的图加载到一个 400x300 的 ImageView 中,Glide默认会将这原图还有加载到 ImageView 中的 400x300 的图也会缓存起来。
DiskCacheStrategy 的枚举意义:
DiskCacheStrategy.NONE 什么都不缓存
DiskCacheStrategy.SOURCE 只缓存全尺寸图
DiskCacheStrategy.RESULT 只缓存最终的加载图
DiskCacheStrategy.ALL 缓存所有版本图(默认行为)
Glide.with(context)
.load(url)
.diskCacheStrategy( DiskCacheStrategy.SOURCE )
.into(imageView);
1.5.8 图片优先级
同一时间加载多个图片,App 将难以避免这种情况。如果这个时候我们希望用户的体验更好,往往会 选择先加载对于用户更加重要的图片。Glide 可以调用 .priority() 方法配合 Priority 枚举来设置图片加 载的优先级。
Glide.with( context )
.load( highPriorityImageUrl )
.priority (Priority.HIGH )
.into( imageView );
Glide.with( context )
.load( lowPriorityImageUrl )
.priority( Priority.LOW )
.into( imageView );
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIAT
这里有一点需要注意,优先级并不是完全严格遵守的。Glide 将会用他们作为一个准则,尽可能的处理这 些请求,但是不能保证所有的图片都会按照所有要求的顺序加载。
1.5.9 显示 Gif 和 Video
显示 GIf 对于 Glide 来说一个比较特别的功能(至少 Picasso 暂时还不行)而且使用起来非常简单
Glide.with( context )
.load( gifUrl )
.placeholder( R.drawable.default )
.error( R.drawable.error )
.into( imageView );
这段代码还有点问题,如果加载的不是一张 gif 图的话,是没有办法显示的。
Glide.with( context )
.load( gifUrl )
.asGif()
.error( R.drawable.error )
.into( imageView );
做以上修改,如果图片类型不是 Gif 图的话就会当作 load 失败来处理,因此 error() 会被回调。即使这个url的图片是好的,也是不会显示的。当然,如果你想显示 Gif 但只是向现实静态的图片你就可以这么做
Glide.with( context )
.load( gifUrl )
.asBitmap()
.error( R.drawable.error )
.into( imageView );
仅仅是显示 Gif 的第一帧图像,这样就可以保证图片的正常显示了。
还有一个神奇的功能,Glide 还能显示视频!But…只能够显示手机本地的视频,要是向现实网络上的视频的话,还是另寻他法吧!
Glide.with( context )
.load( Uri.fromFile( new File( filePath ) ) )
.into( imageView );
|