Android图片加载框架最全解析(一)Glide的基本用法-精品文档资料整理.docx

上传人:安*** 文档编号:73267982 上传时间:2023-02-17 格式:DOCX 页数:17 大小:20.48KB
返回 下载 相关 举报
Android图片加载框架最全解析(一)Glide的基本用法-精品文档资料整理.docx_第1页
第1页 / 共17页
Android图片加载框架最全解析(一)Glide的基本用法-精品文档资料整理.docx_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《Android图片加载框架最全解析(一)Glide的基本用法-精品文档资料整理.docx》由会员分享,可在线阅读,更多相关《Android图片加载框架最全解析(一)Glide的基本用法-精品文档资料整理.docx(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Android图片加载框架最全解析(一),Glide的基本用法 本文同步发表于我的微信公众号 扫一扫文章底部的二维码或者在微信搜索 郭霖 即可关注 每天都有文章更新。 如今Android上的图片加载框架非常成熟 从最早的老牌图片加载框架UniversalImageLoader 到后来Google推出的Volley 再到后来的新兴军Glide以及Picasso 当然还有Facebook的Fresco。每一个都非常稳定 功能也都特别强大。但是它们的使用场景根本都是重合的 也就是讲我们根本只需要选择其中一个来进展学习以及使用就足够了 每一个框架都尝试去掌握的话那么有些浪费时间。 在这几个框架当中 我

2、对Volley以及Glide研究得比拟深化 对UniversalImageLoader、Picasso以及Fresco都只是有一些根本的解析。从易用性上来讲 Glide以及Picasso应该都是完胜其他框架的 这两个框架都实在是太简单好用了 大多数情况下加载图片都是一行代码就能解决的 而UniversalImageLoader以及Fresco那么在这方面略逊一些。 那么再拿Glide以及Picasso比照呢 首先这两个框架的用法非常相似 但其实它们各有特色。Picasso比Glide更加简洁以及轻量 Glide比Picasso功能更为丰富。之前已经有人对这两个框架进展过全方面的比照 大众假如想

3、解析更多的话可以去参考一下 。 总之 没有最好的框架 只有最合适自己的框架。经太多方面比照之后 我还是决定选择了Glide来进展研究 并且这也是Google官方推荐的图片加载框架。 讲实话 关于Glide的文章我已经筹备了好久 去年度这个时候本来就打算要写了 但是一直都没有动笔。因为去年度我的大局部时间都放在了写上面 只能用碎片时间来写写博客 但是Glide的难度远超出了我用碎片时间所能掌握的难度。当然 这里我讲的是对它的源码进展解析的难度 不是使用上的难度 Glide的用法是很简单的。所以 我觉得去年度我写不好Glide这个题材的文章 也就一直拖到了今年度。 而如今 我花费了大量的精力去研究

4、Glide的源码以及各种用法 相信如今已经可以将它非常好地掌握了 因此我准备将我掌握的这些知识整理成一个新的系列 帮助大众更好地学习Glide。这个Glide系列大概会有8篇左右文章 预计花半年度时间写完 将会包括Glide的根本用法、源码解析、高级用法、功能扩展等内容 可能会是目前互联网上最详尽的Glide教程。 那么本篇文章是这个系列的第一篇文章 我们先来解析一下Glide的根本用法吧。 Glide是一款由Bump Technologies开发的图片加载框架 使得我们可以在Android平台上以极度简单的方式加载以及展示图片。 目前 Glide最新的稳定版本是3.7.0 固然4.0已经推出

5、RC版了 但是暂时问题还比拟多。因此 我们这个系列的博客都会使用Glide 3.7.0版本来进展讲解 这个版本的Glide相当成熟以及稳定。 要想使用Glide 首先需要将这个库引入到我们的工程当中。新建一个GlideTest工程 然后在app/build.gradle文件当中添加如下依赖 dependencies compile com.github.bumptech.glide:glide:3.7.0 假如你还在使用Eclipse 可以点击 下载Glide的jar包。 另外 Glide中需要用到网络功能 因此你还得在AndroidManifest.xml中声明一下网络权限才行 uses-p

6、ermission android:name android.permission.INTERNET / 就是这么简单 然后我们就可以自由地使用Glide中的任意功能了。 加载图片 如今我们就来尝试一下怎样使用Glide来加载图片吧。比方这是必应上一张首页美图的地址 :/cn.bing /az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg 然后我们想要在程序当中去加载这张图片。 那么首先翻开工程的布局文件 在布局当中参加一个Button以及一个ImageView 如下所示 ?xml version 1.0 encoding utf-

7、8 ? LinearLayout xmlns:android :/schemas.android /apk/res/android android:layout_width match_parent android:layout_height match_parent android:orientation vertical Button android:layout_width wrap_content android:layout_height wrap_content android:text Load Image android:onClick loadImage ImageView

8、android:id id/image_view android:layout_width match_parent android:layout_height match_parent / /LinearLayout 为了让用户点击Button的时候可以将刚刚的图片显示在ImageView上 我们需要修改MainActivity中的代码 如下所示 public class MainActivity extends AppCompatActivity ImageView imageView; Override protected void onCreate(Bundle savedInstan

9、ceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView (ImageView) findViewById(R.id.image_view); public void loadImage(View view) String url :/cn.bing /az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg ; Glide.with(this).load(url).into(imageView); 没错 就

10、是这么简单。如今我们来运行一下程序 效果如下列图所示 可以看到 一张网络上的图片已经被成功下载 并且展示到ImageView上了。 而我们到底做了什么 实际上核心的代码就只有这一行而已 Glide.with(this).load(url).into(imageView); 千万不要小看这一行代码 实际上仅仅就这一行代码 你已经可以做非常非常多的事情了 包括加载网络上的图片、加载手机本地的图片、加载应用资源中的图片等等。 下面我们就来详细解析一下这行代码。 首先 调用Glide.with()方法用于创立一个加载图片的实例。with()方法可以接收Context、Activity或Fragment

11、类型的参数。也就是讲我们选择的范围非常广 不管是在Activity还是Fragment中调用with()方法 都可以直接传this。那假如调用的地方既不在Activity中也不在Fragment中呢 也没关系 我们可以获取当前应用程序的ApplicationContext 传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期 假如传入的是Activity或Fragment的实例 那么当这个Activity或者Fragment被销毁的时候 图片加载也会停顿。假如传入的是ApplicationContext 那么只有当应用程序被杀掉的时候 图片加载才会停顿

12、。 接下来看一下load()方法 这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源 包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。因此load()方法也有很多个方法重载 除了我们刚刚使用的加载一个字符串网址之外 你还可以这样使用load()方法 / 加载本地图片File file new File(getExternalCacheDir() /image.jpg );Glide.with(this).load(file).into(imageView);/ 加载应用资源int resource R.drawable.image;Glide.with(this

13、).load(resource).into(imageView);/ 加载二进制流byte image getImageBytes();Glide.with(this).load(image).into(imageView);/ 加载Uri对象Uri imageUri getImageUri();Glide.with(this).load(imageUri).into(imageView); 最后看一下into()方法 这个方法就很简单了 我们祈望让图片显示在哪个ImageView上 把这个ImageView的实例传进去就可以了。当然 into()方法不仅仅是只能接收ImageView类型的参

14、数 还支持很多更丰富的用法 不过那个属于高级技巧 我们会在后面的文章当中学习。 那么回首一下Glide最根本的使用方式 其实就是关键的三步走 先with() 再load() 最后into()。熟记这三步 你就已经入门Glide了。 如今我们来学一些Glide的扩展内容。其实刚刚所学的三步走就是Glide最核心的东西 而我们后面所要学习的所有东西都是在这个三步走的根底上不断进展扩展而已。 观察刚刚加载网络图片的效果 你会发现 点击了Load Image按钮之后 要略微等一会图片才会显示出来。这其实很容易理解 因为从网络上下载图片本来就是需要时间的。那么我们有没有方法再优化一下用户体验呢 当然可以

15、 Glide提供了各种各样非常丰富的API支持 其中就包括了占位图功能。 顾名思义 占位图就是指在图片的加载经过中 我们先显示一张临时的图片 等图片加载出来了再交换成要加载的图片。 下面我们就来学习一下Glide占位图功能的使用方法 首先我事先准备好了一张loading.jpg图片 用来作为占位图显示。然后修改Glide加载局部的代码 如下所示 Glide.with(this) .load(url) .placeholder(R.drawable.loading) .into(imageView); 没错 就是这么简单。我们只是在刚刚的三步走之间插入了一个placeholder()方法 然后将

16、占位图片的资源id传入到这个方法中即可。另外 这个占位图的用法其实也演示了Glide当中绝大多数API的用法 其实就是在load()以及into()方法之间串接任意想添加的功能就可以了。 不过假如你如今重新运行一下代码并点击Load Image 很可能是根本看不到占位图效果的。因为Glide有非常强大的缓存机制 我们刚刚加载那张必应美图的时候Glide自动就已经将它缓存下来了 下次加载的时候将会直接从缓存中读取 不会再去网络下载了 因此加载的速度非常快 所以占位图可能根本来不及显示。 因此这里我们还需要略微做一点修改 来让占位图能有时机显示出来 修改代码如下所示 Glide.with(this

17、) .load(url) .placeholder(R.drawable.loading) .diskCacheStrategy(DiskCacheStrategy.NONE) .into(imageView); 可以看到 这里串接了一个diskCacheStrategy()方法 并传入DiskCacheStrategy.NONE参数 这样就可以禁用掉Glide的缓存功能。 关于Glide缓存方面的内容我们将会在后面的文章进展详细的讲解 这里只是为了测试占位图功能而加的一个额外配置 暂时你只需要知道禁用缓存必须这么写就可以了。 如今重新运行一下代码 效果如下列图所示 可以看到 当点击Load

18、Image按钮之后会立即显示一张占位图 然后等真正的图片加载完成之后会将占位图交换掉。 当然 这只是占位图的一种 除了这种加载占位图之外 还有一种异常占位图。异常占位图就是指 假如因为某些异常情况导致图片加载失败 比方讲手机网络信号不好 这个时候就显示这张异常占位图。 异常占位图的用法相信你已经可以猜到了 首先准备一张error.jpg图片 然后修改Glide加载局部的代码 如下所示 Glide.with(this) .load(url) .placeholder(R.drawable.loading) .error(R.drawable.error) .diskCacheStrategy(D

19、iskCacheStrategy.NONE) .into(imageView); 很简单 这里又串接了一个error()方法就可以指定异常占位图了。 如今你可以将图片的url地址修改成一个不存在的图片地址 或干脆直接将手机的网络给关了 然后重新运行程序 效果如下列图所示 这样我们就把Glide提供的占位图功能都掌握了。 指定图片格式 我们还需要再解析一下Glide另外一个强大的功能 那就是Glide是支持加载GIF图片的。这一点确实非常牛逼 因为相比之下Jake Warton曾经明确表示过 Picasso是不会支持加载GIF图片的。 而使用Glide加载GIF图并不需要编写什么额外的代码 Gl

20、ide内部会自动判断图片格式。比方这是一张GIF图片的URL地址 :/p1.pstatp /large/166200019850062839d3 我们只需要将刚刚那段加载图片代码中的URL地址交换成上面的地址就可以了 如今重新运行一下代码 效果如下列图所示 也就是讲 不管我们传入的是一张普通图片 还是一张GIF图片 Glide都会自动进展判断 并且可以正确地把它解析并展示出来。 但是假如我想指定图片的格式该怎么办呢 就比方讲 我祈望加载的这张图必须是一张静态图片 我不需要Glide自动帮我判断它到底是静图还是GIF图。 想实现这个功能仍然非常简单 我们只需要再串接一个新的方法就可以了 如下所示

21、 Glide.with(this) .load(url) .asBitmap() .placeholder(R.drawable.loading) .error(R.drawable.error) .diskCacheStrategy(DiskCacheStrategy.NONE) .into(imageView); 可以看到 这里在load()方法的后面参加了一个asBitmap()方法 这个方法的意思就是讲这里只允许加载静态图片 不需要Glide去帮我们自动进展图片格式的判断了。 如今重新运行一下程序 效果如下列图所示 由于调用了asBitmap()方法 如今GIF图就无法正常播放了 而是

22、会在界面上显示第一帧的图片。 那么类似地 既然我们能强迫指定加载静态图片 就也能强迫指定加载动态图片。比方讲我们想要实现必须加载动态图片的功能 就可以这样写 Glide.with(this) .load(url) .asGif() .placeholder(R.drawable.loading) .error(R.drawable.error) .diskCacheStrategy(DiskCacheStrategy.NONE) .into(imageView); 这里调用了asGif()方法替代了asBitmap()方法 很好理解 相信不用我多做什么解释了。 那么既然指定了只允许加载动态图片

23、 假如我们传入了一张静态图片的URL地址又会怎么样呢 试一下就知道了 将图片的URL地址改成刚刚的必应美图 然后重新运行代码 效果如下列图所示。 没错 假如指定了只能加载动态图片 而传入的图片却是一张静图的话 那么结果自然就只有加载失败喽。 指定图片大小 实际上 使用Glide在绝大多数情况下我们都是不需要指定图片大小的。 在学习本节内容之前 你可能还需要先解析一个概念 就是我们平时在加载图片的时候很容易会造成内存浪费。什么叫内存浪费呢 比方讲一张图片的尺寸是1000*1000像素 但是我们界面上的ImageView可能只有200*200像素 这个时候假如你不对图片进展任何压缩就直接读取到内存

24、中 这就属于内存浪费了 因为程序中根本就用不到这么高像素的图片。 关于图片压缩这方面 我之前也翻译过Android官方的一篇文章 感兴趣的朋友可以去浏览一下 。 而使用Glide 我们就完全不用担忧图片内存浪费 甚至是内存溢出的问题。因为Glide从来都不会直接将图片的完好尺寸全部加载到内存中 而是用多少加载多少。Glide会自动判断ImageView的大小 然后只将这么大的图片像素加载到内存当中 帮助我们节省内存开支。 当然 Glide也并没有使用什么神奇的魔法 它内部的实现原理其实就是上面那篇文章当中介绍的技术 因此掌握了最根本的实现原理 你可以以自己实现一套这样的图片压缩机制。 也正是因

25、为Glide是如此的智能 所以刚刚在开场的时候我就讲了 在绝大多数情况下我们都是不需要指定图片大小的 因为Glide会自动根据ImageView的大小来决定图片的大小。 不过 假如你真的有这样的需求 必须给图片指定一个固定的大小 Glide仍然是支持这个功能的。修改Glide加载局部的代码 如下所示 Glide.with(this) .load(url) .placeholder(R.drawable.loading) .error(R.drawable.error) .diskCacheStrategy(DiskCacheStrategy.NONE) .override(100, 100)

26、.into(imageView); 仍然非常简单 这里使用override()方法指定了一个图片的尺寸 也就是讲 Glide如今只会将图片加载成100*100像素的尺寸 而不会管你的ImageView的大小是多少了。 好了 今天是我们这个Glide系列的第一篇文章 写了这么多内容已经算是挺不错的了。如今你已经解析了Glide的根本用法 当然也是一些最常用的用法。下一篇文章当中 我们会尝试去分析Glide的源码 研究一下在这些根本用法的背后 Glide到底执行了什么神奇的操作 可以使得我们加载图片变得这么简单 感兴趣的朋友请继续浏览 。 关注我的技术公众号 每天都有优质技术文章推送。关注我的娱乐公众号 工作、学习累了的时候放松一下自己。 微信扫一扫下方二维码即可关注

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 工程图纸

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁