Picasso 使用详解及简单解析

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]

  • resize
  • resizeDimen
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);
  • MemoryPolicy.NO_CACHE 去掉内存缓存
  • MemoryPolicy.NO_STORE 去掉硬盘缓存

图片转换

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);

有三种颜色

  • 红 网络
  • 蓝 SD卡
  • 绿 内存

添加监听器

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容