Picasso网络图片加载框架的使用

Posted 王_健

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Picasso网络图片加载框架的使用相关的知识,希望对你有一定的参考价值。

官网:http://square.github.io/picasso/


  • 介绍

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

    在ListView 或者RecycleView的适配器中的使用:

@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);
  • 图片的转换功能

    自带剪切方法:

    Picasso.with(context)
    //设置图片路径
    .load(url)
    //重新定义图片尺寸
    .resize(50, 50)
    //剪切位置设置
    .centerCrop()
    //设置装载图片的ImageView控件
    .into(imageView)

    自定义图片转换:

    //自定义转换类,在transform方法中实现具体转换逻辑
    public static 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!=null)
                source.recycle();
            
            return result;
        
    
    
        @Override
        public String key() 
            return "square()";
        
    
    
    ======================================================================================
    
    //使用方法
    Picasso.with(context).load(url).transform(new CropSquareTransformation()).into(imageView);
    
  • 设置加载失败和正在加载的图片

    Picasso.with(context)
    .load(url)
    //设置加载过程中的图片显示
    .placeholder(R.drawable.user_placeholder)
    //设置加载失败的图片显示
    .error(R.drawable.user_placeholder_error)
    .into(imageView);
  • 设置不同途径的图片资源

    //项目资源文件夹中的图片
    Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
    //指定目录下的图片资源
    Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
    //通过创建File对象设置图片
    Picasso.with(context).load(new File(...)).into(imageView3);
  • 设置自定义下载器

源码中自带的下载类,支持OkHttp的前提下会使用这个类,但是如果需要自定义磁盘缓存路径,需要执行
“public OkHttpDownloader(final File cacheDir)”构造方法。

final class Utils 
    //创建默认下载器
    static Downloader createDefaultDownloader(Context context) 
        try 
          //检查是否存在OKhttp,不存在就使用 UrlConnectionDownloader
          Class.forName("com.squareup.okhttp.OkHttpClient");
          return OkHttpLoaderCreator.create(context);
         catch (ClassNotFoundException ignored) 
        
        return new UrlConnectionDownloader(context);
      
        //创建默认缓存路径
      static File createDefaultCacheDir(Context context) 
        File cache = new File(context.getApplicationContext().getCacheDir(), PICASSO_CACHE);
        if (!cache.exists()) 
          //noinspection ResultOfMethodCallIgnored
          cache.mkdirs();
        
        return cache;
      

==========================================================================
public class OkHttpDownloader implements Downloader 

     ...

  public OkHttpDownloader(final File cacheDir) 
    this(cacheDir, Utils.calculateDiskCacheSize(cacheDir));
  


  public OkHttpDownloader(final Context context, final long maxSize) 
    this(Utils.createDefaultCacheDir(context), maxSize);
  

  public OkHttpDownloader(final File cacheDir, final long maxSize) 
    this(defaultOkHttpClient());
    try 
      client.setCache(new com.squareup.okhttp.Cache(cacheDir, maxSize));
     catch (IOException ignored) 
    
  

用法:

Picasso.setSingletonInstance(new Picasso
                .downloader(new OkHttpDownloader("自定义目录,返回File"))
                .build());

Picasso获取缓存默认通过Okhttp获取,而Okhttp使用的缓存是基于DiskLruCache,DiskLruCache的实现原理比较晕,通过读写journal文件来对缓存文件进行操作的,所以在设置了自定义目录下,就可以通过DiskLruCache来进行获取和清理缓存了。

  • 对内存缓存的操作

Picasso.with(context)
    .load(url)
    //缓存方案,NO_CACHE 直接从网络获取,NO_STORE 不缓存在 Cache中(内存)
    .memoryPolicy(NO_CACHE, NO_STORE)
    .into(imageView);
  • 暂停、继续加载操作

    在ListView 和 RecycleView滑动时为了避免卡顿,可以暂停请求,当控件停止滑动时继续加载:

  listView.setOnScrollListener(new AbsListView.OnScrollListener() 
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) 
                switch (scrollState)
                    case  AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                        Picasso.with(MainActivity.this).resumeTag(tag);
                        break;
                    default:
                        Picasso.with(MainActivity.this).pauseTag(tag);
                        break;
                
            

          ....
        );
    

以上是关于Picasso网络图片加载框架的使用的主要内容,如果未能解决你的问题,请参考以下文章

图片加载框架Picasso解析

Android图片加载框架Picasso最全使用教程 二

Android常用网络图片加载框架示例

转载一行代码加载网络图片到ImageView——Android Picasso

Android 网络图片加载缓存处理库ImageLoader和Picasso

Android图片加载框架Picasso最全使用教程 三