本文为 Android 开源项目源码解析 中 Fresco 部分
项目地址:Fresco,分析的版本:e46dab3,Demo 地址:Fresco Demo 分析者:blackiedm,分析状态:未完成,校对者:Trinea,校对状态:未开始
Fresco 是一个强大的图片加载和显示组件。支持从网络、本地文件系统、本地资源下载图片。
它有三级缓存(两级内存、一级磁盘缓存)。并且支持Android2.3(API level 9) 及其以上系统。
- 出色的内存管理。当图片不显示即离屏时,占用的内存将会被释放(在Android5.0以下的系统)。
- 支持渐进式图片格式(Progressive JPEG)。
- 支持Gif和WebP图片格式。(而且还支持其动画)
- 多样式的呈现方式。
- 取代居中,自定义聚焦点。
- 支持圆角或圆形图片展示。
- 获取图片失败时,可以点击占位图重新加载。
- 可以自定义背景,覆盖层,进度条。
- 支持自定义聚焦即手按下时的覆盖层。
- 多样式加载
- 为图片指定不同远程路径,并且可以使用已经缓存在本地的图片。
- 支持先显示低清图片,当加载完成后在过渡为高清图片
- 图片加载完成后回调通知
- 如有EXIF缩略图,在大图加载完成之前,可先显示缩略图(只支持本地图片)
- 支持缩放或旋转功能
- 支持处理加载完成的图片
- 支持WebP格式图片
在Manifest里面添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
添加依赖:(x.x.x为版本号)
dependencies{
// your app's other dependencies
compile 'com.facebook.fresco:fresco:x.x.x'
}
在Application初始化时,调用:
Fresco.initialize(context);
一般情况下,使用SimpleDraweeView基本可完成你所需要的功能。
-
XML自定义使用:
在XML布局中,加入命名空间:
<RelativeLayout 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/img" android:layout_centerInParent="true" android:layout_width="200dp" android:layout_height="200dp" android:layout_margin="10dp" fresco:fadeDuration="1000" fresco:placeholderImage="@color/placeholder" fresco:failureImage="@color/error" fresco:retryImage="@color/retrying" fresco:backgroundImage="@color/blue" />
设置图片路径:
//注意:这里是指绝对路径 simpleDraweeView.setImageURI(uri);
-
代码自定义使用:
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources()); GenericDraweeHierarchy hierarchy = builder.setFadeDuration(1000) //设置实际图片的scaleType .setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP) .setActualImageFocusPoint(new PointF(1f, 1f)) //设置占位图drawable和scaleType .setPlaceholderImage(getResources().getDrawable(R.color.placeholder), ScalingUtils.ScaleType.CENTER_CROP) //设置error drawable和scaleType .setFailureImage(getResources().getDrawable(R.color.error), ScalingUtils.ScaleType.CENTER_CROP) //设置重试drawable, 记得在controller下设置setTapToRetryEnabled(true) .setRetryImage(getResources().getDrawable(R.color.retrying)) .build(); simpleDraweeView.setHierarchy(hierarchy); DraweeController controller = Fresco.newDraweeControllerBuilder() //tap-to-retry load image .setTapToRetryEnabled(true) //在构建新的控制器时需要setOldController,这可以防止重新分配内存 .setOldController(simpleDraweeView.getController()) //注意:uri是指绝对路径 .setUri(uri) .build(); simpleDraweeView.setController(controller);
具体使用可参考Fresco demo
官方推荐使用的显示图片类,输入一个URI,即可显示图片。可通过xml自定义图片的展示样式,也可以通过代码.setHierarchy(hierarchy)
和.setController(controller)
自定义。
初始化mSimpleDraweeControllerBuilder
的供应器sDraweeControllerBuilderSupplier
。需要在使用SimpleDraweeView
前调用,官方把该初始化放在Fresco.initializeDrawee(Context context)
。
设置URI。内部通过调用``mSimpleDraweeControllerBuilder构建一个控制器同时为控制器设置URI,然后调用
setController(controller)`为绘图层设置控制器,函数参数:
uri: 图片的 uri。支持的URIs: http://, https://, file://, content://, asset://, res://。具体介绍可见Supported URIs。
callerContext: 调用上下文。可以为`null`。
内部调用setImageURI(Uri uri, Object callerContext)
,callerContext
设为空
关闭供应器。把sDraweeControllerBuilderSupplier
设为空
视图层,用于组织和维护最终绘制和呈现的Drawable
对象。可自定义占位图、加载失败占位图、重新加载占位图、进度条、背景、叠加图、按压状态下的叠加图等多个呈现效果。
获取实际图片的后缩放边界。注:返回的边界不裁剪。参数: outBounds: 用于填充边界
获取圆形配置参数RoundingParams
。
返回视图层最顶部的drawable
。
恢复初始状态。通过controller
调用。
为实际图片添加颜色过滤器。参数: colorfilter: 颜色过滤器。
设置实际图片聚焦点。参数:
focusPoint: 聚焦点。同时需要把实际图片的缩放类型设置为ScaleType.FOCUS_CROP
。范围:左上角为(0,0),右下角为(1,1)。
设置实际图片的缩放类型。参数:
scaleType: 缩放类型。具体可见2.2.4 ScalingUtils.ScaleType
设置控制器覆盖层。由controller
调用。参数:
drawable: 用作展示控制器覆盖层。
当实际图片完全获取失败,则显示对应的占位符。由controller
调用。参数:
throwable: 失败异常
设置实际图片。由controller
调用。参数:
drawable: 实际图片drawable
。
immediate: 如果为true
,则立即显示图片(没有渐变效果)。
progress: 进度条数值,范围[0,100]。当设置了mProgressBarImage
,该值才有效。
设置占位图drawable
。缩放类型不变。
参考(11)。
更新进度条。由controller
调用。参数:
progress: 进度条数值,范围[0,100]。当设置了mProgressBarImage
,该值才有效。如果需要隐藏进度条,可把值设为100。
immediate: 如果为true
,则立即显示图片(没有渐变效果)。
渐显重新加载占位图mRetryImage
,如果mRetryImage
没设置则显示占位图mPlaceholderImage
。由controller
调用。
设置圆形参数。
Builder模式,用于构建GenericDraweeHierarchy
。
主要属性:
渐变效果时间默认时间为300。
默认缩放类型为ScaleType.CENTER_INSIDE
。
默认实际占位图缩放类型为ScaleType.CENTER_CROP
。
渐变效果时间。默认为DEFAULT_FADE_DURATION
。
占位图drawable
。默认为null
。
占位图缩放类型。默认为null
。
重新加载占位图。默认为null
。
重新加载占位图缩放类型。默认为null
。
失败占位图。默认为null
。
失败占位图缩放类型。默认为null
。
进度条占位图。默认为null
。
进度条占位图缩放类型。默认为null
。
实际图片缩放类型。默认为DEFAULT_ACTUAL_IMAGE_SCALE_TYPE
。
实际图片变换矩阵。默认为null
。
实际图片缩放聚焦点。当缩放类型为FOCUS_CROP
才有效。默认为null
。
实际图片颜色过滤器。默认为null
。
背景图片队列。默认为null
。
覆盖层队列。默认为null
。
按压状态下的覆盖层。默认为null
。
圆角配置参数。默认为null
。
主要函数:
构建GenericDraweeHierarchy
。代码如下:
public GenericDraweeHierarchy build() {
validate();
return new GenericDraweeHierarchy(this);
}
Builder模式,重置builder
状态。内部调用init()
。
Builder模式,设置实际图片颜色过滤器。
Builder模式,设置实际图片聚焦点。
Builder模式,设置实际图片的变换矩阵,并移除缩放类型。
Builder模式,设置实际图片的缩放类型,并移除变换矩阵。
Builder模式,设置单一背景。
Builder模式,设置背景。在层级结构和覆盖层被绘制前,按队列顺序绘制背景,第一个背景绘制在最底层。
Builder模式,设置渐变动画的时间。
Builder模式,设置失败占位图,其默认缩放类型为DEFAULT_SCALE_TYPE
。
Builder模式,设置失败占位图和其缩放类型。
Builder模式,设置单一覆盖层。
Builder模式,设置覆盖层。在层级结构和背景层被绘制后,按队列顺序绘制覆盖层,最后一个覆盖层绘制在最顶层。
(14). setPlaceholderImage(Drawable placeholderDrawable, ScalingUtils.ScaleType placeholderImageScaleType)
Builder模式,设置占位图和其缩放类型。默认使用透明的ColorDrawable
。
Builder模式,设置占位图,其默认缩放类型为DEFAULT_SCALE_TYPE
。占位图默认使用透明的ColorDrawable
。
Builder模式,设置按压状态下的覆盖层。
(17). setProgressBarImage(Drawable progressBarImage, ScalingUtils.ScaleType progressBarImageScaleType)
Builder模式,设置进度条和其缩放类型。
Builder模式,设置进度条,其默认缩放类型为DEFAULT_SCALE_TYPE
。
Builder模式,设置重新加载占位图和其缩放类型。
Builder模式,设置重新加载占位图,其默认缩放类型为DEFAULT_SCALE_TYPE
。
Builder模式,设置圆角参数。
图片缩放类型:
- CENTER:边界内居中,不缩放。
- CENTER_CROP:边界内居中,缩放子类使得两个尺寸(宽和高)大于或等于父类对应尺寸,并且至少有一个尺寸完全适合。
- CENTER_INSIDE:边界内居中,保留宽高比,缩放子类使其完全适应父类,如果子类比父类小,不需要按比例缩放。
- FIT_CENTER:边界内居中,保留宽高比,缩放子类使其完全适应父类,并且至少有一个尺寸完全适合。
- FIT_END:子类对其分类右下角,保留宽高比,缩放子类使其完全适应父类,并且至少有一个尺寸完全适合。
- FIT_START:子类对其分类左上角,保留宽高比,缩放子类使其完全适应父类,并且至少有一个尺寸完全适合。
- FIT_XY:分别缩放宽和高,使其完全适应父类。这将会改变宽高比。
- FOCUS_CROP:缩放子类使得两个尺寸(宽和高)大于或等于父类对应尺寸,并且至少有一个尺寸完全适合。 在父类边界内,尽可能不留空白区域,以子类的聚焦点居中。如果聚焦点设置为(0.5F,0.5F),则相当于CENTER_CROP。
视图层控制器接口。把视图view
的事件转发到控制器,控制器基于这些事件控制层级绘制。
主要接口:
返回Animatable
,让客户端能够控制该动画。
返回hierarchy
。
当包含层级结构hierarchy
的视图被暂时或永久附加到window
窗口时的回调接口。
当包含层级结构hierarchy
的视图暂时或永久与window
窗口分离时的回调接口。
当包含层级结构hierarchy
的视图接收到一个触摸事件时的回调接口。参数:
event: 触摸事件。
设置新的层级结构hierarchy
。
简单的视图控制生成器接口。
生成视图控制器。
Builder模式,设置回调上下文。
Builder模式,设置新的视图控制器时,需要重用旧的视图控制器的内存,这样可节省不必要的内存分配。
Builder模式,设置图片uri
。
drawee hierarchy
接口。视图结构层的基类,用于组织和维护最终绘制和呈现的Drawable对象。
返回是涂层顶部drawable
。
视图控制器DraweeController
和视图结构器DraweeHierarchy
的持有者,用于处理DraweeView
的回调事件。
创建一个新的DraweeHolder
实例。当activity
触发onStop
和onStart
方法时,将会通知该实例回调控制器onDetach
或onAttach
方法。
参数:
hierarchy: 视图结构层DraweeHierarchy
。在DraweeHolder
类里,只有一个DraweeHierarchy
单例。
context: 官方建议转换为ListenableActivity
作为上下文contetxt
。该方法将会调用registerWithContext(contetxt)
,不过已经被弃用。
返回控制器controller
,如果没设置则返回null
。
返回hierarchy
,,如果没设置则抛出空指针异常。
返回顶层视图,如果没设置则返回null
。
判断是否设置视图结构层hierarchy
。
通知控制器进入展示图片状态。在DraweeView
中,onFinishTemporaryDetach()
和onAttachedToWindow()
必须调用此方法。
释放使用的图片资源。在DraweeView
中,onStartTemporaryDetach()
和onDetachedFromWindow()
必须调用此方法。
顶部视图draw(canvas)
的回调接口。
view
的触摸事件,内部调用controller
的onTouchEvent
方法。
顶部视图可见性改变的回调接口。
已弃用。
设置新的控制器。
设置drawee hierarchy
。