1. 程式人生 > >Android圖片載入庫—Fresco一個強大的圖片載入元件

Android圖片載入庫—Fresco一個強大的圖片載入元件

介紹

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
Fresco支援Android2.3(API level 9)及其以上系統。

依賴

由於我用的是android studio所以這裡就只是說一下android studio下如何配置,在強大的gradle,只需要一句話搞定,gradle會幫你下載這個Fresco框架,gradle真好,可以自動維護你專案中的框架

compile 'com.facebook.fresco:fresco:0.5.0+'
dependencies {
  // 其他依賴
  compile 'com.facebook.fresco:fresco:0.12.0'
}

下面的依賴需要根據需求新增:

dependencies {
  // 在 API < 14 上的機器支援 WebP 時,需要新增
  compile 'com.facebook.fresco:animated-base-support:0.12.0'

  // 支援 GIF 動圖,需要新增
  compile 'com.facebook.fresco:animated-gif:0.12.0'

  // 支援 WebP (靜態圖+動圖),需要新增
  compile 'com.facebook.fresco:animated-webp:0.12.0'
  compile 'com.facebook.fresco:webpsupport:0.12.0'
// 僅支援 WebP 靜態圖,需要新增 compile 'com.facebook.fresco:webpsupport:0.12.0' }

最牛特性 檢視

這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
Fresco的image pipeline 【 ˈpaɪplaɪn】 設計
這裡寫圖片描述

Demo栗子第1顆

fresco搭建開發環境

gradle
compile 'com.facebook.fresco:fresco:0.12.0'

清單檔案配置

public class FrescoApp extends Application {
    @Override
    public void
onCreate() { super.onCreate(); //初始化Fresco框架 Fresco.initialize(this); } }

配置許可權

    <!--網路-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--sd卡-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

佈局

 <com.facebook.drawee.view.SimpleDraweeView
        android:layout_width="100dp"
        android:layout_margin="5dp"
        android:background="#AEAEAE"
        android:src="@mipmap/ic_launcher"
        android:id="@+id/image"
        xmlns:fresco="http://schemas.android.com/apk/res-auto"
        android:scaleType="centerCrop"
        fresco:roundedCornerRadius="10dp"
        fresco:roundTopLeft="true"
        fresco:roundTopRight="true"
        fresco:roundBottomLeft="true"
        fresco:roundBottomRight="true"
        android:layout_height="100dp" />

編碼實現


public class MainActivity extends AppCompatActivity {

    private SimpleDraweeView simpleDraweeView;
    private String url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //(fresco:由facebook公司出的,一種圖片三級快取的實現.)
        //步驟二。使用fresco載入網路圖片
        //2.1.準備一個圖片的網路地址
        url = "http://img3.imgtn.bdimg.com/it/u=3376426628,3397639127&fm=11&gp=0.jpg";
        //2.2 佈局fresco 的自定義控制元件 (必須給控制元件設定大小)
        simpleDraweeView = (SimpleDraweeView) findViewById(R.id.image);
        //2.4.自定義控制元件的相關屬性  可以設定圓角。
        //  fresco:roundedCornerRadius="10dp"
        //  fresco:roundTopLeft="true"
        //  fresco:roundTopRight="true"
        //  fresco:roundBottomLeft="true"
        //  fresco:roundBottomRight="true"
    }
    public void showImage(View view) {
        //2.3.載入圖片
        simpleDraweeView.setImageURI(url);
    }
}

Demo栗子第2顆

如果你僅僅是想簡單下載一張網路圖片,在下載完成之前,顯示一張佔位圖,那麼簡單使用 SimpleDraweeView 即可。
在載入圖片之前,你必須初始化Fresco類。你只需要呼叫Fresco.initialize一次即可完成初始化,在 Application 裡面做這件事再適合不過了(如下面的程式碼),注意多次的呼叫初始化是無意義的。

[MyApplication.java]
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

做完上面的工作後,你需要在 AndroidManifest.xml 中指定你的 Application 類。為了下載網路圖片,請確認你聲明瞭網路請求的許可權。

 <manifest
    ...
    >
    <uses-permission android:name="android.permission.INTERNET" />
    <application
      ...
      android:label="@string/app_name"
      android:name=".MyApplication"
      >
      ...
    </application>
    ...
  </manifest>

在xml佈局檔案中, 加入名稱空間:

<!-- 其他元素-->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

加入SimpleDraweeView:

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/my_image_view"
    android:layout_width="130dp"
    android:layout_height="130dp"
    fresco:placeholderImage="@drawable/my_drawable"
  />

開始載入圖片:

Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);

方法栗子:

SimpleDraweeView控制元件

SimpleDraweeView這個控制元件了,顯示圖片的時候直接寫了一個setImageURI(uri)

在xml中引入SimpleDraweeView

<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" />

注意:1、屬性中存在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">

2、配置網路許可權
3、在Java程式碼中開始載入圖片

Uri uri = Uri.parse("https://raw.githubusercontent.com/static/fresco-logo.png");  
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);  
draweeView.setImageURI(uri);  

接下來詳細研究其用法:

URIs的使用:

型別  Scheme  示例
遠端圖片    http://, https://   HttpURLConnection 或者參考 使用其他網路載入方案
本地檔案    file:// FileInputStream
Content provider    content://  ContentResolver
asset目錄下的資源 asset://    AssetManager
res目錄下的資源   res://  Resources.openRawResource
res 示例:Uri uri = Uri.parse("res://包名(實際可以是任何字串甚至留空)/" + R.drawable.ic_launcher);

注意:Fresco 不支援 相對路徑的URI. 所有的URI都必須是絕對路徑,並且帶上該URI的scheme。

在XML中使用SimpleDraweeView:

給出一個完整的示例:

<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"//重試圖  
    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"  
    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"  
  />  

說明:必須宣告 android:layout_width 和 android:layout_height,否則將無法正確載入影象,另外不支援 wrap_content 屬性,但也有例外的時候,如果想固定控制元件的寬高比,則可以使用wrap_content,並通過在xml程式碼中設定fresco:viewAspectRatio=”小數”或者在Java程式碼中設定mSimpleDraweeView.setAspectRatio(1.33f);即可。
在Java中自定義顯示圖

一般情況下,在XML設定顯示效果即可, 如果想更多定製化,可以這樣:

建立一個 builder 然後設定給 SimpleDraweeView:

List<Drawable> backgroundsList;  
List<Drawable> overlaysList;  
GenericDraweeHierarchyBuilder builder =  
    new GenericDraweeHierarchyBuilder(getResources());  
GenericDraweeHierarchy hierarchy = builder  
    .setFadeDuration(300)  
    .setPlaceholderImage(new MyCustomDrawable())  
    .setBackgrounds(backgroundList)  
    .setOverlays(overlaysList)  
    .build();  
mSimpleDraweeView.setHierarchy(hierarchy);  

注意:請不要多次呼叫setHierarchy,即使這個View是可回收的。建立 DraweeHierarchy 的較為耗時的一個過程,應該多次利用。

  • 修改 DraweeHierarchy

DraweeHierarchy 的一些屬性可以在執行時改變。

要改變這些屬性,首先獲取一個引用:

GenericDraweeHierarchy hierarchy = mSimpleDraweeView.getHierarchy();

  • 修改佔位圖

修改佔位圖為資源id:hierarchy.setPlaceholderImage(R.drawable.placeholderId);

或者修改為一個 Drawable:Drawable drawable; hierarchy.setPlaceholderImage(drawable);

  • 修改縮放型別

hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE);

如果你選擇縮放型別為 focusCrop,需要指定一個居中點:hierarchy.setActualImageFocusPoint(point);

  • 修改圖片尺寸
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();

setController(controller)方法載入圖片

DraweeController controller = Fresco.newDraweeControllerBuilder().setUri(uri).build();
        imageView.setController(controller);

當然如果你想監聽載入的過程,就加一個ControllerListen

ControllerListener listener = new BaseControllerListener(){
            @Override
            public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) {
                super.onFinalImageSet(id, imageInfo, animatable);
            }

            @Override
            public void onFailure(String id, Throwable throwable) {
                super.onFailure(id, throwable);
            }

            @Override
            public void onIntermediateImageFailed(String id, Throwable throwable) {
                super.onIntermediateImageFailed(id, throwable);
            }
        };
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(uri)
                .setControllerListener(listener)
                .build();
        imageView.setController(controller);

圖片載入成功或者失敗,會執行裡面的方法,其中圖片載入成功時會執行onFinalImageSet方法,圖片載入失敗時會執行onFailure方法,如果圖片設定漸進式,onIntermediateImageFailed會被回撥

說完了如何載入uri之後,如何實現在xml中的效果呢?我們繼續在java程式碼中實現xml的效果

GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
                .setFadeDuration(300)
                .setBackground(getDrawable(R.drawable.ic_launcher))
                .setPlaceholderImage(getDrawable(R.drawable.ic_launcher))
                .setFailureImage(getDrawable(R.drawable.ic_launcher))
                .build();
        imageView.setHierarchy(hierarchy);

方法很多,你在xml中用到的都可以在這裡設定,有些在xml中不能設定的在這裡也是可以的,例如,我可以設定多張背景圖片,我可以設定多張疊加圖,這裡都可以幫你實現,是不是很強大啊,想不想拿到特權了一樣呢!但是DraweeHiererchy建立時比較耗時,所以要多次利用

GenericDraweeHierarchy hierarchy1 = imageView.getHierarchy();

首先是漸進式圖片載入,這方面的功能充分考慮了網路比較慢的情況下,使用者不至於一致在等,最起碼能看到模糊的照片,這個所謂的漸進式載入就是說使用者從圖片載入之後,圖片會從模糊到清晰的一個漸變過程,當然這個過程僅限於從網路載入圖片,本地或者快取等地方的圖片也不需要漸進式載入,沒有意義

ProgressiveJpegConfig config = new ProgressiveJpegConfig() {
            @Override
            public int getNextScanNumberToDecode(int i) {
                return 0;
            }

            @Override
            public QualityInfo getQualityInfo(int i) {
                return null;
            }
        };

        ImagePipelineConfig imagePipelineConfig = ImagePipelineConfig.newBuilder(this)
                .setProgressiveJpegConfig(config)
                .build();
        Fresco.initialize(getApplicationContext(),imagePipelineConfig);

當然你也可以使用ProgressiveJpegConfig config1= new SimpleProgressiveJpegConfig(list,2);

<pre name="code" class="java">FLog.setMinimumLoggingLevel(FLog.VERBOSE);
        Set<RequestListener> listeners = new HashSet<>();
        listeners.add(new RequestLoggingListener());
        ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
                .setRequestListeners(listeners)
                .build();
        Fresco.initialize(this, config);
        setContentView(R.layout.activity_main);

        mProgressiveJpegView = (SimpleDraweeView) findViewById(R.id.my_image_view);

        Uri uri = Uri.parse("http://pooyak.com/p/progjpeg/jpegload.cgi?o=1");
        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
                .setProgressiveRenderingEnabled(true)
                .build();
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .build();
        mProgressiveJpegView.setController(controller);
ImageRequest request = ImageRequestBuilder
                .newBuilderWithSource(uri)
                .setProgressiveRenderingEnabled(true)
                .build();
        PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .setOldController(imageView.getController())
                .build();
        imageView.setController(controller);

個人認為這個框架最巧妙的地方,就是把bitmap儲存到ashmen,不會啟動gc,使的介面不會因為gc而卡死,Fresco使用三級快取,第一級快取就是儲存bitmap,第二級快取儲存在記憶體,但是沒有解碼,使用時需要介面,第三級快取就是儲存在本地檔案,同樣檔案也未解碼,使用的時候要先解碼啦!

相關推薦

Android圖片入庫Fresco一個強大圖片載入元件

介紹 Fresco支援Android2.3(API level 9)及其以上系統。 依賴 由於我用的是android studio所以這裡就只是說一下android studio下如何配置,在強大的gradle,只需要一句話搞定,gr

Android 強大圖片入庫FrescoFresco介紹

Fresco 中文版 v1.1 PDF下載: http://yaphet.ctfile.com/fs/9Ah147781160 Fresco介紹: Fresco是一個由facebook開源的強大的圖片顯示系統。Fresco考慮到了安卓中圖片載入的幾乎所有問題,可以載入來自網

FaceBook推出的Android圖片入庫-Fresco

一次 人員 的人 java代碼 jpeg markdown 開發 改變 水平 歡迎關註ndroid-tech-frontier開源項目,定期翻譯國外Android優質的技術、開源庫、軟件架構設計、測試等文章 原文鏈接:Intro

Android-->Facebook圖片入庫Fresco(愛它的理由)

在Android中,圖片載入框架很多,很多,很多…都是經典,爆款. Fresco 的 Image Pipeline 負責圖片的獲取和管理。圖片可以來自遠端伺服器,本地檔案,或者Content

Android圖片入庫 Fresco 的使用幫助類

目前是基於 Fresco 1.1.0這個版本。在使用到 fresco-helper 庫的 Module 中的 build.gradle 檔案裡,新增以下依賴: allprojects { repositories { jcenter() maven {

Fresco-FaceBook推出的Android圖片入庫

    在Android裝置上面,快速高效的顯示圖片是極為重要的。過去的幾年裡,我們在如何高效的儲存影象這方面遇到了很多問題。圖片太大,但是手機的記憶體卻很小。每一個畫素的R、G、B和alpha通道總共要佔用4byte的空間。如果手機的螢幕是480*800,那麼一張螢幕大

Android圖片入庫的理解

前言        這是“基礎自測”系列的第三篇文章,以Android開發需要熟悉的20個技術點為切入點,本篇重點講講Android中的ImageLoader這個庫的一些理解,在Android上最讓人頭疼是從網路中獲取圖片,顯示,回收,任何一個環節有問題都可能直接OOM,當需要載入大量的圖片的時

Android Glide圖片入庫的使用

簡介 Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動畫處理,縮圖處理,圖片大小自定義等等

Fresco圖片入庫常見問題

1、android.view.InflateException: Binary XML file line #6: Binary XML file line #6: Error inflating c

android圖片入庫Glide4使用教程(專案中如何快速將Glide3替換成Glide4)

我想大多數人在自己的專案中還是使用Glide3.7.1這個版本吧!不過Glide版本現在已經到4.4.0了! 當我們把Glide3更換成Glide4,會發現大部分地方都報錯了,那麼該怎樣快速替換Glide3為Glide4呢? 下面我們一起來看看怎樣實現Gli

Android圖片入庫的封裝實戰

重磅更新 || 2017-02-16 使用ImageLoaderUtil實現一個真正意義的圖集功能,持續完善和更新中 重要的東西貼三遍! 2017-05-09 || 優化圓形圖片載入 更新demo 前言 圖片載

3分鐘全面瞭解Android主流圖片入庫

前言 圖片載入在 Android開發專案中非常常見,為了降低開發週期和難度,我們經常會選用一些圖片載入的開源庫,而現在圖片載入開源庫越來越多,我們應該選用哪種呢?今天我就給大家分別介紹 & 對比現今主流的圖片載入框架。 目錄

Android圖片入庫:最全面解析Glide用法

前言 上文已經對當今Android主流的圖片載入庫進行了全面介紹 & 對比 如果你還沒閱讀,我建議你先移步這裡進行檢視 今天我們來學習一下其中一個Android主流的圖片載入庫的使用 - Glide 目錄 1. 簡

Android圖片入庫Picasso和Glide

之前一直使用,沒有仔細的研究過框架,今天開始想對之前用的框架了解一下,後面打算研究一下原始碼。今天做了一個簡單的瞭解,對兩個框架進行對比。 先說說不同之處: 1.大小,Glide是Picasso的三倍左右 2.GIF圖,Glide支援載入GIF圖,

Android圖片入庫三、Picasso

簡述: 由Square公司開源的一款圖片載入和快取的庫,不過Picasso不支援磁碟快取.也就是說如果想要做磁碟快取的話需要另外想辦法.(可以利用JakeWharton/DiskLruCache) 我們可以用一行程式碼Picasso.with(context).loa

Android 流行的網路圖片入庫 (概述)

關於 Fresco Facebook最近推出了一款用於Android應用中展示圖片的強大圖片庫Fresco,它能夠從網路、本地儲存和本地資源中載入圖片。而且,為了節省資料和CPU,它擁有三級快取。 Fresco 是一個強大的圖片載入元件。 Fresco 中設計有一個叫做 image pipeline

Android Picasso圖片入庫原始碼剖析

Picasso是一個優秀的輕量級網路圖片載入快取庫。花了兩天時間研讀了下的閱讀了下他的原始碼。做一下的剖析: Picasso的優點: 足夠輕量級:maven打包出來的jar只有130kb左右 二級快取策略,分別快取記憶體和磁碟空間 自動監控記憶體大小資

Aandroid 圖片入庫Glide 實戰(一),初始,載入進階到實踐

   原文: http://blog.csdn.net/sk719887916/article/details/39989293 skay初識Glide為何使用 Glide? 有經驗的 Android 開發者可以跳過這節,但對於初學者來說,你可能會問自己為什麼你想要去用 Gl

圖片入庫Glide——解決圖片錯亂+無法設定tag

今天在寫一個圖片載入類ImageLoader,在使用的時候想用Glide替代我寫的ImageLoader,然後問題就出來了!!! 第一個問題:在使用自己寫的ImageLoader的時候,為了防止item複用導致的圖片錯亂,設定了Tag 如下程式碼

(原創)詳解Glide圖片入庫常用方法

Glide作為安卓開發常用的圖片載入庫,有許多實用而且強大的功能,那麼,今天就來總結一番,這次把比較常見的都寫出來,但並不是全部哦。 在介紹之前,先來說說什麼是Glide吧: 在泰國舉行的谷歌開發