我们的项目中有使用到picasso库,这段时间我负责一个广告位的对接,于是在这里分享从零开始学习picasso的过程。
第一篇picasso的参考博客:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0731/1639.html
1.首先我们先简单了解Picasso
根据之前学习过的知识,我们可以使用HttpUrlConnection和AsyncTask来远程加载图片,但是这种方法的代码比较繁琐。不仅需要我们编写大量的代码,还需要处理缓存和下载管理等,所以建议使用自己封装的库或者第三方库;
这里我们介绍一下Picasso,picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能。
Picasso的特性:
- 在adapter中回收和取消当前的下载;
- 使用最少的内存完成复杂的图形转换操作;
- 自动的内存和硬盘缓存;
- 图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;
- 加载网络或本地资源;
2.Picasso的使用
a.Picasso的基本使用
picasso的时候非常非常简单,将Picasso添加进项目后,只需要一句就可以获取到。
Picasso.with(context).load(imageUrl).into(imageView);
这一行代码虽短,但实现的内容一点也不少:
a.自动将图像缓存在本地
b.通过图片压缩转换以减少内存消耗
c.自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载;
Placeholder:.placeholder()
我们可能不需要解释这种现象:一个空的ImageView在你的UI中肯定不好看。如果你使用Picasso,你可能通过网络连接来加载图片,这取决于用户的环境,这可能会花费很长时间。一个比较好的解决方案是在加载图片的过程中,你可以先加载一个本地图片当做替代图片,直到从网络下载的图片加载出来。
Picasso的流接口使得这样实现变得非常简单!只需要调用.placeHolder()
这个方法,在加载出网络图片之前,Picasso将会展示placeholder的图片。
Picasso
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.into(imageViewPlaceholder);
很明显,你不可以将一张网络上的图片用作替代图片,因为这依旧需要从网上加载。app上的资源和图片是即时可用的。然而,对于load()这个参数,Picasso可以接受所有类型的值。这个可能不会被加载出来(无网络连接,服务器崩溃),在下一节,我们会讨论error placeholder。
Error Placeholder:.error()
我们假定app需要从网络上加载图片,但是当前网络出问题了。Picasso会将错误返回并且做出合适的处理。在我们做出相应的操作之前,我们可以先使用一张替代图片来代替来告诉用户图片加载出错了。这和之前Picasso处理placeholder的流接口是相同的,只是使用一个名为error()
的函数。
Picasso
.with(context)
.load("http://futurestud.io/non_existing_image.png")
.placeholder(R.mipmap.ic_launcher) // can also be a drawable
.error(R.mipmap.future_studio_launcher) // will be displayed if the image cannot be loaded
.into(imageViewError);
```
就是这个了!如果你想要加载的图片并没有加载,Picasso将会加载`R.mipmap.future_studio_launcher` 。同样,error()所传的参数只能是被初始化过得drawable对象或者它们的id。
#noFade()的使用
无论在加载图片之前你有没有设置placeholder,Picasso总是自动渐显(fade in)加载图片,因为这会让你的ui变化不那么突兀。如果你希望直接加载图片,而没有渐显(fade)的效果,使用`.noFade()`这个方法即可。
这会直接加载图片,而不带任何效果。在你这样做之前,请先确定你是真的需要这个效果。
知道所有的参数都是独立的并且不依赖于其他参数这很重要。例如,你可以设置`.error()` 而不需要调用`.placeholder()`. 任何参数进行组合都是有可能的。
#noPlaceholder的使用
你可能会发现我们曾经使用过noPlaceholder()。很重要的一点是:这并不是取消之前设置的`.placeholder()` 或者`.error()` 。这适用于另一种不同的情况。
我们来想一下下面这种情况:你在ImageView中加载了一张图片,一段时间过后,你想在同样的ImageView中加载另一张图片。使用