Android開發三種第三方圖片加載的框架


最近在項目中用到了大量圖片加載,第三方優秀框架還不錯,下面介紹三款榜首的框架用法和問題,做一個記錄。

現在項目使用的是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);

以上就是三種框架的使用方法,此隨筆當作學習筆記記錄一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM