天天看点

Picasso基本使用

<span style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif; background-color: rgb(255, 255, 255);">一、加载图片</span>
           

1.从URL加载图像     Picasso库使用一个实现自Picasso class的流畅接口。Picasso泪至少需要三个参数去完成一次功能性的请求:         ·with(Context context) - Context对许多Android API来说都是必须的,Picasso也不例外。         ·load(String imageUrl) - 在这里明确要加载哪个图片。大多数时候这里会是一个String类型去执行一个网络图片。         ·into(ImageView targetImageView) - 图片需要被显示在那个特定的ImageView上。     理论上的说明仍然是很难理解的,所以我们来看一个例子:

String internetUrl = "http://i.imgur.com/DvpvklR.png";
Picasso
  .with(this)
  .load(internetUrl)
  .into(imageView);
           

    只要URL指向的图片存在并且ImageView可用,几秒钟之后图片就会显示出来。为了防止图片不存在,你稍后可以看到Picasso将信息返回到错误回调(error callbacks)中。

2.从资源中加载     不同于提供一个String类型的URL,这里需要一个int类型的资源id。

int resourceId = R.mipmap.icon_head_default;
Picasso
  .with(this)
  .load(resourceId)
  .into(imageView);
           

3.从File中加载     当你需要用户选择一张照片去显示时,这种方式是非常有用的。参数仅仅是一个File对象。

Uri uri = resourceIdToUri(this,R.mipmap.icon_head_default);
Picasso
  .with(this)
  .load(uri)
  .into(imageView);
           

    下面是将resourceId转换成Uri的方法:

public static final String ANDROID_RESOURCE = "android.resource://";
public static final String FOREWARD_SLASH = "/";
private Uri resourceIdToUri(Context context, int resourceId) {
    return Uri.parse(ANDROID_RESOURCE + context.getPackageName() + FOREWARD_SLASH + resourceId);
}
           

二、适配器(ListView、GridView...) 1.ListView     首先,我们需要一些测试图片。

public static String[] eatFoodyImages = {
  "http://i.imgur.com/rFLNqWI.jpg",
  "http://i.imgur.com/C9pBVt7.jpg",
  "http://i.imgur.com/rT5vXE1.jpg",
  "http://i.imgur.com/aIy5R2k.jpg",
  "http://i.imgur.com/MoJs9pT.jpg",
  "http://i.imgur.com/S963yEM.jpg",
  "http://i.imgur.com/rLR2cyc.jpg",
  "http://i.imgur.com/SEPdUIx.jpg",
  "http://i.imgur.com/aC9OjaM.jpg",
  "http://i.imgur.com/76Jfv9b.jpg",
  "http://i.imgur.com/fUX7EIB.jpg",
  "http://i.imgur.com/syELajx.jpg",
  "http://i.imgur.com/COzBnru.jpg",
  "http://i.imgur.com/Z3QjilA.jpg",
};
           

    然后,我们需要一个activity去创建一个adapter并设置给ListView:

listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new ImageListAdapter(this,eatFoodyImages));
           

    第三,需要一个用于展示ListView中每个Item的布局:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp"/>
           

    在得到结果之前,我们需要去实现一个adapter。

private class ImageListAdapter extends ArrayAdapter {
  private Context context;
  private LayoutInflater inflater;
  private String[] imageUrls;
  public ImageListAdapter(Context context, String[] imageUrls) {
    super(context,R.layout.list_item_image,imageUrls);
    this.context = context;
    this.imageUrls = imageUrls;
    inflater = LayoutInflater.from(context);
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    if(null == convertView){
      convertView = inflater.inflate(R.layout.list_item_image,parent,false);
    }
    Picasso
      .with(context)
      .load(imageUrls[position])
      .fit()
      .into((ImageView) convertView);
    return convertView;
  }
}
           

    当你上下滚动的很快时,你会发现这些图片显示的比之前更快。于是你可以猜测,这些图片都是来自于cache并且不再从网络上加载。Picasso的cache实现的非常全面,并且对我们来说,许多事情变得更加简单了。cache的大小是基于设备磁盘的大小的。     当加载一个图片时,Picasso使用三层缓存:内存、硬盘和网络。当需要去创建一个合适的cache时,Picasso把这些复杂的操作全都隐藏起来,于是我们可以什么也不用做。当然,根据Square的设计理念,你也可以修改或重写chche组件。 2.GridView     GridView的实现方式与ListView的实现方式没有多少区别,你甚至可以使用同一个adapter,只要把布局变成GridView就可以了:

<GridView
        android:id="@+id/gistView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="2"/>
           

继续阅读