在平時開發中,常需要從網絡上獲取圖片到本地保存或顯示,在初學Android時,第一次接觸到這個技術是從請求網絡開始,然后把圖片以流的形式保存到Bitmap對象中進行顯示。 然而上述過程太過繁瑣,還要編寫代碼處理圖片緩存等操作,最近在做項目的過程中就接觸到了一種簡單而優雅的圖片加載框架,只需以下一行代碼便可加載圖片。
Picasso.with(context).load(url).into(imageView);通過查看然后你就可以盡情享受Picasso給你帶來的輕松愉快的編碼感受。
除上述最簡單的使用方法之外,Picasso還提供了更多強大的功能, 例如圖片裁剪:
Picasso.with( imageView.getContext() ).load(url).resize(width,height).centerCrop().into(imageView);**Picasso可以設置占位圖片:指的是圖片未正常顯示時所顯示的圖片 也可以設置顯示錯誤時的圖片**
Picasso.with(context).load(url).placeholder(R.drawable.placeholder).error(R.drawable.error).into(imageView);另外Picasso提供了以下的方法用于設置圖片加載的優先級
public RequestCreator PRiority(Priority priority) { this.data.priority(priority); return this; }其中參數可傳Picasso.Priority.HIGH,Picasso.Priority.NORMAL,Picasso.Priority.LOW 設置優先級加載的步驟為:
Picasso.with(context) .load(url) .priority(Picasso.Priority.NORMAL) .into(imageView);設置了優先級的圖片并不保證一定會優先加載,只能說傾向于優先加載。
在開發中,我們也經常遇到所加載的圖片進行了拉伸,這是我們所不愿意看到的,那么怎么做才能讓我們的圖片根據屏幕寬度進行等比例縮放呢? 傳統的設置方法往往比較復雜,但是用Picasso框架省略了一系列操作,只要調用Picasso的transform方法,傳入Transformation對象即可,我們需要對Transformation可進行以下操作: 新建一個類實現Transformaotion接口
public class PicassoTransformation implements it.sephiroth.android.library.picasso.Transformation { int screenWidth; double targetWidth; /** * @param view 為了得到contenxt對象獲得屏幕寬度 * @param aver 根據屏幕寬度進行的等分 */ public PicassoTransformation(View view, int aver){ WindowManager wm = (WindowManager) view.getContext().getSystemService(Context.WINDOW_SERVICE); DisplayMetrics displayMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(displayMetrics); //獲得屏幕寬度 screenWidth = displayMetrics.widthPixels; targetWidth = screenWidth/aver; } @Override public Bitmap transform(Bitmap bitmap) { if (bitmap.getWidth() == 0 || bitmap.getHeight() == 0) { return bitmap; } //得到圖片寬高比,每個參數必須強轉成double型 double ratio = (double) bitmap.getWidth() / (double) bitmap.getHeight(); Bitmap bitmapResult=null; if(bitmap!=null){ bitmapResult = Bitmap.createScaledBitmap(bitmap, (int) (targetWidth+0.5), (int) ((targetWidth / ratio)+0.5), false); } if (bitmap != bitmapResult) { bitmap.recycle(); } return bitmapResult; } @Override public String key() { return "transformation" + screenWidth ; }}其中需要重寫其兩個方法: public Bitmap transform(Bitmap bitmap){} public String key(){}
在transform方法中,我們需要先判斷其bitmap對象的寬度或高度是否等于0,若是,則直接返回bitmap對象。 獲得bitmap的寬高比的同時,要特別注意寬度和高度要先強轉成double型,因為bitmap默認的寬度和高度為int型,兩個int型的數直接相除為int型,這時候再轉成double型數據精度會丟失。我就在做項目的時候犯了這個錯,結果調用這段代碼程序就出現閃退。
在完成Transformation類的編寫之后,我們就可以使用其對象使圖片根據屏幕寬度進行等比例縮放了。
Transformation transformation = new PicassoTransformation(view, aver);Picasso.with(view.getContext()).load(url) .transform(transformation) .into(imageview);看完上述代碼是不是覺得Picasso這個框架既簡單又好用呢,不用回答,我就是這么認為的。
這里傳一張我在項目中使用Picasso加載網絡圖片進行等比例縮放的截圖:
新聞熱點
疑難解答