Duchen's Blog

Fresco介绍

Fresco介绍

###关于 Fresco

Fresco中文文档

详细使用

ImagePipe 指南

Fresco 是一个强大的图片加载组件。

Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。

Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。

Fresco 支持 Android2.3(API level 9) 及其以上系统。

基本使用

  • 通过 ImagePipelineConfig 设置图片的获取和管理的配置,并在初始化Fresco的时候注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ImagePipelineConfig config = ImagePipelineConfig.newBuilder()
.setBitmapMemoryCacheParamsSupplier(bitmapCacheParamsSupplier)
.setCacheKeyFactory(cacheKeyFactory)
.setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier)
.setExecutorSupplier(executorSupplier)
.setImageCacheStatsTracker(imageCacheStatsTracker)
.setMainDiskCacheConfig(mainDiskCacheConfig)
.setMemoryTrimmableRegistry(memoryTrimmableRegistry)
.setNetworkFetchProducer(networkFetchProducer)
.setPoolFactory(poolFactory)
.setProgressiveJpegConfig(progressiveJpegConfig)
.setRequestListeners(requestListeners)
.setSmallImageDiskCacheConfig(smallImageDiskCacheConfig)
.build();
Fresco.initialize(context, config);
  • DraweeHierarchy 用于组织和维护最终绘制和呈现的 Drawable 对象,包括占位图,错误图,圆角等属性(这些属性部分可以在 XML 中设定)
1
2
3
4
5
6
GenericDraweeHierarchy hierarchy = builder
.setFadeDuration(300)
.setPlaceholderImage(new MyCustomDrawable())
.setBackgrounds(backgroundList)
.setOverlays(overlaysList)
.build();
  • ImageRequest 用于控制真正显示的图片的请求,包括多图请求、图片复用、缩放旋转图片、对获取到的图片进行修改 等
1
2
3
4
5
6
7
8
9
ImageRequest request = ImageRequestBuilder
.newBuilderWithSource(uri)
.setImageDecodeOptions(decodeOptions)
.setAutoRotateEnabled(true)
.setLocalThumbnailPreviewsEnabled(true)
.setLowestPermittedRequestLevel(RequestLevel.FULL_FETCH)
.setProgressiveRenderingEnabled(false)
.setResizeOptions(new ResizeOptions(width, height))
.build();
  • DraweeController 负责和 image loader 交互,用于实现对所要显示的图片做更多的控制,例如重试点击监听、加载进度监听、控制动画播放等
1
2
3
4
5
6
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setTapToRetryEnabled(true)
.setOldController(mSimpleDraweeView.getController())
.setControllerListener(listener)
.build();
  • 通过向 DraweeView 上注入 Hierarchy 和 Controller 来显示图片
1
2
mSimpleDraweeView.setHierarchy(hierarchy);
mSimpleDraweeView.setController(controller);