一、概述
1、介绍
Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络、本地存储和本地资源中加载图片。相对于ImageLoader,拥有更快的图片下载速度以及可以加载和显示gif图等诸多优势,是个很好的图片框架。并且比Glide和Picasso功能都强大。
2、Image Pipeline
Image Pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级磁盘)。
3、Drawees
Drawees 负责在图片加载完成前显示占位图,加载成功后自动替换为目标图片。当图片不再显示在屏幕上时,它会及时地释放内存和空间占用。
4、特点
1)内存管理
内存分配采用:系统匿名共享内存
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
2)渐进式呈现图片
渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续, 呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
3)支持加载Gif图,支持WebP格式。
4)图像的呈现

  • 自定义居中焦点(对人脸等图片显示非常有帮助)。
  • 圆角图,当然圆圈也行。
  • 下载失败之后,点击重新下载。
  • 自定义占位图,自定义overlay, 或者进度条。
  • 指定用户按压时的overlay。

5)图像的加载

  • 为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片。
  • 先显示一个低解析度的图片,等高清图下载完之后再显示高清图。
  • 加载完成回调通知。
  • 对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图。
  • 缩放或者旋转图片。
  • 处理已下载的图片。

5、官方参考
GitHub地址:https://github.com/facebook/fresco
使用文档地址:https://www.fresco-cn.org/docs/index.html

二、Demo
1、效果说明
本demo使用Fresco完成以下功能:
1) 基本使用

Uri uri = Uri.parse("http://pic.qiantucdn.com/58pic/22/76/26/57d0ef9f30729_1024.jpg");
        /*
        Drawees 负责图片的呈现
         */
        SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
        draweeView.setImageURI(uri);

2)带进度条的图片

SimpleDraweeView sdvFrescoSpimg = (SimpleDraweeView) findViewById(R.id.sdv_fresco_spimg);
// 设置样式
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources());
GenericDraweeHierarchy hierarchy = builder.setProgressBarImage(new ProgressBarDrawable()).build();
 sdvFrescoSpimg.setHierarchy(hierarchy);
// 加载图片的地址
Uri uri = Uri.parse("http://pic.qiantucdn.com/58pic/18/74/91/5652b24db9faf_1024.jpg");
// 加载图片
 sdvFrescoSpimg.setImageURI(uri);

3)图片的不同裁剪

// 设置描述
tvFrescoExplain.setText("居中,无缩放");
 // 样式设置
GenericDraweeHierarchy hierarchy = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER).build();
 // 图片显示
imageDisplay(hierarchy);

4)圆形和圆角图片

/**
     * 设置圆形图片
     */
 public void fresco_circle(View view) {
        // 设置圆形图片
        parames = RoundingParams.asCircle();
        GenericDraweeHierarchy hierarchy = builder.setRoundingParams(parames).build();
        simpleDraweeView.setHierarchy(hierarchy);
        simpleDraweeView.setImageURI(uri);
    }

    /**
     * 设置圆角图片
     */
    public void fresco_corner(View view) {
parames = RoundingParams.fromCornersRadius(50f);    parames.setOverlayColor(getResources().getColor(android.R.color.holo_red_light));//覆盖层      parames.setBorder(getResources().getColor(android.R.color.holo_blue_light), 5);//边框
 GenericDraweeHierarchy hierarchy = builder.setRoundingParams(parames).build();
simpleDraweeView.setHierarchy(hierarchy);
 // 加载图片
 simpleDraweeView.setImageURI(uri);
    }

5)渐进式展示图片

// 获取图片请求
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).setProgressiveRenderingEnabled(true).build();
 DraweeController draweeController =Fresco
 .newDraweeControllerBuilder()
.setImageRequest(request)
.setTapToRetryEnabled(true)              .setOldController(sdvFrescoJpeg.getController())//使用oldController可以节省不必要的内存分配
.build();
// 设置加载的控制
sdvFrescoJpeg.setController(draweeController);

6) GIF动画图片

DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(uri)
                .setAutoPlayAnimations(false)
                .setOldController(sdvFrescoGif.getController())
                .build();

        sdvFrescoGif.setController(controller);
 /**
     * 停止动画
     */
    public void stopAnim(View view) {
        Animatable animatable = sdvFrescoGif.getController().getAnimatable();

        if (animatable != null && animatable.isRunning()) {
            animatable.stop();
        }
    }

    /**
     * 开始动画
     */
    public void startAnim(View view) {
        Animatable animatable = sdvFrescoGif.getController().getAnimatable();

        if (animatable != null && !animatable.isRunning()) {
            animatable.start();
        }

7)多图请求及图片复用

8)图片缩放和旋转

9)修改图片

10)动态展示图片

android 开发之图像分离 android 图像处理框架_Fresco


2、demo地址:

https://github.com/TDCQZD/FrescoTest

三、如何使用?
1、依赖库

//fresco依赖库
    compile 'com.facebook.fresco:fresco:0.12.0'
    // 在 API < 14 上的机器支持 WebP 时,需要添加
    compile 'com.facebook.fresco:animated-base-support:0.12.0'

    // 支持 GIF 动图,需要添加
    compile 'com.facebook.fresco:animated-gif:0.12.0'

    // 支持 WebP (静态图+动图),需要添加
    compile 'com.facebook.fresco:animated-webp:0.12.0'
    compile 'com.facebook.fresco:webpsupport:0.12.0'

    // 仅支持 WebP 静态图,需要添加
    compile 'com.facebook.fresco:webpsupport:0.12.0'

2、在全局变量Application初始化Fresco

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }

配置AndroidManifest.xml
需要在 AndroidManifest.xml 中指定 Application 类,添加权限。

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

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".activity.FrescoActivity" />
        <activity android:name=".activity.FrescoAutoSizeActivity" />
        <activity android:name=".activity.FrescoCircleAndCornerActivity" />
        <activity android:name=".activity.FrescoCropActivity" />
        <activity android:name=".activity.FrescoSpimgActivity" />
        <activity android:name=".activity.FrescoResizeActivity" />
        <activity android:name=".activity.FrescoMultiActivity" />
        <activity android:name=".activity.FrescoModifyActivity" />
        <activity android:name=".activity.FrescoListenerActivity" />
        <activity android:name=".activity.FrescoJpegActivity" />
        <activity android:name=".activity.FrescoGifAcitivity" />

    </application>

3、使用Drawees显示图片

/* 
 Drawees 负责图片的呈现 
 */ 
 SimpleDraweeView draweeView = 
 (SimpleDraweeView) findViewById(R.id.my_image_view); 
 draweeView.setImageURI(uri);