概述

Fresco 是 facebook 的开源类库,它支持更有效的加载网络图片以及资源图片。它自带三级缓存功能,让图片显示更高效。

介绍

Fresco 是一个强大的图片加载组件。
Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。
Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。
Fresco 支持 Android2.3(API level 9) 及其以上系统。

简单使用

简单来说,只需要三步。

    1. 添加依赖
2. 初始化Fresco
3. 编写布局
4. 指定Uri

1.添加依赖

在你的 模块级别 的gradle中写下:

compile 'com.facebook.fresco:fresco:0.10.0'

2.初始化Fresco

在你的自定义application中,或者在Activity.onCreate方法内,setContentView之前调用:

Fresco.initialize(this);

3.编写布局

声明命名空间 xmlns:fresco="http://schemas.android.com/apk/res-auto"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto">

写一个SimpleDraweeView

<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view0"
android:layout_width="200dp"
android:layout_height="200dp"
/>

4.指定Uri

final String str2 = "http://h.hiphotos.baidu.com/zhidao/pic/item/279759ee3d6d55fb65c51e786c224f4a20a4dd69.jpg";
Uri uri = Uri.parse(str2);
my_image_view0.setImageURI(uriERR);

Fresco的一些概念

DraweeView

继承于 View, 负责图片的显示。一般情况下,使用SimpleDraweeView 即可

ImageRequest

ImageRequest存储着Image Pipeline处理被请求图片所需要的有用信息(Uri、是否渐进式图片、是否返回缩略图、缩放、是否自动旋转等)。

Fresco的对 布局宽高的要求

你必须声明 android:layout_width 和 android:layout_height。
如果没有在XML中声明这两个属性,将无法正确加载图像。

Drawees 不支持 wrap_content 属性。

这么做是有理由的:

所下载的图像可能和占位图尺寸不一致,如果设置出错图或者重试图的话,这些图的尺寸也可能和所下载的图尺寸不一致。
如果大小不一致,假设使用的是 wrap_content,图像下载完之后,View将会重新layout,改变大小和位置。这将会导致界面跳跃。

考虑到缓存的图片会根据你的尺寸进行缩略图,手机的屏幕会在旋转而导致imageview大小改变等,这些都会导致图片无法正常显示。

固定宽高比

只有希望显示固定的宽高比时,可以使用wrap_content。

如果希望图片以特定的宽高比例显示,例如 4:3,可以在XML中指定:

<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="20dp"
android:layout_height="wrap_content"
fresco:viewAspectRatio="1.33"
<!-- other attributes -->

也可以在代码中指定显示比例:

mSimpleDraweeView.setAspectRatio(1.33f);

指定占位图片

使用 progressBarImage 指定 加载时显示的图片

使用 failureImage 指定 加载失败的显示的图片

使用 placeholderImage 指定占位图

<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view0"
android:layout_width="200dp"
android:layout_height="200dp"
fresco:progressBarImage="@drawable/loading"
fresco:progressBarImageScaleType="centerInside"
fresco:failureImage="@drawable/error2"
fresco:failureImageScaleType="centerInside"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/loading" />

在加载失败时,可以设置点击重新加载。这时提供一个图片,加载失败时,会显示这个图片(而不是失败提示图片),提示用户点击重试。

在ControllerBuilder 中如下设置:

.setTapToRetryEnabled(true)

指定加载失败图片和点击重新加载

在xml中指定加载失败后提示重试的图片

fresco:retryImage="@drawable/retrying"
fresco:retryImageScaleType="centerCrop"

并在ControllerBuilder 中如下设置:

.setTapToRetryEnabled(true)

加载失败时,image pipeline 会重试四次;如果还是加载失败,则显示加载失败提示图片。

圆角图片

实现一个圆角图片是这么的容易,仅仅在xml布局里声明开启圆角,并指定 radius 即可。支持对四个角任意组合的圆角。

<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_viewRound"
android:layout_width="200dp"
android:layout_height="200dp"
fresco:roundedCornerRadius="30dp"
fresco:roundTopLeft="true"
fresco:roundTopRight="false"
fresco:roundBottomLeft="false"
fresco:roundBottomRight="true"
fresco:placeholderImage="@drawable/loading" />

渐进式JPEG图

Fresco 支持渐进式的网络JPEG图。在开始加载之后,图会从模糊到清晰渐渐呈现。

你可以设置一个清晰度标准,在未达到这个清晰度之前,会一直显示占位图。

渐进式JPEG图仅仅支持网络图

获得SimpleDraweeView

my_image_view0 = (SimpleDraweeView) findViewById(R.id.my_image_view0);

构建ImageRequest加载图片

    /**
* 演示:逐渐加载的图片,即,从模糊逐渐清晰。需要图片本身也支持这种方式
*/
private void showProgressiveJPEGs() {
final String str3_progressive = "http://pooyak.com/p/progjpeg/jpegload.cgi?o=1";
Uri uri = Uri.parse(str3_progressive); ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setProgressiveRenderingEnabled(true)
.build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.setOldController(my_image_view0.getController())
.build();
my_image_view0.setController(controller);
}

动画图支持

Fresco 支持 GIF 和 WebP 格式的动画图片。对于 WebP 格式的动画图的支持包括扩展的 WebP 格式,即使 Android 2.3及其以后那些没有原生 WebP 支持的系统。

设置动画图自动播放

如果你希望图片下载完之后自动播放,同时,当View从屏幕移除时,停止播放,只需要在 image request 中简单设置,如下:

Uri uri;
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.build();
mSimpleDraweeView.setController(controller);

监听下载事件

有时候我们需要监听图片显示的过程,比如在失败,中间过程,成功时做一些事情。我们可以这么做:

  1. 为SimpleDraweeView 指定一个 DraweeController

  2. 为DraweeController 指定一个 ControllerListener

  3. 在ControllerListener 的回调方法里处理 失败,中间过程,成功时的事情

    Uri uri;

    DraweeController controller = Fresco.newControllerBuilder()

    .setControllerListener(controllerListener)

    .setUri(uri);

    .build();

    mSimpleDraweeView.setController(controller);

上面的代码指定了一个 ControllerListener ,它包含一些回调方法:

onFinalImageSet         加载完成
onIntermediateImageSet 加载中间过程
onFailure 加载失败

Fresco 提供了一个 推荐继承BaseControllerListener ,继承自 推荐继承BaseControllerListener 更方便,示例代码:

ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
@Override
public void onFinalImageSet(
String id,
@Nullable ImageInfo imageInfo,
@Nullable Animatable anim) {
if (imageInfo == null) {
return;
}
QualityInfo qualityInfo = imageInfo.getQualityInfo();
FLog.d("Final image received! " +
"Size %d x %d",
"Quality level %d, good enough: %s, full quality: %s",
imageInfo.getWidth(),
imageInfo.getHeight(),
qualityInfo.getQuality(),
qualityInfo.isOfGoodEnoughQuality(),
qualityInfo.isOfFullQuality());
} @Override
public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
FLog.d("Intermediate image received");
} @Override
public void onFailure(String id, Throwable throwable) {
FLog.e(getClass(), throwable, "Error loading %s", id)
}
};

Fresco对各种Uri类型的资源的支持

Fresco使用 Uri 对象指定要显示的图片

res 示例:

Uri uri = Uri.parse("res://包名(实际可以是任何字符串甚至留空)/" + R.drawable.ic

Fresco 支持许多URI格式。见下表:

类型	                  Scheme	               示例
远程图片: http://, https:// HttpURLConnection 或者参考 使用其他网络加载方案
本地文件: file:// FileInputStream
Content provider: content:// ContentResolver
asset目录下的资源: asset:// AssetManager
res目录下的资源: res:// Resources.openRawResource

特别注意:Fresco 不支持 相对路径的URI. 所有的URI都必须是绝对路径,并且带上该URI的scheme。

扩展资源

android 开发 - 网络图片加载库 Fresco 的使用。的更多相关文章

  1. fackbook的Fresco (FaceBook推出的Android图片加载库-Fresco)

    [Android开发经验]FaceBook推出的Android图片加载库-Fresco   欢迎关注ndroid-tech-frontier开源项目,定期翻译国外Android优质的技术.开源库.软件 ...

  2. FaceBook推出的Android图片加载库-Fresco

    FaceBook推出的Android图片加载库-Fresco 原文链接:Introducing Fresco: A new image library for Android 译者 : ZhaoKai ...

  3. Android图片加载库Fresco

    在Android设备上面,快速高效的显示图片是极为重要的.过去的几年里,我们在如何高效的存储图像这方面遇到了很多问题.图片太大,但是手机的内存却很小.每一个像素的R.G.B和alpha通道总共要占用4 ...

  4. Android之网络图片加载的5种基本方式

    学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助. 此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection.H ...

  5. Android开发--异步加载

    因为移动端软件开发思维模式或者说是开发的架构其实是不分平台和编程语言的,就拿安卓和IOS来说,他们都是移动前端app开发展示数据和用户交互数据的数据终端,移动架构的几个大模块:UI界面展示.本地数据可 ...

  6. Android开发 - ImageView加载Base64编码的图片

    在我们开发应用的过程中,并不是所有情况下都请求图片的URL或者加载本地图片,有时我们需要加载Base64编码的图片.这种情况出现在服务端需要动态生成的图片,比如: 二维码 图形验证码 ... 这些应用 ...

  7. android ImageView网络图片加载、动态设置尺寸、圆角..

    封装了一个关于ImageView的辅助类,该类可以方便实现网络图片下载的同时,动态设置图片尺寸.圆角.....一系列连贯的操作,无样式表,java代码实现所有功能,使用很方便. package com ...

  8. Android之图片加载框架Fresco基本使用(一)

    PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中 ...

  9. Android之图片加载框架Fresco基本使用(二)

    PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...

随机推荐

  1. Request Tracker 4.0.13 发布

    Request Tracker 4.0.13 修复了几个重要的安全问题. Request Tracker,企业级的问题跟踪系统

  2. AutoMapper中的Map和DynamicMap——高手注重细节,思考和总结

    近日在做项目的时候,遇到了个怪问题,关于AutoMapper的细节问题,也是不为一般人所关注的. 本人研究AutoMapper也没有多长时间,而且研究的过程中也写了关于AutoMapper的系列基础教 ...

  3. libevent (二) 接收TCP连接

    libevent 接收TCP连接 Evconnlistener 机制为您提供了侦听和接受传入的 TCP 连接的方法.下面的函数全部包含在`<event2/listener.h>`中. ev ...

  4. [Java Web整合开发王者归来·刘京华] 2、 Java Web开发概述

    1.Web相关概念 1-1.胖客户与瘦客户 >_<" RCP的定义及优缺点:       >_<"TCP的定义及优缺点:             1-2.B ...

  5. git查看一个文件的历史记录

    git log --all -- '*'FILENAME'*' 支持模糊查询 主要用于查找历史上被删除的文件 可以做成git的一个快捷命令 find = "!f(){ git log --a ...

  6. atitit.基于http json api 接口设计 最佳实践 总结o7

    atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::服务器and android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通参数 meth,p ...

  7. linux下安装小鹤双拼-鹤形

    首先安装小小拼音.发现小小拼音真是一个良心软件 http://yong.dgod.net/ 进入下载页面.我是下载 解压版的 解压缩后.放在主目录里.可以改成.yong 隐藏起来 安装步骤(前人栽树, ...

  8. 转:MPlayer源代码分析

    一.Mplayer支持的格式 MPlayer是一个LINUX下的视频播放器,它支持相当多的媒体格式,无论在音频播放还是在视频播放方面,可以说它支持的格式是相当全面的. 视频格式支持:MPEG.AVI. ...

  9. ZZmsvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义 .的分析解决办法 (转)

    很久没有写程式设计入门知识的相关文章了,这篇文章要来谈谈程式库 (Library) 连结,以及关于 MSVC 与 CRT 之间的种种恩怨情仇. 如果你使用的作业系统是 Linux.Mac 或其他非 W ...

  10. 写给程序员和UI--Android的切图标准

    最近总是有人在问我,Android怎么切图啊,怎么适配啊,不只是Android同行,还有很多新手ui设计师. 于是我就写篇文章,根据我们平时的开发经验,简单的介绍一下吧. 如果UI设计师以1920*1 ...