0%

Picasso图片下载与缓存

一,简介

  1. picasso是Square公司开源的一个Android图形缓存库,地址https://github.com/square/picasso ,可以实现图片下载和缓存功能。

    1
    Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
  2. 特性

    • 在adapter中回收和取消当前的下载;
    • 使用最少的内存完成复杂的图形转换操作;
    • 自动的内存和硬盘缓存;
    • 图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;
    • 加载载网络或本地资源;

二、基本使用

  1. Adapter中的使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //View复用会自动察觉并且取消之前的下载任务
    @Override
    public void getView(int position, View convertView, ViewGroup parent) {
    SquaredImageView view = (SquaredImageView) convertView;
    if (view == null) {
    view = new SquaredImageView(context);
    }
    String url = getItem(position);
    Picasso.with(context).load(url).into(view);
    }
  2. 图片转换

    1. 转换图片以适应布局大小并减少内存占用
    1
    2
    3
    4
    5
    6
    Picasso.with(context)
    .load(url)
    .resize(50, 50)
    .centerCrop()
    .into(imageView);

    1. 自定义转换
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 将CropSquareTransformation 的对象传递给transform 方法即可。
    public class CropSquareTransformation implements Transformation {
    @Override
    public Bitmap transform(Bitmap source) {
    int size = Math.min(source.getWidth(), source.getHeight());
    int x = (source.getWidth() - size) / 2;
    int y = (source.getHeight() - size) / 2;
    Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
    if (result != source) {
    source.recycle();
    }
    return result;
    }
    @Override
    public String key() { return "square()"; }
    }
  1. 占位符(空白或者错误占位图片)

    • picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。
    • 如果加载发生错误会重复三次请求,三次都失败才会显示erro Place holder
    1
    2
    3
    4
    5
    Picasso.with(context)
    .load(url)
    .placeholder(R.drawable.user_placeholder)
    .error(R.drawable.user_placeholder_error)
    .into(imageView);
  1. 资源文件的加载:除了加载网络图片picasso还支持加载Resources, assets, files, content providers中的资源文件。

    1
    2
    Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
    Picasso.with(context).load(new File(...)).into(imageView2);

三、一段小代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ViewCompat.setTransitionName(mPhotoView, mImageUrl);
Picasso.with(getActivity()).load(mImageUrl)
.into(mPhotoView, new Callback() {
@Override
public void onSuccess() {
// 隐藏进度条
progressBar.setVisibility(View.GONE);
}

@Override
public void onError() {
progressBar.setVisibility(View.GONE);
}
});