1、概述
优点:
- Fresco是FaceBook开源的Android平台图片加载库,同时也支持ReactNative
- 支持从网络,ContentProvider,本地存储,Asset,Resource数据源加载图片
- 两级内存缓存,Memory&Disk
- 支持JPEG,PNG,Progressive JPEG,Gif,WebP格式
- 支持图片从模糊到清晰的渐进式加载
- 采用了类似GC的引用计数机制,使不再使用的图片对象可以更早的被回收,降低内存的开销。
缺点:
- 包很大,>= 500k
- API不够简洁
gitHub地址: GitHub - facebook/fresco: An Android library for managing images and the memory they use.
文档地址: 引入Fresco
2、快速使用
-
在Application中进行初始化
class MyApplication : Application { override fun onCreate() { super.onCreate() Fresco.initialize(this) } }
-
使用SimpleDraweeView放置图片
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="130dp" android:layout_height="130dp" fresco:placeholderImage="@drawable/my_drawable" />
-
代码控制加载图片
uri = Uri.parse("raw.githubusercontent.com/facebook/fr…"); my_image_view.setImageURI(uri);
剩下的,Fresco会替你完成:
-
显示占位图直到加载完成;
-
下载图片;
-
缓存图片;
-
图片不再显示时,从内存中移除;
2.1 支持的URI
1. 远程图片:
2. 本地图片:
3. Content provider
4. asset目录下的资源
5. res目录下的资源
6. Uri中指定图片数据
-
即Fresco支持OKhttp网络库,或者自己编写的网络库
-
Fresco 不支持 相对路径的URI,所有的 URI 都必须是绝对路径,并且带上该 URI 的 scheme。
2.2 相关参数
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="20dp"
android:layout_height="20dp"
fresco:fadeDuration="300"-----淡入淡出动画持续时间
fresco:actualImageScaleType="focusCrop"-----设置缩放类型
fresco:placeholderImage="@color/wait_color"-----占位图
fresco:placeholderImageScaleType="fitCenter"-----占位图缩放类型
fresco:failureImage="@drawable/error"-----加载失败图
fresco:failureImageScaleType="centerInside"-----加载失败图缩放类型
fresco:retryImage="@drawable/retrying"-----点击重新加载图
fresco:retryImageScaleType="centerCrop"-----重新加载图缩放类型
fresco:progressBarImage="@drawable/progress_bar"-----进度条图
fresco:progressBarImageScaleType="centerInside"-----进度条图缩放类型
fresco:progressBarAutoRotateInterval="1000"-----进度条图片自动旋转时间间隔
fresco:backgroundImage="@color/blue"-----背景图
fresco:overlayImage="@drawable/watermark"-----叠加图
fresco:pressedStateOverlayImage="@color/red"-----按压状态时显示的叠加图
fresco:roundAsCircle="false"-----是否为圆形
fresco:roundedCornerRadius="1dp"-----圆角半径
fresco:roundTopLeft="true"-----左上角为圆角
fresco:roundTopRight="false"-----右上角不为圆角
fresco:roundBottomLeft="false"-----左下角不为圆角
fresco:roundBottomRight="true"-----右下角为圆角
fresco:roundWithOverlayColor="@color/corner_color"----圆形或圆角四个角漏出的颜色
fresco:roundingBorderWidth="2dp"-----圆形或圆角的边框宽度
fresco:roundingBorderColor="@color/border_color"-----圆形或圆角的边框颜色
/>
3、原理简析
- Drawees 负责图片的呈现
- Image Pipeline 负责图片的获取和管理。
3.1 Drawees功能:
- 设置要加载的图片
- 设置占位图
- 设置加载失败时的占位图
- 点击重新加载
- 显示一个进度条
- 设置背景
- 叠加图
- 按压状态下的叠加图
- 缩放
- 圆角和圆圈
- 使用ControllerBuilder
- 渐进式JPEG图
- 动画支持(GIF 和 WebP 格式的动画)
- 多图请求及图片复用
- 监听下载事件
- 缩放和旋转图片
- 修改图片
- 图片请求(Image Requests)
- 自定义View
3.2 Image Pipeline功能
- 配置Image Pipeline
- 缓存
- 直接使用Image Pipeline
- 数据源和数据订阅者
- 可关闭的引用
- Webp支持
3.3 Image Pipeline加载流程
-
检查内存缓存,如有,返回
-
后台线程开始后续工作
-
检查是否在未解码内存缓存中。如有,解码,变换,返回,然后缓存到内存缓存中。
-
检查是否在磁盘缓存中,如果有,变换,返回。缓存到未解码缓存和内存缓存中。
-
从网络或者本地加载。加载完成后,解码,变换,返回。存到各个缓存中。
3.4 三级缓存:
-
Bitmap缓存
-
未解码图片的内存缓存
- 原始压缩格式的图片,需要解码,如果有调整大小,旋转,或者WebP编码转换工作需要完成,这些工作会在解码之前进行
-
磁盘缓存
- 未解码的原始压缩格式的图片