最近在項目中用到了大量圖片加載,第三方優秀框架還不錯,下面介紹三款榜首的框架用法和問題,做一個記錄。
現在項目使用的是Android Studio開發的,現在也沒有多少人使用Eclipse了吧。
一、Picasso
1,首先在項目中引入picasso(以gradle為例),也就是app的build.gradle
compile 'com.squareup.picasso:picasso:2.5.2'
2,加載圖片,通過源碼可以發現load方法主要要以下幾種重載
load(Uri uri)
load(String path)
load(File file)
load(int resourceId)
最常使用的應該就是網絡加載圖片,網絡請求完數據之后存到List數組中
Picasso.with(AppApplication.getmContext())//上下文 .load(list.get(i).getPath_vertical_s())//加載的地址 .resize(94, 131)//設置顯示的圖片大小 .placeholder(R.mipmap.ic_launcher)//圖片較大加載慢時顯示的圖片 .error(R.mipmap.birth)//加載錯誤時的圖片 .into(holder.iv_movie_abouttoshow_moviephoto);//指定顯示圖片的控件
Picasso的緩存機制:
Picasso的緩存流程是先檢查內存是否有保存該圖片,如果沒有則檢查磁盤是否有保存該圖片,如果沒有則從網絡下載,下載成功之后分別保存到內存和磁盤上各一份,如果我們有時候不想緩存該圖片或者不想從緩存獲取圖片,該如何呢?Picasso也給我買提供了相應的控制方法。
.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
代碼含義:該方法表示跳過從磁盤加載圖片,並且圖片下載之后也不在磁盤中進行緩存。
參數介紹:
MemoryPolicy.NO_CACHE:直接跳過檢查內存是否有緩存該圖片
MemoryPolicy.NO_STORE:圖片下載之后不在內存中進行緩存
這里注意只是不在磁盤中緩存,但是會在內存中緩存,因此若內存和磁盤中都不想緩存則需要和 兩個方法共同使用,如下:
.networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)
.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
NetworkPolicy枚舉中還有一個值OFFLINE,這個表示強制從緩存中取,不會發起網絡請求,如 果緩存中沒有也不會從網絡中請求
3、問題
使用Picasso時(另外兩個框架也一樣),記得有一次使用的死數據,圖片地址批量復制的,復制的時候多操作了一個空格,結果就一直沒顯示,這也是個坑填一下。
二、Glide
Glide和Picasso其實挺相似的,不管是從使用方法還是從出身
1,還是和Picasso一樣添加依賴
compile 'com.github.bumptech.glide:glide:3.7.0'
2,加載圖片
//1.網絡加載圖片到ImageView中,注意這里的大小設置方法和Picasso是有區別的 Glide.with(context).load(imageUrl).override(94,131).into(imageView); //2.當加載網絡圖片時,由於加載過程中圖片未能及時顯示,此時可能需要設置等待時的圖片,通過placeHolder()方法 Glide.with(context).load(imageUrl).placeholder(R.mipmap.ic_launcher).into(imageView); //3.當加載圖片失敗時,通過error(Drawable drawable)方法設置加載失敗后的圖片顯示: Glide.with(context).load(imageUrl).error(R.mipmap.ic_launcher).into(imageView); //4.顯示gif動畫,asGif()判斷是否是gif動畫 Glide.with(context).load(imageUrl).asGif().into(imageView); //5.顯示本地視頻 String filePath = "/storage/emulated/0/demo/***.mp4"; Glide.with( context ).load( Uri.fromFile( new File( filePath ) ) ).into(video ); //6.緩存策略 Glide.with( context ).load(imageUrl).skipMemoryCache(true).into(imageViewInternet );//跳過內存緩存 Glide.with( context ).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into( imageViewInternet );//跳過硬盤緩存
三、Fresco
Fresco使用和其他兩個有些區別,因為這里要使用的不是ImageView了而是他自己的圖片顯示控件
代碼上:
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/iv_movie_abouttoshow_moviephoto" android:layout_width="93dp" android:layout_height="121dp" app:placeholderImage="@mipmap/ic_launcher" />
//其他的屬性設置
fresco:fadeDuration="300" // 淡入淡出的持續時間
fresco:actualImageScaleType="focusCrop" // 實際圖像的縮放類型
fresco:placeholderImage="@color/wait_color" //占位圖
fresco:placeholderImageScaleType="fitCenter" //占位圖的縮放類型
fresco:failureImage="@drawable/error" //下載失敗顯示的圖片
fresco:failureImageScaleType="centerInside" //失敗圖的縮放類型
fresco:retryImage="@drawable/retrying"
//圖片加載失敗時顯示,提示用戶點擊重新加載,重復加載4次還是沒有加載出來的時候才會顯示failureImage的圖片
fresco:retryImageScaleType="centerCrop" //重新加載的圖片縮放類型
fresco:progressBarImage="@drawable/progress_bar" //進度條圖片
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="1000"
//進度圖自動旋轉間隔時間(單位:毫秒ms)
fresco:backgroundImage="@color/blue"
//背景圖片,這里的背景圖片首先被繪制
fresco:overlayImage="@drawable/watermark"
// 設置疊加圖,在xml中只能設置一張疊加圖片,如果需要多張圖片的話,需要在java代碼中設置哦
fresco:pressedStateOverlayImage="@color/red"
// 設置點擊狀態下的疊加圖
fresco:roundAsCircle="false" //設置為圓形圖
fresco:roundedCornerRadius="1dp" // 圓角半徑
fresco:roundTopLeft="true" // 左上角是否為圓角
fresco:roundTopRight="false"
fresco:roundBottomLeft="false"
fresco:roundBottomRight="true"
fresco:roundWithOverlayColor="@color/corner_color"
fresco:roundingBorderWidth="2dp" //邊框的寬度
fresco:roundingBorderColor="@color/border_color" //邊框顏色
如果你多次用了Fresco,建議在 Application 初始化,如果只是寫着玩,就在應用調用 setContentView() 之前,進行初始化:
AppApplication
Fresco.initialize(mContext);
加載圖片
Uri uri = Uri.parse(list.get(i).getPath_vertical_s()); sdv.setImageURI(uri) DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(uri) .setAutoPlayAnimations(true) .build(); sdv.setController(controller);
以上就是三種框架的使用方法,此隨筆當作學習筆記記錄一下。