fresco使用筆記

關於 Fresco

Fresco 是一個強大的圖片加載組件。

Fresco 中設計有一個叫做 image pipeline 的模塊。它負責從網絡,從本地文件系統,本地資源加載圖片。爲了最大限度節省空間和CPU時間,它含有3級緩存設計(2級內存,1級文件)。

Fresco 中設計有一個叫做 Drawees 模塊,方便地顯示loading圖,當圖片不再顯示在屏幕上時,及時地釋放內存和空間佔用。

Fresco 支持 Android2.3(API level 9) 及其以上系統。

fresco中文API 


配置


fresco是facebook推出的一款強大的android圖片處理庫, github地址:https://github.com/facebook/fresco 裏面有官方的使用配置文檔,而且是中文的。

因爲本人是在AndroidStudio上面進行項目開發,在此工具內配置方法是在app 的build.gradle文件中添加如下代碼
dependencies{
compile'com.facebook.fresco:fresco:0.5.0+'
}
官方文檔已經說fresco的類庫發佈到了Maven中央庫,所以我們只需添加上面的代碼再同步編譯即可,如果無效,請在project的build.gradle文件中添加以下紅色代碼:
allprojects {
    repositories {
        jcenter()
        mavenCentral()
         }
    }
這樣你就可以在你項目中使用fresco。
現在來說說最簡單的使用:就是加載網絡圖片,
第一:在你的application類onCreate方法中添加
Fresco.initialize(instance);
第二:fresco是通過控件來實現它內部的優化緩存處理,我們使用的時候是通過控件來使用,具體如下
<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/user_avator"
    android:layout_width="50dp"
    android:layout_height="50dp"
    fresco:roundAsCircle="true"
    fresco:roundedCornerRadius="180dp"
    fresco:actualImageScaleType="focusCrop"
    android:layout_centerVertical="true" />
大家可能看到,屬性中存在fresco:開頭的聲明。這個是fresco的自定義屬性,如果我們需要使用其自定義屬性,必須在我們的xml根佈局中添加聲明/命名空間,下圖紅色部分
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
第三:在代碼中具體的使用
Uri uri = Uri.parse(http://b.hiphotos.baidu.com/image/pic/item/e78.jpg);
mAvatorImg.setImageURI(uri);


現在介紹一些fresco的屬性,通過這些屬性我們可以很方便的定製一些效果

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/my_image_view"
    android:layout_width="20dp"   // 不支持wrap_content 如果要設置寬高比, 需要在Java代碼中指定setAspectRatio(1.33f);
    android:layout_height="20dp"    // 不支持wrap_content 
    fresco:fadeDuration="300"
    fresco:actualImageScaleType="focusCrop" // 設置圖片縮放. 通常使用focusCrop,該屬性值會通過算法把人頭像放在中間
    fresco:placeholderImage="@color/wait_color" // 下載成功之前顯示的圖片
    fresco:placeholderImageScaleType="fitCenter" 
    fresco:failureImage="@drawable/error"// 加載失敗的時候顯示的圖片
    fresco:failureImageScaleType="centerInside"
    fresco:retryImage="@drawable/retrying"// 加載失敗,提示用戶點擊重新加載的圖片(會覆蓋failureImage的圖片)
    fresco:retryImageScaleType="centerCrop"
    fresco:progressBarImage="@drawable/progress_bar"// 提示用戶正在加載,和加載進度無關
    fresco:progressBarImageScaleType="centerInside"
    fresco:progressBarAutoRotateInterval="1000"
    fresco:backgroundImage="@color/blue"
    fresco:overlayImage="@drawable/watermark"
    fresco:pressedStateOverlayImage="@color/red"
    fresco:roundAsCircle="false"// 是不是設置圓圈
    fresco:roundedCornerRadius="1dp"// 圓角角度,180的時候會變成圓形圖片
    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"
  />

修改圖片尺寸
Uri uri = "file:///mnt/sdcard/MyApp/myfile.jpg";
int width = 50, height = 50;
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
    .setResizeOptions(new ResizeOptions(width, height))
    .build();
PipelineDraweeController controller = Fresco.newDraweeControllerBuilder()
    .setOldController(mDraweeView.getController())
    .setImageRequest(request)
    .build();
mSimpleDraweeView.setController(controller);


自動旋轉
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
    .setAutoRotateEnabled(true)

    .build();



更詳細的介紹 http://wiki.jikexueyuan.com/project/fresco/configuration.html


根據文檔,所有的url都必須是絕對路徑,文檔給樹了資源的scheme:


類型 Scheme 示例
遠程圖片 http://, https:// HttpURLConnection
本地文件 file:// FileInputStream
Content provider content:// ContentResolver
asset目錄下的資源 asset:// AssetManager
res目錄下的資源 res:// Resources.openRawResource

裏面只說明了加載圖片的scheme。並沒有給出示例。

讓我高了半天沒成功。

最後在網上找到了資料,終於成功。


以 res/raw 文件夾爲例

在res/raw 文件下放一個gif文件:web_loading.gif


Fresco適用的絕對url應該是這樣的:

"res://com.xxx.yy/"+R.raw.web_loading

其中 R.raw.web_loading 是id,不是字符串。com.xxx.yy 是你的項目包名

因爲res所有文件都會生成id。 所以使用 Fresco給出的 scheme  加上包名,再加上資源id。就可以定位到 raw下的文件

//======================   2015-05-19  更新   =======================

最近做項目有出現了以個問題.

當我加載 asset 目錄下的 資源時,又出現了圖片無法加載的問題. 

錯誤日誌: E/JHEAD﹕ can't open '/loading2.gif'

 在網絡上看到了一個解決辦法 :   

將路徑寫成  : asset:///loading2.gif   

ok  ..解決..


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章