在一些項目中,典型的比如視頻類的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 |