關於 Fresco
Fresco 是一個強大的圖片加載組件。
Fresco 中設計有一個叫做 image pipeline 的模塊。它負責從網絡,從本地文件系統,本地資源加載圖片。爲了最大限度節省空間和CPU時間,它含有3級緩存設計(2級內存,1級文件)。
Fresco 中設計有一個叫做 Drawees 模塊,方便地顯示loading圖,當圖片不再顯示在屏幕上時,及時地釋放內存和空間佔用。
Fresco 支持 Android2.3(API level 9) 及其以上系統。
配置
allprojects { repositories { jcenter() mavenCentral() } }這樣你就可以在你項目中使用fresco。
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);
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 ..解決..