Picasso 使用詳解及簡(jiǎn)單解析

Picasso 是什么

官方介紹:A powerful image downloading and caching library for Android. 簡(jiǎn)單來說就是針對(duì)安卓平臺(tái)的一個(gè)非常牛逼的圖片加載庫(kù)瘸味。
官網(wǎng)地址

Picasso 使用

顯示網(wǎng)絡(luò)圖片到ImageView上

極致簡(jiǎn)單
布局文件中聲明ImageView控件

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

代碼中加載圖片(添加網(wǎng)絡(luò)權(quán)限)

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

此時(shí)運(yùn)行,如果網(wǎng)絡(luò)正常應(yīng)該就能看到顯示出來的圖片了

添加加載過渡圖片

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

在加載完成前會(huì)先展示占位圖片

加載失敗顯示圖片

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

加載失敗顯示設(shè)置的錯(cuò)誤圖片

改變圖片大小

兩張照片槐瑞,大小分別設(shè)置為[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 方法需要注意必須通過引用方式惑淳,如果直接指定大小會(huì)出錯(cuò)
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()同時(shí)使用

圖片旋轉(zhuǎn)

   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 去掉內(nèi)存緩存
  • MemoryPolicy.NO_STORE 去掉硬盤緩存

圖片轉(zhuǎn)換

transform()

需要自己實(shí)現(xiàn)咳蔚,完成對(duì)圖片的二次處理
比如需要顯示為圓形頭像:

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

開啟指示器

通過開啟指示器刃滓,顯示這個(gè)圖片是從內(nèi)存加載來的還是從SD卡加載來的還是從網(wǎng)絡(luò)加載來的狂票。開啟后會(huì)在圖片左上角顯示一個(gè)三角形圖案。

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

有三種顏色

  • 紅 網(wǎng)絡(luò)
  • 藍(lán) SD卡
  • 綠 內(nèi)存

添加監(jiān)聽器

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() {

                    }
                });

停止加載蚊锹、恢復(fù)加載

在列表滑動(dòng)時(shí)可以停止加載瞳筏,列表滑動(dòng)結(jié)束恢復(fù)加載

        Object tag = new Object();
        Picasso picasso = Picasso.with(this);
        picasso.pauseTag(tag);//暫停加載
        picasso.resumeTag(tag);//回復(fù)加載

取消加載

     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);//取消加載

如果沒有取消顯示正常加載圖片,如果加上取消下載代碼枫耳,則顯示錯(cuò)誤圖片

Picasso 緩存簡(jiǎn)單分析

Picasso 內(nèi)部訪問網(wǎng)絡(luò)乏矾,下載圖片使用 createDefaultDownloader()方法來創(chuàng)建下載器孟抗,默認(rèn)使用okhttp,如果當(dāng)前項(xiàng)目沒有找到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沒有指定緩存文件地址的接口,所以下載到本地的緩存文件地址默認(rèn)是okhttp等的配置凄硼。
源代碼:

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

        return cache;
    }

可以看到是默認(rèn)保存在內(nèi)部緩存中铅协,去相應(yīng)目錄下查找可以看到兩個(gè)文件,分別以.0和.1結(jié)尾摊沉。

其中以.0結(jié)尾的文件是網(wǎng)絡(luò)通信信息狐史,可以改后綴名為.txt查看,以.1結(jié)尾的文件就是下載緩存的圖片信息说墨,可以更改后綴名為.jpg或.png查看骏全。

那么如果想要更改下載文件的緩存地址呢?需要自己定義一個(gè)下載器:

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

這個(gè)下載器可以直接使用大神JakeWharton寫的:picasso2-okhttp3-downloader

初步使用總結(jié)至此尼斧,不定期更新~~~

歡迎訪問 博客 查看更多文章姜贡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棺棵,隨后出現(xiàn)的幾起案子楼咳,更是在濱河造成了極大的恐慌,老刑警劉巖烛恤,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件母怜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缚柏,警方通過查閱死者的電腦和手機(jī)苹熏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轨域,你說我怎么就攤上這事缕陕。” “怎么了疙挺?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵扛邑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我铐然,道長(zhǎng)蔬崩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任搀暑,我火速辦了婚禮沥阳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘自点。我一直安慰自己桐罕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布桂敛。 她就那樣靜靜地躺著功炮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪术唬。 梳的紋絲不亂的頭發(fā)上薪伏,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音粗仓,去河邊找鬼嫁怀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛借浊,可吹牛的內(nèi)容都是我干的塘淑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚂斤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼存捺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橡淆,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤召噩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逸爵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體具滴,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年师倔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了构韵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疲恢,靈堂內(nèi)的尸體忽然破棺而出凶朗,到底是詐尸還是另有隱情,我是刑警寧澤显拳,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布棚愤,位于F島的核電站,受9級(jí)特大地震影響杂数,放射性物質(zhì)發(fā)生泄漏宛畦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一揍移、第九天 我趴在偏房一處隱蔽的房頂上張望次和。 院中可真熱鬧,春花似錦那伐、人聲如沸踏施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畅形。三九已至,卻和暖如春燃少,著一層夾襖步出監(jiān)牢的瞬間束亏,已是汗流浹背铃在。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工阵具, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人定铜。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓阳液,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親揣炕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帘皿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容