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

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