深度解析picasso,参考博客源网址:http://blog.csdn.net/u012702547/article/details/52273918
android studio中添加
compile 'com.squareup.picasso:picasso:2.5.2'
Picasso加载一张网络图片,最简单的一行代码就搞定:
- Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg").into(iv);
如果你想对这张图片进行剪裁,可以使用resize方法:
- Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
- .resize(200,200)
- .into(iv);
注意这里的200表示200px,如果你想在resize时指定dp,可以使用如下方法:
- Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
- .resizeDimen(R.dimen.iv_width,R.dimen.iv_height)
- .into(iv);
在dimen文件中定义宽高即可:
- <dimen name="iv_width">200dp</dimen>
- <dimen name="iv_height">200dp</dimen>
很多时候我还可以给Picasso下载的图片设置缩放模式,也就是ImageView的ScaleType属性(不了解的请移步这里),但是注意,缩放模式centerCrop和centerInside要和resize一起使用,否则会抛异常,而缩放模式fit不可以和resize一起使用,如下:
使用fit:
- Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
- .fit()
- .into(iv);
使用centerCrop:
- Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
- .resizeDimen(R.dimen.iv_width,R.dimen.iv_height)
- .centerCrop()
- .into(iv);
很多时候我们在图片加载出来之前需要先显示一张默认图片,也即占位图,而在图片加载出错的时候我们可能想显示一张错误图,这个Picasso也是支持的:
- Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
-
- .placeholder(R.mipmap.ic_launcher)
-
- .error(R.mipmap.ic_launcher)
- .into(iv);
很多时候,我们可能想显示一个用户图像,但是这个用户图像是个圆形图片,这个用Picasso该怎么实现呢?首先定义一个Transformation,在transform方法中对图片进行二次处理,包括剪裁重新处理等等,那我这里想把原图变为一个圆形图,就可以按下面的写法来:
- Transformation transformation = new Transformation() {
- @Override
- public Bitmap transform(Bitmap source) {
- int width = source.getWidth();
- int height = source.getHeight();
- int size = Math.min(width, height);
- Bitmap blankBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(blankBitmap);
- Paint paint = new Paint();
- paint.setAntiAlias(true); //设置为true,就是抗锯齿效果的
- canvas.drawCircle(size / 2, size / 2, size / 2, paint);
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
- canvas.drawBitmap(source, 0, 0, paint);
- if (source != null && !source.isRecycled()) {
- source.recycle();
- }
- return blankBitmap;
- }
-
- @Override
- public String key() {
- return "squareup";
- }
- };
paint的setXfermode表示最终显示的图形取所绘制图形的交集,我这里先绘制了圆形,又绘制了一个矩形的Bitmap,圆形没有Bitmap大,所以交集肯定是圆形,所以最终显示结果就为圆形,在加载图片的时候可以通过transform属性来使用自定义的这个transformation,如下:
- Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
- .transform(transformation)
- .into(iv);
Picasso还可以通过开启指示器,让你看到这个图片是从内存加载来的还是从SD卡加载来的还是从网络加载来的,设置方式如下:
- Picasso picasso = Picasso.with(this);
-
- picasso.setIndicatorsEnabled(true);
- picasso.load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
- .into(iv);
图片左上角会有一个蓝色的三角符号,不同的颜色表示图片的来源不同,红、蓝、绿三种颜色分别代表网络、SD卡和内存。
现在大部分的图片缓存框架都是支持三级缓存的,在Picasso中,我们也可以手动设置缓存策略,比如说当我们查看一张大图的时候,可能由于图片太大,不想将其缓存在内存中,那么可以自定义缓存策略,如下:
- Picasso picasso = Picasso.with(this);
-
- picasso.setIndicatorsEnabled(true);
- picasso
- .load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
-
-
- .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
- .into(iv);
在ListView或者RecyclerView中加载图片时,当列表处于滑动状态的时候,我们可以停止图片的加载,当列表停止滚动的时候,我们又可以继续加载图片,如下:
- Object tag = new Object();
- Picasso with = Picasso.with(this);
- with.load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")
- .into(iv);
-
- with.pauseTag(tag);
-
- with.resumeTag(tag);
这里要传递的对象可以是任意对象,这两个方法的使用需要我们自己去监听ListView或者GridView的滑动状态。OK,以上这些都属于Picasso的一个基本使用