热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

GitHub源码点击查看1.简介Glide是一个高效、开源、Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache2.0协议发布。Glide具有获取、解码

;

//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


<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="500"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>

set>
  • 设置要加载的内容

项目中有很多需要先下载图片然后再做一些合成的功能,比如项目中出现的图文混排,该如何实现目标下

Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimationsuper GlideDrawable> 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);

Demo栗子第1颗

1.配置glide使用环境

gradle
'com.github.bumptech.glide:glide:3.7.0'

2.权限

xml

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

3.使用Glide加载图片

xml
<ImageView
android:layout_width="100dp"
android:src="@mipmap/ic_launcher"
android:id="@+id/image"
android:scaleType="centerCrop"
android:layout_height="100dp" />
java
//(Glide:一种图片三级缓存的实现,可以缓存图片,流畅性强)
//步骤一。配置glide使用环境
//1.1.依赖 compile 'com.github.bumptech.glide:glide:3.7.0'
//1.2.添加网络权限 INTERNET SD读取
//步骤二。使用Glide加载图片
//2.1.准备网络地址
url = "https://github.com/bumptech/glide/raw/master/static/glide_logo.png";
//2.2.布局一个ImageView,查找出控件
imageView = (ImageView) findViewById(R.id.image);
//2.3.加载图片方法
}
public void showImage(View view) {
Glide.with(this)//设置上下文
.load(url)//设置图片的网络地址
.into(imageView);//指定显示控件
}

Demo栗子第2颗

没有Demo的代码讲解不是好文章,让我们来一步步学会使用Glide。
步骤1:在gradle添加依赖

repositories {
mavenCentral()
}


dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
}

步骤2:添加网络权限

<uses-permission android: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-data android:name="com.example.xx.glide" tools:node="remove"/>

8. 使用Glide下载自定义尺寸的图片

Glide的ModelLoader接口为开发者提供了装载图片的view的尺寸,并且允许开发者使用这些尺寸信息去选择合适的URL去下载图片。选用适当的尺寸可以节省宽带和设备的空间开销,提高app的性能

  • 通过http/https下载图片,可以通过继承BaseGlideUtlLoader来实现:
public interface MyDataModel {
public String buildUrl(int width, int height);
}
public class MyUrlLoader extends BaseGlideUrlLoader<MyDataModel> {
@Override
protected String getUrl(MyDataModel model, int width, int height) {
// Construct the url for the correct size here.
return model.buildUrl(width, height);
}
}
  • 可以使用你自定义的ModelLoader去加载图片了
Glide.with(yourFragment).using(new MyUrlLoader()).load(yourModel).into(yourView);

如果你想避免每次加载图片都要使用.using(new MyUrlLoader()) ,可以实现是一个
ModelLoaderFactory然后使用Glide将它注册到GlideModule当中

public class MyGlideModule implements GlideModule {
...
@Override
public void registerComponents(Context context, Glide glide) {
glide.register(MyDataModel.class, InputStream.class,
new MyUrlLoader.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

data
android:name="com.bumptech.glide.integration.volley.VolleyGlideModule"
android:value="GlideModule" />

然后改变混淆文件:

-keep class com.bumptech.glide.integration.volley.VolleyGlideModule
#or
-keep public class * implements com.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

data
android:name="com.bumptech.glide.integration.okhttp.OkHttpGlideModule"
android:value="GlideModule" />

然后改变混淆文件:

-keep class com.bumptech.glide.integration.okhttp.OkHttpGlideModule
#or
-keep public class * implements com.bumptech.glide.module.GlideModule

推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • github上_idea上传本地项目到github上(图解)
    本文由编程笔记#小编为大家整理,主要介绍了idea上传本地项目到github上(图解)相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
Kermit68_629
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有