標(biāo)題: 商城開(kāi)發(fā)筆記-07-Fresco圖片加載框架的基本使用詳解 [打印本頁(yè)]

作者: 51黑bing    時(shí)間: 2016-3-22 17:22
標(biāo)題: 商城開(kāi)發(fā)筆記-07-Fresco圖片加載框架的基本使用詳解
一、Fresco的簡(jiǎn)介


       Fresco是目前最強(qiáng)大的圖片加載組件。以前我們常用的比較火的是:
Android圖片異步加載框架Android-Universal-Image-Loader。
       Fresco中設(shè)計(jì)有一個(gè)叫做imagepipeline的模塊。它負(fù)責(zé)從網(wǎng)絡(luò),從本地文件系統(tǒng),本地資源加載圖片。 為了最大限度節(jié)省空間和CPU時(shí)間,它含有3級(jí)緩存設(shè)計(jì)(2級(jí)內(nèi)存,1級(jí)文件)。
       Fresco中設(shè)計(jì)有一個(gè)叫做Drawees模塊,方便地顯示loading圖,當(dāng)圖片不再顯示在屏幕上時(shí),及時(shí)地釋放內(nèi)存和空間占用。
       Fresco支持Android2.3(APIlevel 9)及其以上系統(tǒng)。
       感覺(jué)好叼用木有,下面給出FrescoGitHub地址:
       https://github.com/facebook/fresco

       這是它的官方的中文使用文檔介紹:
       http://fresco-cn.org/docs/index.html
       這是它的官方Logo
                              

二、Fresco的重要特點(diǎn)
特點(diǎn)1-內(nèi)存管理
       一個(gè)沒(méi)有未壓縮的圖片,即Android中的Bitmap,占用大量的內(nèi)存。大的內(nèi)存占用勢(shì)必引發(fā)更加頻繁的GC。 5.0以下,GC將會(huì)顯著地引發(fā)界面卡頓。
5.0以下系統(tǒng),Fresco將圖片放到一個(gè)特別的內(nèi)存區(qū)域。當(dāng)然,在圖片不顯示的時(shí)候,占用的內(nèi)存會(huì)自動(dòng)被釋放。 這會(huì)使得APP更加流暢,減少因圖片內(nèi)存占用而引發(fā)的OOM。

給圖片分配內(nèi)存的方式:
FrescoAshmem(系統(tǒng)匿名共享內(nèi)存)
其他:Java Heap

特點(diǎn)2-漸進(jìn)式呈現(xiàn)圖片
       漸進(jìn)式的JPEG圖片格式已經(jīng)流行數(shù)年了,漸進(jìn)式圖片格式先呈現(xiàn)大致的圖片輪廓,然后隨著圖片下載的繼續(xù), 呈現(xiàn)逐漸清晰的圖片,這對(duì)于移動(dòng)設(shè)備,尤其是慢網(wǎng)絡(luò)有極大的利好,可帶來(lái)更好的用戶體驗(yàn)。

特點(diǎn)3-Gif圖和WebP格式
       支持加載Gif圖,支持WebP格式。

特點(diǎn)4-圖像的呈現(xiàn)
自定義居中焦點(diǎn)(對(duì)人臉等圖片顯示非常有幫助)。
圓角圖,當(dāng)然圓圈也行。
下載失敗之后,點(diǎn)擊重現(xiàn)下載。
自定義占位圖,自定義overlay, 或者進(jìn)度條。
指定用戶按壓時(shí)的overlay。

                                                   特點(diǎn)5-圖像的加載
為同一個(gè)圖片指定不同的遠(yuǎn)程路徑,或者使用已經(jīng)存在本地緩存中的圖片。
先顯示一個(gè)低解析度的圖片,等高清圖下載完之后再顯示高清圖。
加載完成回調(diào)通知。
對(duì)于本地圖,如有EXIF縮略圖,在大圖加載完成之前,可先顯示縮略圖。
縮放或者旋轉(zhuǎn)圖片。
處理已下載的圖片。
WebP支持。
三、Fresco的基本使用
1、在Gradle中引入Fresco的依賴庫(kù),這些相信大家都熟悉了,不再啰嗦了。
compile 'com.facebook.fresco:fresco:0.9.0'
2、配置自己的Application,并且在onCreate的時(shí)候調(diào)用
Fresco.initialize(this);
在清單文件中添加網(wǎng)絡(luò)權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
配置Application不要忘了
android:name=".MyApplication"
Application的使用介紹:
http://www.cnblogs.com/renqingping/archive/2012/10/24/Application.html
3、在布局文件當(dāng)中放置我們的Fresco的常用控件。以SimpleDraweeView為例,用于放置圖片。
<?xml version="1.0" encoding="utf-8"?>
<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">
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/my_image_view"
        android:layout_width="200dp"
        android:layout_height="200dp"
        fresco:placeholderImage="@mipmap/before"
        />
</LinearLayout>

下面對(duì)常用屬性進(jìn)行說(shuō)明:
android:layout_width="20dp"   
// 不支持wrap_content, 如果要設(shè)置寬高比, 需要在Java代碼中指定setAspectRatio(floatratio);

android:layout_height="20dp"   
// 不支持wrap_content

fresco:placeholderImage="@color/wait_color"
// 下載成功之前顯示的圖片

fresco:placeholderImageScaleType="fitCenter"
// 設(shè)置圖片縮放. 通常使用focusCrop,該屬性值會(huì)通過(guò)算法把人頭像放在中間

fresco:failureImage="@drawable/error"
// 加載失敗的時(shí)候顯示的圖片

fresco:failureImageScaleType=centerInside"
// 設(shè)置圖片縮放

fresco:retryImage="@drawable/retrying"
// 加載失敗,提示用戶點(diǎn)擊重新加載的圖片(會(huì)覆蓋failureImage的圖片)

fresco:retryImageScaleType="centerCrop"

// 是不是設(shè)置圓形方式顯示圖片
fresco:roundAsCircle="false"


// 圓角設(shè)置
    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"


4、代碼中,只要配置一個(gè)圖片對(duì)應(yīng)的Uri就可以了,剩下的,F(xiàn)resco會(huì)替你完成:
·                        顯示占位圖直到加載完成;
·                        下載圖片;
·                        緩存圖片;
·                        圖片不再顯示時(shí),從內(nèi)存中移除;
等等等等。


三、Fresco的漸進(jìn)式顯示網(wǎng)絡(luò)圖片

    下面開(kāi)始,楠妹妹要給大家介紹Fresco的一些比較叼的而且常用到的一些功能,先從漸進(jìn)式顯示網(wǎng)絡(luò)圖片開(kāi)始吧,至于其他功能自行去查看API文檔。先聲明,這個(gè)功能只能用于請(qǐng)求網(wǎng)絡(luò)圖片。

    這是官方的描述:
       Fresco 支持漸進(jìn)式的網(wǎng)絡(luò)JPEG圖。在開(kāi)始加載之后,圖會(huì)從模糊到清晰漸漸呈現(xiàn)。
    你可以設(shè)置一個(gè)清晰度標(biāo)準(zhǔn),在未達(dá)到這個(gè)清晰度之前,會(huì)一直顯示占位圖。
漸進(jìn)式JPEG圖僅僅支持網(wǎng)絡(luò)圖

    核心的代碼就是給draweeView配置一個(gè)可以顯示漸進(jìn)式JPEG的控制器。由于網(wǎng)絡(luò)太快的原因,效果不會(huì)很明顯,不過(guò)我們的目的已經(jīng)達(dá)到了。

    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse("圖片網(wǎng)址"))
        .setProgressiveRenderingEnabled(true)
        .build();
PipelineDraweeControllercontroller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
        .setImageRequest(request)
        .build();
draweeView.setController(controller);


四、多圖請(qǐng)求

    多圖請(qǐng)求就是先顯示模糊的圖片,等到大圖加載成功之后再顯示大圖。

    核心代碼也是通過(guò)控制器實(shí)現(xiàn),并沒(méi)有什么技術(shù)含量。

DraweeControllercontroller = Fresco.newDraweeControllerBuilder()
        .setLowResImageRequest(ImageRequest.fromUri("低分辨率"))
        .setImageRequest(ImageRequest.fromUri("高分辨率"))
        .build();
draweeView.setController(controller);

五、事件監(jiān)聽(tīng)

1、首先新建一個(gè)監(jiān)聽(tīng)器。至于回調(diào)何時(shí)調(diào)用,不再贅述。

ControllerListener<ImageInfo> listener = new ControllerListener<ImageInfo>() {
    @Override
    public void onSubmit(String id, Object callerContext) {
    }
    //圖片加載成功的時(shí)候
    @Override
    public void onFinalImageSet(String id, ImageInfo imageInfo, Animatableanimatable) {
    }
    @Override
    public void onIntermediateImageSet(String id, ImageInfo imageInfo)  {
    }
    @Override
    public void onIntermediateImageFailed(String id, Throwable throwable)  {
    }
    //圖片加載失敗
    @Override
    public void onFailure(String id, Throwable throwable) {
    }
    @Override
    public void onRelease(String id) {
    }
};

2、注意下面紅色代碼,controller設(shè)置控制器就可以了。

DraweeControllercontroller = Fresco.newDraweeControllerBuilder()
        .setLowResImageRequest(ImageRequest.fromUri("低分辨率"))
        .setImageRequest(ImageRequest.fromUri("高分辨率"))
       .setControllerListener(listener)
        .build();
draweeView.setController(controller);










歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1