Fresco简单的使用
1,概述:
Fresco是一个强大的图片加载组件,使用简单,无须关心加载和显示的问题,支持android2.3之后的版本.
Fresco:壁画; 温壁画技法
2,模块分类
Image Pipeline
Fresco 中设计有一个叫做 Image Pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。
为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级磁盘)。
Drawees
Fresco 中设计有一个叫做 Drawees 模块,它会在图片加载完成前显示占位图,加载成功后自动替换为目标图片。
当图片不再显示在屏幕上时,它会及时地释放内存和空间占用。
3,Fresco特性
内存管理
解压后的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。
在5.0以下,GC将会显著地引发界面卡顿。
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。
这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。
图片加载
Fresco的Image Pipeline允许你用很多种方式来自定义图片加载过程:
为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片
先显示一个低清晰度的图片,等高清图下载完之后再显示高清图
加载完成回调通知
对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图
缩放或者旋转图片
对已下载的图片再次处理
支持WebP解码,即使在早先对WebP支持不完善的Android系统上也能正常使用!
图片绘制
Fresco 的 Drawees 设计,带来一些有用的特性:
自定义居中焦点
圆角图,当然圆圈也行
下载失败之后,点击重现下载
自定义占位图,自定义overlay, 或者进度条
指定用户按压时的overlay
图片的渐进式呈现
渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片
,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理。
动图加载
加载Gif图和WebP动图在任何一个Android开发者眼里看来都是一件非常头疼的事情。每一帧都是一张很大的Bitmap,每一个动画都有很多帧。
Fresco让你没有这些烦恼,它处理好每一帧并管理好你的内存。
4,使用前的配置:
app/build.gradle中添加依赖同步:
implementation 'com.facebook.fresco:fresco:1.11.0'
// 支持webp
compile 'com.facebook.fresco:webpsupport:1.3.0'
// gif加载使用
compile 'com.facebook.fresco:animated-gif:1.3.0'
// WebP(静态图+动图)加载使用
compile 'com.facebook.fresco:animated-webp:1.3.0'
AndroidManifest清单文件:
<uses-permission android:name="android.permission.INTERNET"/>
5,SimpleDraweeView的属性
缩放类型—ScaleType:
类型 描述
center 居中,无缩放
centerCrop 保持宽高比缩小或放大,使得两边都大于或等于显示边界。居中显示。
focusCrop 同centerCrop, 但居中点不是中点,而是指定的某个点
centerInside 使两边都在显示边界内,居中显示。如果图尺寸大于显示边界,则保持长宽比缩小图片。
fitCenter 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示
fitStart 同上。但不居中,和显示边界左上对齐
fitEnd 同fitCenter, 但不居中,和显示边界右下对齐
fitXY 不保存宽高比,填充满显示边界
none 如要使用tile mode显示, 需要设置为none
推荐使用:focusCrop 类型
自定义控件的属性大全解释:
fadeDuration 淡入淡出动画持续时间(单位:毫秒ms)
actualImageScaleType 实际图像的缩放类型
placeholderImage 占位图
placeholderImageScaleType 占位图的缩放类型
progressBarImage 进度图
progressBarImageScaleType 进度图的缩放类型
progressBarAutoRotateInterval 进度图自动旋转间隔时间(单位:毫秒ms)
failureImage 失败图
failureImageScaleType 失败图的缩放类型
retryImage 重试图
retryImageScaleType 重试图的缩放类型
backgroundImage 背景图
overlayImage 叠加图
pressedStateOverlayImage 按压状态下所显示的叠加图
roundAsCircle 设置为圆形图
roundedCornerRadius 圆角半径
roundTopLeft 左上角是否为圆角
roundTopRight 右上角是否为圆角
roundBottomLeft 左下角是否为圆角
roundBottomRight 右下角是否为圆角
roundingBorderWidth 圆形或者圆角图边框的宽度
roundingBorderColor 圆形或者圆角图边框的颜色
roundWithOverlayColor 圆形或者圆角图底下的叠加颜色(只能设置颜色)
viewAspectRatio 控件纵横比
6 SimpleDraweeView的使用注意
SimpleDraweeView的width和height属性必须是明确值,
而不能直接用wrap_content这种内容填充的数值,当然有一种情况例外,就是宽度和高度有一个是固定的,然后设置了二者的比例
app:viewAspectRatio="1.5"
mSimpleDraweeView.setAspectRatio(1.33f); // 设置宽高比为4:3
7 Fresco加载图片方式:
Fresco 只能使用绝对路径,不能使用相对路径
Fresco加载不同来源的图片:
- 加载本地res:(res://)
- 加载本地asset:(asset:///)
- 加载本地文件:(file:// )
- 加载Contentprovider图片:(content://)
- 加载远程图片:(http://)
ControllerListener
/**
* Interface for {@link AbstractDraweeController} listener.
*接口监听回调
* <p> Controller id is passed to each of the listener methods which is useful for debugging and
* instrumentation purposes where those events can then be associated with a sequence. Subscriber
* is free to completely ignore this id, as late callbacks and other such correctness issues are
* taken care of by the controller itself.
*控制器id被传递给每个侦听器方法,这对于调试和*检测目的很有用,然后这些事件可以与序列相关联。
订阅服务器*可以完全忽略此id,因为延迟回调和其他此类正确性问题由控制器本身处理。
* @param <INFO> image info type
*/
public interface ControllerListener<INFO> {
/**
* Called before the image request is submitted.
在提交图像请求之前调用。
* <p> IMPORTANT: It is not safe to reuse the controller from within this callback!
重要:在此回调中重用控制器是不安全的!
* @param id controller id
* @param callerContext caller context
*/
void onSubmit(String id, Object callerContext);
/**
* Called after the final image has been set.
在设置了最终图像之后调用。
* @param id controller id
* @param imageInfo image info
* @param animatable
*/
void onFinalImageSet(String id, @Nullable INFO imageInfo, @Nullable Animatable animatable);
/**
* Called after any intermediate image has been set.
在设置了任何中间映像之后调用。
* @param id controller id
* @param imageInfo image info
*/
void onIntermediateImageSet(String id, @Nullable INFO imageInfo);
/**
* Called after the fetch of the intermediate image failed.
在获取中间映像失败后调用。
* @param id controller id
* @param throwable failure cause
*/
void onIntermediateImageFailed(String id, Throwable throwable);
/**
* Called after the fetch of the final image failed.
在获取最终图像失败后调用。
* @param id controller id
* @param throwable failure cause
*/
void onFailure(String id, Throwable throwable);
/**
* Called after the controller released the fetched image.
在控制器释放获取的映像后调用。
* <p> IMPORTANT: It is not safe to reuse the controller from within this callback!
* @param id controller id
*/
void onRelease(String id);
}
8 参看文献
https://www.jianshu.com/p/67731283788a
Fresco中文说明:http://www.fresco-cn.org/
Fresco项目GitHub地址:https://github.com/facebook/fresco