Glide的基本使用
说到现下Android开发中热门的第三方框架,就会谈到图片加载框架Glide这个框架,在大部分的APP开发中都会有Glide的影子,为什么Glide被广泛使用呢?Glide官方文档是这样描述的:
Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。
Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。Glide的Api是如此的灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。
虽然Glide 的主要目标是让任何形式的图片列表的滚动尽可能地变得更快、更平滑,但实际上,Glide几乎能满足你对远程图片的拉取/缩放/显示的一切需求。
那么Glide在我们开发中究竟是怎么样使用的呢?
1、使用要求
Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 或更高。
Compile Sdk Version - Glide 必须使用 API 27或更高版本的 SDK 来编译。
Support Library Version - Glide 使用的支持库版本为 27。
2、Glide库的引入
Android studio中Gradle配置:
在root的build.gradle中增加下面配置,从maven仓库中引入:
repositories {
mavenCentral()
maven { url 'https://maven.google.com' }
}
并在app的build.gradle中增加对glide的依赖,配置如下:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
}
注: 如果你需要使用不同的支持库版本,你需要在你的 build.gradle 文件里去从 Glide 的依赖中去除 "com.android.support",例如:
dependencies {
implementation ("com.github.bumptech.glide:glide:4.7.1") {
exclude group: "com.android.support"
}
implementation "com.android.support:support-fragment:26.1.0"
}
3、Glide加载图片基本方式
特别说明:Glide 现在最新版是v4,与之前的v3版本在使用上有比较大的差异,主要改动是Glide库处理选项(centerCrop(), placeholder() 等)的方式,V4版本增加RequestOptions类处理选项。因此在本文中主要V4版本的用法。
1.简单常用的方式
使用Glide加载图片很简单,一行代码足以:
String myUrl = "http://img.zcool.cn/community/0117e2571b8b246ac72538120dd8a4.jpg@1280w_1l_2o_100sh.jpg";
ImageView imageView = (ImageView)findViewById(R.id.iv_background);
Glide.with(fragment)
.load(myUrl) //myurl表示图片的url地址
.into(imageView);//imageView表示加载的图片要显示在imageView上
既然有加载,就有相应的取消加载方式,同样很简单:
Glide.with(context).clear(imageView); // 取消加载图片
注:尽管及时的取消不必要的加载是很好的实践,但不是必须的操作。因为在实际中的Activity、Fragment在实例销毁的时候,Glide自身会自动取消加载。
2.使用注解处理器的方式
这种方式时使用注解的方式,实现的。在使用注解方式,务必要在App的build.gradle的dependencies中引入下:
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
在Application模块中,通过创建一个带有@GlideModule注解,并继承AppGlideModule的类。这个类能够生成一个流式API,内嵌了多种选项,如下:
package com.example.myapp;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
通过编译就好生成一个默认名称为GlideApp的类,在Application中就可以按下方式使用来完成加载图片功能:
RequestOptions options = new RequestOptions();
options.placeholder(placeholder)
.fitCenter();
GlideApp.with(fragment)
.load(myUrl)
.apply(options)
.into(imageView);
4、Glide的其他设置
1.占位图设置
在实际图片的加载过程中,会经常出现图片加载缓慢的问题,这个时候需要展示该图片的位置就显示了一片空白,体验效果很不友好,因此Glide提供了占位图,可以预设置一个默认的图片,在实际的图片未加载完成时,显示这个默认图片,提高用户体验。使用方式如下:
//通过使用RequestOptions去设置占位图及加载错误时显示图
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_default) //这里设置占位图
.error(R.drawable.ic_error) ;//这里设置图片加载错误时要显示的图
Glide.with(activity)
.load(url)
.apply(options)
.into(imageView);
placeholder()和error()参数都是int类型,即使用本地资源对应的id,可能主要考虑到加载速度快。
2.缩略图
设置缩略图,与设置占位图有所不同,可以设置网络资源。使用如下:
Glide.with(activity)
.load(url)
.thumbnail(0.4f)
.into(imageView);
意思很简单,就是展示原来0.4倍大小的一个缩略图。
3.动画开关
从Glide 3.7版本开始,默认开启了动画开关。如需关闭动画可调用dontAnimate。
但是在V4版本之后动画设置移入到TransitionOptions中,有如下三种:
GenericTransitionOptions
,DrawableTransitionOptions
,BitmapTransitionOptions
Glide.with(this)
.load(url)
.transition(DrawableTransitionOptions.withCrossFade()) //淡入淡出动画
.apply(RequestOptions.noAnimation()) //关闭动画
.into(imageView);
默认情况下动画时间是300ms。
4.图片缓存
内存缓存
为了实现图片快速加载,Glide帮我们实现了图片缓存功能,如果不需要使用则可调用skipMemoryCache(true)告诉Glide跳过内存缓存。
注意:该方法之对内存缓存有影响。
磁盘缓存
由于手机内存使用有限,内存资源比较珍贵,不可能将所有的图片资源缓存的内存中,因此为了提高加载效率,Glide还采用了磁盘缓存的方式。
磁盘缓存也是默认开启的,当然也可以关闭,方式如下:
Glide.with(activity)
.load(url)
.apply(RequestOptions.skipMemoryCacheOf(true) //取消内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE)) //取消图片磁盘缓存
.into(imageView);
缓存设置同样式通过RequestOptions进行设置的。
5.显示gif和video
Glide可以加载和显示一个gif,使用方式很简单,如下:
Glide.with(activity)
.asGif()
.load(url)
.into(imageView);
注:
这里如果加载的不是一个gif动画,将无法显示,所以asGif慎用。
Glide加载video只能针对本地的视频。
6.其他功能
Glide还有其他的功能,比如自已自定义缓存策略、设置优先级等。这里就不多说了。可以看看RequestOption类。
5、总结
1.针对两种方式的使用,可根据个人喜好自行选择;
2.Glide使用时,对url进行空检查并不是必须的,如果url为空,则会清空View的内容或者使用设置的默认图片资源;
3.使用在列表(ListView、RecyclerView等)中由于View的复用,因此针对在之前的位置上,用 Glide 进行过加载操作的情况,那么在新的位置上要重新into(view)
操作,或调用clear()
API 停止 Glide 的工作。否则可能会出现这样一个情况:你已经对一个view设置好了Drawable,但该 view 在之前的位置上使用 Glide 进行过加载图片的操作,在Glide 加载完毕后可能会将这个view改回成原来的内容,即没有设置成功问题。
至此,Glide开源框架的使用就是这么的简单,到这里就讲完了。
后面会从源码的角度对Glide进行分析。