Android图片加载库—Glide 最全面解析用法

Glide是一款用于Android平台的高性能图片加载库,支持多种图片格式及缓存策略。本文详细介绍了Glide的功能特性,包括图片异步加载、缓存管理、生命周期集成等,并提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优快云
loading...
GitHub源码
loading...
1. 简介
Glide是一个高效、开源、 Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。
2. 功能特点
创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。
近日,Glide 3.0发布,现已提供jar包下载,同时还支持使用Gradle以及Maven进行构建。
该版本包括很多值得关注的新功能,如支持Gif 动画和视频剧照解码、智能的暂停和重新开始请求、支持缩略图等,具体新增功能如下如下:
GIF动画的解码:通过调用Glide.with(context).load(“图片路径“)方法GIF动画图片可以自动显示为动画效果。
如果想有更多的控制,还可以使用Glide.with(context).load(“图片路径“).asBitmap()方法加载静态图片。
使用Glide.with(context).load(“图片路径“).asGif()方法加载动画图片。
2.1 功能列表
loading...
2.1.1 基础功能
图片的异步加载(基础功能)
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);String Url = "http://218.192.170.132/1.jpg";//Glide使用了流式接口的调用方式 Glide.with(context).load(Url).into(targetImageView);设置加载尺寸
Glide.with(this).load(imageUrl).override(800, 800).into(imageView);设置加载动画
Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);api也提供了几个常用的动画:比如crossFade()
R.anim.item_alpha_in
<?xml version="1.0" encoding="utf-8"?><setxmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:duration="500"android:fromAlpha="0.0"android:toAlpha="1.0"/></set>设置要加载的内容
项目中有很多需要先下载图片然后再做一些合成的功能,比如项目中出现的图文混排,该如何实现目标下
Glide.with(this).load(imageUrl).centerCrop().into(newSimpleTarget<GlideDrawable>() { @OverridepublicvoidonResourceReady(GlideDrawable resource, GlideAnimation<? superGlideDrawable> glideAnimation) { imageView.setImageDrawable(resource); } });设置加载中以及加载失败图片
api里面对placeholder()、error()函数中有多态实现,用的时候可以具体的熟悉一下
Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);2.1.2特色功能
多样式的媒体加载
Glide.with(context).load(imageUrl); .thumbnail(0.1f);//设置缩略图支持:先加载缩略图 然后在加载全图//传了一个 0.1f 作为参数,Glide 将会显示原始图像的10%的大小。//如果原始图像有 1000x1000 像素,那么缩略图将会有 100x100 像素。.asBitmap()//显示gif静态图片.asGif();//显示gif动态图片.into(imageView);关于缓存
设置跳过内存缓存
Glide.with(this).load(imageUrl).skipMemoryCache(true).into(imageView);//设置跳过内存缓存//这意味着 Glide 将不会把这张图片放到内存缓存中去//这里需要明白的是,这只是会影响内存缓存!Glide 将会仍然利用磁盘缓存来避免重复的网络请求。动态清理缓存
Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行Glide.get(this).clearMemory();//清理内存缓存 可以在UI主线程中进行设置磁盘缓存策略
Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);//缓存参数//ALL:缓存源资源和转换后的资源(即所有版本,默认行为)//NONE:不作任何磁盘缓存。然而,默认的它将仍然使用内存缓存!//SOURCE:仅缓存源资源(原来的全分辨率的图像)。//在我们上面略缩图的例子中,将会只有一个1000x1000 像素的图片//RESULT:缓存转换后的资源(最终的图像,即降低分辨率后的(或者是转换后的)其他设置
生命周期集成
通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载图片的请求的生命周期动态管理起来
.with(Context context)// 绑定Context.with(Activity activity);// 绑定Activity.with(FragmentActivity activity);// 绑定FragmentActivity.with(Fragment fragment);// 绑定Fragment注意:
1.传入的context类型影响到Glide加载图片的优化程度
2.Glide可以监视Activity的生命周期,在Activity销毁的时候自动取消等待中的请求。但是如果你使用Application context,你就失去了这种优化效果。
设置动态转换
Glide.with(this).load(imageUrl).centerCrop().into(imageView);设置下载优先级
Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);3. Demo实例
repositories{ mavenCentral() }dependencies { compile'com.github.bumptech.glide:glide:3.7.0'compile 'com.android.support:support-v4:19.1.0'}步骤2:添加网络权限
<uses-permissionandroid:name="android.permission.INTERNET"/>步骤3:在MainActivity中
ImageView targetImageView = (ImageView) findViewById(R.id.ImageView);String Url = "http://218.192.170.132/1.jpg";Glide.with(this).load(Url).into(targetImageView);- 4. 特点
4.1 优点
-多样化媒体加载
Glide 不仅是一个图片缓存,它支持 Gif、WebP、缩略图。甚至是 Video
生命周期集成
通过设置绑定生命周期,我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载图片的请求的生命周期动态管理起来
高效的缓存策略
A. 支持Memory和Disk图片缓存
B. Picasso 只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide 会根据你 ImageView 的大小来缓存相应大小的图片尺寸
比如你ImageView大小是200 200,原图是400 400 ,而使用Glide就会缓存200 200规格的图,而 Picasso只会缓存400 400规格的。这个改进就会导致Glide比Picasso加载的速度要快,毕竟少了每次裁剪重新渲染的过程,非常灵活 & 加载速度快
C. 内存开销小
默认的Bitmap格式是RGB_565格式,而Picasso默认的是ARGB_8888格式,这个内存开销要小一半。
Android关于图片内存计算,共有四种,分别是:
1、ALPHA_8:每个像素占用1byte内存
2、ARGB_4444:每个像素占用2byte内存
3、ARGB_8888:每个像素占用4byte内存(默认,色彩最细腻=显示质量最高=占用的内存也最大)
4、RGB_565:每个像素占用2byte内存(8bit = 1byte)
举例说明:一个32位的PNG=ARGB_8888=1204x1024,那么占用空间是:1024x1024x(32/8) = 4,194,304kb=4M左右
在解析图片的时候,为了避免oom和节省内存,最好使用ARGB_4444模式(节省一半的内存空间)
4.2 缺点
使用方法复杂
由于Glide其功能强大,所以使用的方法非常多,其源码也相对的复杂
包较大
- 5. 相比其他图片加载库(Picasso & Fresco)
对比Picasso
Glide 是在Picasso 基础之上进行的二次开发做了不少改进,不过这也导致包比 Picasso 大不少,不过也就不到 500k(Picasso 是100多k),用法较为复杂,不过毕竟级别还是蛮小的,影响不是很大
对比Fresco
使用较Fresco简单,但性能(加载速度 & 缓存)却比不上Fresco
- 6. 应用场景
根据Glide的特点和与其他图片加载库的对比,可以得出其使用场景:
需要更多的内容表现形式(如Gif);
更高的性能要求(缓存 & 加载速度);
7. GlideModules冲突
虽然Glide允许一个应用当中存在多个GlideModules,Glide并不会按照一个特殊的顺序去调用已注册的GlideModules,如果一个应用的多个依赖工程当中有多个相同的Modules,就有可能会产生冲突。
如果一个冲突是不可避免的,应用应该默认去定义一个自己的Module,用来手动地处理这个冲突,在进行Manifest合并的时候,可以用下面的标签排除冲突的module
<meta-dataandroid:name="com.example.xx.glide"tools:node="remove"/>8. 使用Glide下载自定义尺寸的图片
Glide的ModelLoader接口为开发者提供了装载图片的view的尺寸,并且允许开发者使用这些尺寸信息去选择合适的URL去下载图片。选用适当的尺寸可以节省宽带和设备的空间开销,提高app的性能
通过http/https下载图片,可以通过继承BaseGlideUtlLoader来实现:
publicinterfaceMyDataModel{publicString buildUrl(intwidth, intheight);} publicclassMyUrlLoaderextendsBaseGlideUrlLoader<MyDataModel> {@Override protectedString getUrl(MyDataModel model, intwidth, intheight) { // Construct the url for the correct size here.returnmodel.buildUrl(width, height); }}可以使用你自定义的ModelLoader去加载图片了
Glide.with(yourFragment).using(newMyUrlLoader()).load(yourModel).into(yourView);如果你想避免每次加载图片都要使用.using(new MyUrlLoader()) ,可以实现是一个
ModelLoaderFactory然后使用Glide将它注册到GlideModule当中
publicclassMyGlideModuleimplementsGlideModule{... @OverridepublicvoidregisterComponents(Context context, Glide glide) { glide.register(MyDataModel.class, InputStream.class, newMyUrlLoader.Factory()); }}这样你就可以跳过.using()了
Glide.with(yourFragment).load(yourModel).into(yourView);9. 集成库
1.什么是集成库
Glide包含一些小的、可选的集成库,目前Glide集成库当中包含了访问网络操作的Volley和OkHttp
2.为什么要包含集成库
这些集成库,和Glide的ModelLoader系统允许开发者使用一致地框架去进行网络相关的操作
3.如何将一个库集成到Glide当中,
将一个库集成到Glide当中需要两步操作,
包含正确的dependency,
确保创建了该集成库的GlideModule,比如,
将Volley集成到Glide当中
dependencies{ compile'com.github.bumptech.glide:volley-integration:1.2.2'compile 'com.mcxiaoke.volley:library:1.0.5'}第二步、创建Volley集成库的GlideModule
<meta-dataandroid:name="com.bumptech.glide.integration.volley.VolleyGlideModule"android:value="GlideModule"/>然后改变混淆文件:
-keep class com.bumptech.glide.integration.volley.VolleyGlideModule#or-keeppublicclass* implementscom.bumptech.glide.module.GlideModule将OkHttp集成到Glide当中
第一步、添加依赖
dependencies{ compile'com.github.bumptech.glide:okhttp-integration:1.2.2'compile 'com.squareup.okhttp:okhttp:2.0.0'}第二步、创建OkHttp集成库的GlideModule
<meta-dataandroid:name="com.bumptech.glide.integration.okhttp.OkHttpGlideModule"android:value="GlideModule"/>然后改变混淆文件:
-keep class com.bumptech.glide.integration.okhttp.OkHttpGlideModule#or-keeppublicclass* implementscom.bumptech.glide.module.GlideModule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值