Android编程android技术专栏

Picasso 使用详解及简单解析

2017-06-16  本文已影响75人  木木仨儿

Picasso 是什么

官方介绍:A powerful image downloading and caching library for Android. 简单来说就是针对安卓平台的一个非常牛逼的图片加载库。
官网地址

Picasso 使用

显示网络图片到ImageView上

极致简单
布局文件中声明ImageView控件

 <ImageView
        android:id="@+id/iv_img"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"/>

代码中加载图片(添加网络权限)

Picasso.with(context).load("http://192.168.X.XXX:8080/http/girl.jpg").into(imageView);

此时运行,如果网络正常应该就能看到显示出来的图片了

添加加载过渡图片

Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .into(imageView);

在加载完成前会先展示占位图片

加载失败显示图片

 Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .into(imageView);

加载失败显示设置的错误图片

改变图片大小

两张照片,大小分别设置为[300,300]和[600,600]

Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .resize(300, 300)
                .centerCrop()
                .into(imageView);

        Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .resize(600, 600)
                .centerCrop()
                .into(imageView2);

注:resize的单位为px,如果想要使用dp单位指定大小,使用另外的方法:resizeDimen

resizeDimen 方法需要注意必须通过引用方式,如果直接指定大小会出错
img[5]

正确使用方式:

Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .resizeDimen(R.dimen.img_width_150, R.dimen.img_height_150)
                .centerCrop()
                .into(imageView);

        Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .resizeDimen(R.dimen.img_width_300, R.dimen.img_height_300)
                .centerCrop()
                .into(imageView2);

fit() 方法不能和resize()同时使用

图片旋转

   Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .rotate(90)
                .into(imageView);

缓存策略

  Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE)
                .into(imageView);

图片转换

transform()

需要自己实现,完成对图片的二次处理
比如需要显示为圆形头像:

 Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .transform(new Transformation() {
                    @Override
                    public Bitmap transform(Bitmap source) {
                        int width = source.getWidth();
                        int height = source.getHeight();
                        int size = Math.min(width, height);
                        Bitmap blankBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                        Canvas canvas = new Canvas(blankBitmap);
                        Paint paint = new Paint();
                        paint.setAntiAlias(true);
                        canvas.drawCircle(size / 2, size / 2, size / 2, paint);
                        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
                        canvas.drawBitmap(source, 0, 0, paint);
                        if (source != null && !source.isRecycled()) {
                            source.recycle();
                        }
                        return blankBitmap;
                    }

                    @Override
                    public String key() {
                        return "girl";
                    }
                })
                .into(imageView);

开启指示器

通过开启指示器,显示这个图片是从内存加载来的还是从SD卡加载来的还是从网络加载来的。开启后会在图片左上角显示一个三角形图案。

  Picasso picasso = Picasso.with(this);
        picasso.setIndicatorsEnabled(true);
        picasso
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .into(imageView);

有三种颜色

添加监听器

Picasso.with(this)
                .load("http://192.168.X.XXX:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .into(imageView, new com.squareup.picasso.Callback() {
                    @Override
                    public void onSuccess() {

                    }

                    @Override
                    public void onError() {

                    }
                });

停止加载、恢复加载

在列表滑动时可以停止加载,列表滑动结束恢复加载

        Object tag = new Object();
        Picasso picasso = Picasso.with(this);
        picasso.pauseTag(tag);//暂停加载
        picasso.resumeTag(tag);//回复加载

取消加载

     Picasso picasso = Picasso.with(this);
        Picasso.with(this)
                .load("http://192.168.9.232:8080/http/girl.jpg")
                .placeholder(R.mipmap.boy)
                .error(R.mipmap.err)
                .into(imageView);

        picasso.cancelRequest(imageView);//取消加载

如果没有取消显示正常加载图片,如果加上取消下载代码,则显示错误图片

Picasso 缓存简单分析

Picasso 内部访问网络,下载图片使用 createDefaultDownloader()方法来创建下载器,默认使用okhttp,如果当前项目没有找到okhttp包,则使用HttpURlConnection.

源代码:

static Downloader createDefaultDownloader(Context context) {
        try {
            Class.forName("com.squareup.okhttp.OkHttpClient");
            return Utils.OkHttpLoaderCreator.create(context);
        } catch (ClassNotFoundException var2) {
            return new UrlConnectionDownloader(context);
        }
    }

Picasso没有指定缓存文件地址的接口,所以下载到本地的缓存文件地址默认是okhttp等的配置。
源代码:

static File createDefaultCacheDir(Context context) {
        File cache = new File(context.getApplicationContext().getCacheDir(), "picasso-cache");
        if(!cache.exists()) {
            cache.mkdirs();
        }

        return cache;
    }

可以看到是默认保存在内部缓存中,去相应目录下查找可以看到两个文件,分别以.0和.1结尾。

其中以.0结尾的文件是网络通信信息,可以改后缀名为.txt查看,以.1结尾的文件就是下载缓存的图片信息,可以更改后缀名为.jpg或.png查看。

那么如果想要更改下载文件的缓存地址呢?需要自己定义一个下载器:

Picasso picasso = new Picasso.Builder(this)
                .downloader(new OkHttp3Downloader(this.getExternalCacheDir()))
                .build();

这个下载器可以直接使用大神JakeWharton写的:picasso2-okhttp3-downloader

初步使用总结至此,不定期更新~~~

欢迎访问 博客 查看更多文章。

上一篇下一篇

猜你喜欢

热点阅读