Picasso图片加载器的简单使用

Picasso是Square公司开源的一个Android图形缓存库。可以实现图片下载和缓存功能。

Picasso功能强大,官方给出如下特性描述:
-图片回收,以及adapter的图片加载。
-用最小的内存去处理复杂的图片转换。
-可以自动的设置内存和本地缓存。

下面我们学习一下Picasso的基本使用:

1.在grade中添加依赖

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

2.加载图片

官方只给出了一句话

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

使用Picasso做到这点真的是太便捷了
一句话解决

3.load方法

对于load方法存在以下几种重载,方便于网络资源和本地资源的加载
load(Uri uri)
load(String path)
load(File file)
load(int resourceId)

4.占位符placeholder和error

加载过程中显示默认的图片placeholder

Picasso.with(this).load(imageUrl).placeholder(R.mipmap.default_image).into(imageView);

加载失败后显示默认的错误图片error

Picasso.with(this).load(errorimageUrl).error(R.mipmap.default_image).into(imageView);

5.设置图片填充方式

5.1fit()方法

Picasso.with(this).load(imageUrl).fit().into(imageView);

填充法,会让图片充满整个imageview,不考虑比例,可能造成图片的拉伸或者缩小(控件不能设置成wrap_content,也就是必须有大小才行,fit()才让图片的宽高等于控件的宽高)
充满了
5.2centerCrop()方法

Picasso.with(this).load(imageUrl).resize(520, 520).centerCrop().into(imageView);

裁剪法,需要和resize配合,以适应布局大小并减少内存占用
裁小了
上述两个比较常用,此外还有centerInside()、onlyScaleDown()等方法

官网还提供了一个自定义转换方式的样式,这意味着我们可以按需进行图片的转换处理

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()"; }
}

这样调用时将对象传递给transform方法就行

 .transform(new CropSquareTransformation())  

6.旋转图片

Picasso.with(this).load(imageUrl).rotate(45).into(imageView);

以默认参照点(0,0)为中心顺时针旋转45度
旋转

Picasso.with(this).load(imageUrl).rotate(45, 60, 60).into(imageView);

以(60,60)为中心顺时针旋转45度

7.缓存策略(调试模式)

Picasso.with(this).setIndicatorsEnabled(true);

加上这句话之后图片左上角会有一个三角形,蓝色表示图片从磁盘中加载,红色表示从网络,绿色表示从内存。
图片左上角有个蓝色三角形

默认的缓存流程是先检查内存是否有保存该图片,没有则检查磁盘是否有保存该图片,再没有则从网络下载,下载成功之后分别保存到内存和磁盘上各一份。

那比如我们不想让图片被保存到内存或者磁盘中该怎么办呢

Picasso.with(this).load(imageUrl).memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE).into(imageView);

MemoryPolicy.NO_CACHE:直接跳过检查内存是否有缓存该图片
MemoryPolicy.NO_STORE:图片下载之后不在内存中进行缓存

同理,类似的

Picasso.with(this).load(imageUrl).networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE).into(imageView);

上述两个方法一起使用可以实现内存和磁盘都不缓存的效果

8.优先级设置

Picasso提供了三种优先级以供调度
LOW,
NORMAL,
HIGH

Picasso.with(this).load(imageUrl).priority(Picasso.Priority.HIGH).into(imageView);

这样优先级就是高的

9.tag的使用

Picasso提供了三种方法对设置了tag的图片进行控制
cancelTag(Object tag)暂停标记
pauseTag(Object tag)可见标记
resumeTag(Object tag)取消标记

先设置标签

Picasso.with(this).load(imageUrl).tag("chen").into(imageView);

然后实现滑动监听

@Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {
    final Picasso picasso = Picasso.with(context);

    if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_TOUCH_SCROLL) {
          picasso.resumeTag("chen");
    } else {
          picasso.pauseTag("chen");
    }
  }

这样当用户快速滑动界面时,item在被复用的时候请求是停止的,而不是不断地发送请求和取消请求

基本功能使用介绍到此

下面展示一个综合应用小案例

首先附上效果
这里写图片描述

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:orientation="vertical"
    tools:context="com.example.i.picassodemo.MainActivity">
    <GridView
        android:id="@+id/gview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="3"
        android:columnWidth="130dp"

        >
    </GridView>
</LinearLayout>

gridview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

        <ImageView
            android:id="@+id/item_pic"
            android:layout_width="130dp"
            android:layout_height="130dp"
            />

</LinearLayout>

MainActivity.java

package com.example.i.picassodemo;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.squareup.picasso.MemoryPolicy;
import com.squareup.picasso.NetworkPolicy;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private GridView gview;
    private List<Pic> list_pic;
    private myAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gview = (GridView)findViewById(R.id.gview);
        list_pic = new ArrayList<>();
        myAdapter = new myAdapter(list_pic,this);
        gview.setAdapter(myAdapter);
        for(int i=0;i<imageids.length;i++){
            list_pic.add(new Pic(imageids[i]));
        }

    }

    private int[] imageids = {R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e,
                                 R.drawable.f,R.drawable.g,R.drawable.h,R.drawable.i,R.drawable.j,
                                 R.drawable.k,R.drawable.l,R.drawable.m,R.drawable.n,R.drawable.o,
                                 R.drawable.p,R.drawable.q,R.drawable.r,R.drawable.s,R.drawable.t,
                                 R.drawable.u,R.drawable.v,R.drawable.w,R.drawable.x,R.drawable.y,
                                 R.drawable.z,R.drawable.aa,R.drawable.bb,R.drawable.cc,R.drawable.dd};

}

myAdapter.java

package com.example.i.picassodemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.List;

import static com.squareup.picasso.MemoryPolicy.NO_CACHE;
import static com.squareup.picasso.MemoryPolicy.NO_STORE;

public class myAdapter extends BaseAdapter {
    private List<Pic> list_pic;
    private LayoutInflater inflater;
    private Context context;
    class ItemPics
    {
        TextView picname;
        ImageView pic;
    }
    public myAdapter(List<Pic> list_pic, Context context) {
        this.list_pic = list_pic;
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return list_pic.size();
    }

    @Override
    public Object getItem(int position) {
        return list_pic.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ItemPics ip;
        if (convertView == null) {
            ip = new ItemPics();
            convertView = inflater.inflate(R.layout.lv_item, null);
            ip.pic = (ImageView) convertView.findViewById(R.id.item_pic);

            convertView.setTag(ip);
        } else {
            ip = (ItemPics) convertView.getTag();
        }
        Picasso.with(context).load(list_pic.get(position).getPicUrl()).fit()
                .placeholder(R.drawable.placeholder)
                .error(R.drawable.error)
                .memoryPolicy(NO_CACHE, NO_STORE)
                .rotate(20, 60, 60)
                .into(ip.pic);

        return convertView;
    }
}

Pic.java

package com.example.i.picassodemo;


public class Pic {
    private int picUrl;

    public Pic() {
    }

    public Pic(int picUrl) {
        this.picUrl = picUrl;
    }

    public int getPicUrl() {
        return picUrl;
    }

    public void setPicUrl(int picUrl) {
        this.picUrl = picUrl;
    }
}

最后附上
我的demo源码
Picasso官方GitHub源码
Picasso官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值