Gilde 和 Picasso 使用筆記


開坑,想想一個(gè) ImageView 從看到控件到顯示完圖片會(huì)經(jīng)歷哪些過程?

1.顯示默認(rèn)圖片

即圖片在加載前顯示的樣子,有的 App 就會(huì)做到圖片上有個(gè)轉(zhuǎn)圈的動(dòng)畫效果、或者進(jìn)度條

2.顯示圖片

這是最基本的功能

3.網(wǎng)絡(luò)錯(cuò)誤顯示

在圖片地址錯(cuò)誤,或者網(wǎng)絡(luò)不好導(dǎo)致圖片加載失敗顯示的圖片

4.緩存圖片

圖片緩存節(jié)省流量避免多次加載

5.顯示壓縮圖片/原圖

有些原圖太大,實(shí)際并不需要顯示這么大分辨率的圖片,因此需要進(jìn)行壓縮

有些圖片則為了需要看清,即使很大也要顯示原圖或接近原圖效果

目前項(xiàng)目中我使用了 Picasso 來對(duì)圖片進(jìn)行處理,現(xiàn)在我打算使用 Glide 來解決以上的幾個(gè)問題,Glide 的使用方法在網(wǎng)上也都非常多,在這里給自己一個(gè)使用總結(jié)

Glide 一般使用方法:

Glide.with(context)
.load(url)
.placeholder(R.drawable.loading) //占位符,顯示默認(rèn)圖片
.error(R.drawable.error)//顯示加載錯(cuò)誤的圖片
.override(100,100)//自定義剪裁圖片大小
.into(imageView);

Picasso 一般使用方法:

Picasso.with(context)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.resize(100, 100)//自定義剪裁圖片大小
.centerCrop().into(img);
Glide 和 Picasso 的常用的方法和問題:
  • Glide 可以直接載入 GIF 動(dòng)畫,Picasso 不行。

  • Glide 占用的內(nèi)存比 Picasso 高。

  • Picasso 2.5.2 在加載比較大的圖片時(shí),會(huì)顯示空白。我在 vivo 手機(jī)上拍照返回就會(huì)出現(xiàn)這個(gè)問題,一張照片大概 4-5 M 左右。在 GitHub 上看到的解決辦法是使用 Picasso 2.4 版本。

  • Glide 可以使用 CenterCrop() 和 fitCenter() 來剪裁圖片;
    Picasso 可以使用 fit() 方法來讓圖片的寬高自適應(yīng) imageView ,前提是你的 imageView 控件不能設(shè)置成 wrap_content 。如果使用了 fit 方法,那么就不能調(diào)用 resize。

  • Glide 可以使用 .priority(Priority.HIGH) 方法來控制多個(gè)圖片加載的優(yōu)先度。

  • 加載成功的回調(diào)

Picasso.with(this)
.load(url)
.into(iv, new Callback() {
     @Override
    public void onSuccess() {
    Toast.makeText(MainActivity.this, "加載成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError() {
    Toast.makeText(MainActivity.this, "加載失敗", Toast.LENGTH_SHORT).show();
    }
});

Glide.with(this)
.load(url)
.into(new GlideDrawableImageViewTarget(iv) {
    @Override
    public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable>animation) {
      super.onResourceReady(resource, animation);
        Toast.makeText(MainActivity.this, "加載成功", Toast.LENGTH_SHORT).show();
       }
    }
);
  • Glide 的 GlideDrawableImageViewTarget 里還有很多其他狀態(tài)的方法,一看便知其作用
GlideDrawableImageViewTarget
  • 獲取加載后的 Bitmap 圖片
Glide.with(this)
.load(file)
.asBitmap()//加載或使用有關(guān) Bitmap 圖片的時(shí)候需要加上
.into(new BitmapImageViewTarget(iv) {
    @Override
    public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
        super.onResourceReady(bitmap, anim);
        iv.setImageBitmap(bitmap);
        }
});

Picasso有兩種方法,.get() 和 Target

    /**
     * 注意 get() 方法不能再主線程使用,會(huì)拋出異常:
     * java.lang.IllegalStateException: Method call should not happen from the main thread.
     */
        Bitmap bitmap = Picasso.with(MainActivity.this)
                .load(url)
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher)
                .get();

    //使用 Target 時(shí),最好不要使用匿名內(nèi)部類,因?yàn)?Picasso 可能在加載完成前就把 Bitmap 給回收了;
        Picasso.with(this)
                .load(file)
                .placeholder(R.mipmap.ic_launcher)
                .error(R.mipmap.ic_launcher)
                .into(target);

    private com.squareup.picasso.Target target = new com.squareup.picasso.Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            //加載成功后會(huì)得到一個(gè)bitmap,可以自定義操作
            iv.setImageBitmap(bitmap);
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            // 加載失敗進(jìn)行相應(yīng)處理
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            
        }
    };

待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容