一、概述
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)动态展示图片
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);
四、源码解析
推荐博客:
http://blog.csdn.net/column/details/master-fresco.html
结束语:
首先感谢尚硅谷无偿提供的学习资料。写博客是为了帮助开发者学习使用技术,同时巩固自己所学技术。如果此篇博客有助于您的学习,那是我的荣幸!如果此篇博客有任何瑕疵,请多多指教!在此感谢您的学习和指教!