Fresco使用詳解

在一些項目中,典型的比如視頻類的APP都會顯示一些圖片,通過圖片的點擊響應相應的事件,而這些圖片的獲取都需要從服務器拿取數據,就用到了網絡訪問。而在這個過程中,是否網絡訪問成功,是否能拿到數據,網絡加載過程中顯示什麼,網絡不好時重新加載顯示什麼,多種情況下,需要考慮很多問題,而Fresco非常好的解決了這些問題,下面實現一下Fresco。

一.首先,新建一個AndroidStudio的工程,在build.gradle中導入Fresco的包,打開build.gradle文件,

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'com.facebook.fresco:fresco:0.9.0'
}
加入最後一句
compile 'com.facebook.fresco:fresco:0.9.0'

然後點擊右上角的Sync now進行下載。

二.其次,既然涉及到網絡訪問,那麼就一定需要在AndroidManifest文件中加入網絡訪問權限。在<application>之前加入:

<uses-permission android:name="android.permission.INTERNET"/>

三 .每張圖片有很多種不同的顯示方法。

1.首先顯示獲取數據失敗時加載的圖片(也可以看成是默認顯示的圖片)。

(1)在xml文件中實現一下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.cnlive.frescotext.MainActivity"
    tools:showIn="@layout/activity_main">

   <com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/drawee"
    android:layout_width="150dp"
    android:layout_height="250dp"
    android:layout_centerInParent="true"
    app:placeholderImageScaleType="fitCenter"
    app:placeholderImage="@drawable/ic_failure">
  </com.facebook.drawee.view.SimpleDraweeView>
</RelativeLayout>

使用SimpleDraweeView實現圖片的顯示,這裏我設置了一張圖片,用於在加載失敗時顯示這個圖片,每一個SimpleDraweeView能顯示一張圖片,必須指定width跟height的值,否則不會顯示圖片,同時,他們在這裏也不支持wrap_content。下面這句設置了佔位圖片:

app:placeholderImage="@drawable/ic_failure"

下面這句設置了佔位圖片的縮放類型:

app:placeholderImageScaleType="fitCenter"
縮放類型具體的意思會在後面解釋。

注意:有的地方會在這裏自己定義fresco的命名空間,xmlns:fresco="http://schemas.android.com/apk/res-auto"

但是AndroidStudio在創建的時候會自己創建一個app,與fresco的命名空間相同(看代碼),因此使用app也是可以的。

(2)還需要在MainActivity中實現Fresco的初始化,才能運行:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Fresco.initialize(this);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

}
在setContentView()方法之前實現Fresco.initialize(this)代碼,對Fresco進行初始化。運行如圖:


除了將Fresco.initialize(this)這句代碼放在使用Fresco的Activity或者Fragment的onCreate()中初始化之外,一般如果是一個比較大的工程,如果很多地方都用到Fresco的話,每次單獨初始化就會很麻煩也很重複。這樣就可以放在Application類的onCreate()中進行全局初始化。這個Application類繼承自系統的Application類,如下:

public class ApplicationContext extends Application {
   
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}
然後在AndroidManifest文件中初始化這個Application,告訴系統現在用的是這個Application而不是系統的Application。在<application>標籤中加入這一句即可:

android:name="com.example.heartbeatapplication.ApplicationContext"

2.顯示下載的圖片:


縮放類型及意義:

縮放類型ScaleType:

類型 描述
center 居中,無縮放
centerCrop 保持寬高比縮小或放大,使得兩邊都大於或等於顯示邊界。居中顯示。
focusCrop 同centerCrop, 但居中點不是中點,而是指定的某個點
centerInside 使兩邊都在顯示邊界內,居中顯示。如果圖尺寸大於顯示邊界,則保持長寬比縮小圖片。
fitCenter 保持寬高比,縮小或者放大,使得圖片完全顯示在顯示邊界內。居中顯示
fitStart 同上。但不居中,和顯示邊界左上對齊
fitEnd 同fitCenter, 但不居中,和顯示邊界右下對齊
fitXY 不保存寬高比,填充滿顯示邊界
none 如要使用tile mode顯示, 需要設置爲none

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