在一些项目中,典型的比如视频类的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 |