picasso基本使用

深度解析picasso,参考博客源网址:http://blog.csdn.net/u012702547/article/details/52273918

android studio中添加

compile 'com.squareup.picasso:picasso:2.5.2'

Picasso加载一张网络图片,最简单的一行代码就搞定:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg").into(iv); 
如果你想对这张图片进行剪裁,可以使用resize方法:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  2.                 .resize(200,200)  
  3.                 .into(iv);  
注意这里的200表示200px,如果你想在resize时指定dp,可以使用如下方法:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  2.                 .resizeDimen(R.dimen.iv_width,R.dimen.iv_height)  
  3.                 .into(iv);  
在dimen文件中定义宽高即可:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <dimen name="iv_width">200dp</dimen>  
  2.     <dimen name="iv_height">200dp</dimen>  

很多时候我还可以给Picasso下载的图片设置缩放模式,也就是ImageView的ScaleType属性(不了解的请移步这里),但是注意,缩放模式centerCrop和centerInside要和resize一起使用,否则会抛异常,而缩放模式fit不可以和resize一起使用,如下:

使用fit:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  2.                 .fit()  
  3.                 .into(iv);  
使用centerCrop:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  2.         .resizeDimen(R.dimen.iv_width,R.dimen.iv_height)  
  3.         .centerCrop()  
  4.         .into(iv);  

很多时候我们在图片加载出来之前需要先显示一张默认图片,也即占位图,而在图片加载出错的时候我们可能想显示一张错误图,这个Picasso也是支持的:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  2.                 //占位图,图片加载出来之前显示的默认图片  
  3.                 .placeholder(R.mipmap.ic_launcher)  
  4.                 //错误图,图片加载出错时显示的图片  
  5.                 .error(R.mipmap.ic_launcher)  
  6.                 .into(iv);  
很多时候,我们可能想显示一个用户图像,但是这个用户图像是个圆形图片,这个用Picasso该怎么实现呢?首先定义一个Transformation,在transform方法中对图片进行二次处理,包括剪裁重新处理等等,那我这里想把原图变为一个圆形图,就可以按下面的写法来:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Transformation transformation = new Transformation() {  
  2.             @Override  
  3.             public Bitmap transform(Bitmap source) {  
  4.                 int width = source.getWidth();  
  5.                 int height = source.getHeight();  
  6.                 int size = Math.min(width, height);  
  7.                 Bitmap blankBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  
  8.                 Canvas canvas = new Canvas(blankBitmap);  
  9.                 Paint paint = new Paint();  
  10.                 paint.setAntiAlias(true);  //设置为true,就是抗锯齿效果的
  11.                 canvas.drawCircle(size / 2, size / 2, size / 2, paint);  
  12.                 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));  
  13.                 canvas.drawBitmap(source, 00, paint);  
  14.                 if (source != null && !source.isRecycled()) {  
  15.                     source.recycle();  
  16.                 }  
  17.                 return blankBitmap;  
  18.             }  
  19.   
  20.             @Override  
  21.             public String key() {  
  22.                 return "squareup";  
  23.             }  
  24.         };  
paint的setXfermode表示最终显示的图形取所绘制图形的交集,我这里先绘制了圆形,又绘制了一个矩形的Bitmap,圆形没有Bitmap大,所以交集肯定是圆形,所以最终显示结果就为圆形,在加载图片的时候可以通过transform属性来使用自定义的这个transformation,如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso.with(this).load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  2.                .transform(transformation)  
  3.                .into(iv);  

Picasso还可以通过开启指示器,让你看到这个图片是从内存加载来的还是从SD卡加载来的还是从网络加载来的,设置方式如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso picasso = Picasso.with(this);  
  2.        //开启指示器  
  3.        picasso.setIndicatorsEnabled(true);  
  4.        picasso.load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  5.                .into(iv);  

图片左上角会有一个蓝色的三角符号,不同的颜色表示图片的来源不同,红、蓝、绿三种颜色分别代表网络、SD卡和内存。

现在大部分的图片缓存框架都是支持三级缓存的,在Picasso中,我们也可以手动设置缓存策略,比如说当我们查看一张大图的时候,可能由于图片太大,不想将其缓存在内存中,那么可以自定义缓存策略,如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Picasso picasso = Picasso.with(this);  
  2. //开启指示器  
  3. picasso.setIndicatorsEnabled(true);  
  4. picasso  
  5.         .load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  6.         //第一个参数是指图片加载时放弃在内存缓存中查找  
  7.         //第二个参数是指图片加载完不缓存在内存中  
  8.         .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)  
  9.         .into(iv);  
在ListView或者RecyclerView中加载图片时,当列表处于滑动状态的时候,我们可以停止图片的加载,当列表停止滚动的时候,我们又可以继续加载图片,如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Object tag = new Object();  
  2. Picasso with = Picasso.with(this);  
  3. with.load("http://n.sinaimg.cn/translate/20160819/9BpA-fxvcsrn8627957.jpg")  
  4.         .into(iv);  
  5. //暂停加载  
  6. with.pauseTag(tag);  
  7. //恢复加载  
  8. with.resumeTag(tag); 
这里要传递的对象可以是任意对象,这两个方法的使用需要我们自己去监听ListView或者GridView的滑动状态。OK,以上这些都属于Picasso的一个基本使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值