也是挺惭愧了,Picasso都已经更新很多版本了我才开始要使用它,之前都在用Fresco,搜到这篇文章感觉对自己有用,所以就顺便转载了方便以后查阅。

Picasso介绍

Picasso是Square公司开源的一个Android图形缓存库

A powerful image downloading and caching library for Android 
一个Android下强大的图片下载缓存库

Picasso实现了图片的异步加载,并解决了Android中加载图片时常见的一些问题,它有以下特点:

Adapter

  • 中取消了不在视图范围内的

ImageView

  • 的资源加载,因为可能会产生图片错位;
  • 使用复杂的图片转换技术降低内存的使用
  • 自带内存和硬盘的二级缓存机制

为什么要用Picasso

  Android系统作为图片资源加载的主角,它是通过图像的像素点来把图像加载到内存中的;现在一张500W的摄像头拍出的照片(2592x1936),加载到内存中需要大约19M的内存;如果你加入了信号强度不一的网络中进行了复杂的网络请求,并进行图片的缓存与其他处理,你会耗费大量的时间与精力来处理这些问题,但如果用了Picasso, 这些问题都一消而散;

将Picasso加入到你的项目中

 目前Picasso的最新版本是2.5.2,你可以下载对应的Jar包,将Jar包添加到你的项目中,或者在build.gradle配置文件中加入

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

注意如果你开启了混淆,你需要将以下代码添加到混淆规则文件中:

-dontwarn com.squareup.okhttp.**

小试牛刀:从网络加载一张图片

Picasso,一个完整的功能请求至少需要三个参数;with(Context context)

  •  - 

Context

  • 上下文在很多Android Api中都是必须的

load(String imageUrl)into(ImageView targetImageView)

  •  - 想进行图片展示的

ImageView

简单用例:

ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
String internetUrl = "http://www.jycoder.com/json/Image/1.jpg";

Picasso
    .with(context)
    .load(internetUrl)
    .into(targetImageView);


URL地址正确并且图片存在,在几秒中之内就能看到这张图片了;如果图片资源不存在,Picasso也会有错误的回调,现在你已经看到了只需3行代码就能加载图片了,当然这只是冰山一角,让我们继续揭开Picasso的神秘面纱;

图片的其他加载方式

URI地址进行图片加载,下面我们就对这三种方式进行实例说明;

从Android Resources 中加载

int值地址即可,上代码:

ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
int resourceId = R.mipmap.ic_launcher;

Picasso
    .with(context)
    .load(resourceId)
    .into(targetImageView);

注意: R.mipmapAndroid Studio中新的资源引用路径,这个老司机都知道.

从本地File文件中加载

File即可,上代码:

ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Running.jpg");

Picasso
    .with(context)
    .load(file)
    .into(targetImageView);

注意:这个file并不一定非得是在你的设备中,可以是任意的路径,只要是File路径即可;

从URI地址中加载

  这个请求方式相比其他也并没有什么不同,上代码:

public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FOREWARD_SLASH = "/";

private static Uri resourceIdToUri(Context context, int resourceId) {
    return Uri.parse(ANDROID_RESOURCE + context.getPackageName() + FOREWARD_SLASH + resourceId);
}

Uri uri = resourceIdToUri(context, R.mipmap.future_studio_launcher);
ImageView targetImageView = (ImageView) findViewById(R.id.imageView);

Picasso  
    .with(context)
    .load(uri)
    .into(targetImageView);

注意:为了示范,只能用资源文件转换为URI,并不仅仅是这种方式, 它可以支持任意的URI地址;

下载固定大小的图片:

Picasso.with(context).load(icon.get(position)).config(Bitmap.Config.RGB_565).resize(208, 208).centerCrop().into(holder.img);


picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。

Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)//没有加载图片时显示的默认图像
.error(R.drawable.user_placeholder_error)// 图像加载错误时显示的图像
.into(imageView);// 被加载的控件


转换图片以适应布局大小并减少内存占用


Picasso.with(context)
.load(url)
.resize(250, 250)
.centerCrop()
.into(imageView)