第一肯定是Fresco地址啦:https://github.com/facebook/fresco
gradle配置:
implementation 'com.facebook.fresco:fresco:1.13.0'
1.在Application 初始化
Fresco.initialize(this);
2.在xml中使用SimpleDraweeView
xmlns:app="http://schemas.android.com/apk/res-auto"
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/avatar" android:layout_width="60dp" android:layout_height="60dp" android:layout_margin="10dp" android:scaleType="fitXY" app:actualImageScaleType="fitCenter" // 实际图缩放类型 app:placeholderImage="@mipmap/ic_launcher" // 占位图 app:placeholderImageScaleType="centerInside" // 占位图缩放类型 app:progressBarImage="@mipmap/common_loading" // 加载图 app:progressBarImageScaleType="centerInside" // 加载图缩放类型 app:progressBarAutoRotateInterval="1000" // 加载时间 app:failureImage="@mipmap/ic_launcher" // 失败图 app:failureImageScaleType="centerInside" // 失败图缩放类型 app:retryImage="@mipmap/ic_launcher" // 重试图 app:retryImageScaleType="centerInside" // 重试图缩放类型 app:roundAsCircle="true" // 是否为圆角 app:roundedCornerRadius="30dp" // 圆角的大小 />
3,加载图片
int width = SystemUtil.dp2px(context, 50); int height = SystemUtil.dp2px(context, 50); ImageUtil.load((GenericDraweeView)helper.getView(R.id.avatar), "图片url", width, height);
public static void load(GenericDraweeView draweeView, String url, int width, int height) { Uri uri = Uri.parse(url); ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) .setResizeOptions(new ResizeOptions(width, height)) .build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setImageRequest(request) .setOldController(draweeView.getController()) .build(); draweeView.setController(controller); }
4.注意点,SimpleDraweeView必须设置大小
android:layout_width="60dp" android:layout_height="60dp"
5.缩放类型—ScaleType
类型 | 描述 |
---|---|
center | 居中,无缩放 |
centerCrop | 保持宽高比缩小或放大,使得两边都大于或等于显示边界。居中显示。 |
focusCrop | 同centerCrop, 但居中点不是中点,而是指定的某个点 |
centerInside | 使两边都在显示边界内,居中显示。如果图尺寸大于显示边界,则保持长宽比缩小图片。 |
fitCenter | 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示 |
fitStart | 同上。但不居中,和显示边界左上对齐 |
fitEnd | 同fitCenter, 但不居中,和显示边界右下对齐 |
fitXY | 不保存宽高比,填充满显示边界 |
none | 如要使用tile mode显示, 需要设置为none |
推荐使用:focusCrop 类型 Fresco中文说明对这一点也有详情的说明
6.总结
总结:
XML属性 | 意义 |
---|---|
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 | 控件纵横比 |
Fresco缓存也是一大亮点, 三级缓存,分别是 Bitmap缓存,未解码图片缓存, 文件缓存。
这里提一点Bitmap缓存:在5.0以下系统,Bitmap缓存位于ashmem,这样Bitmap对象的创建和释放将不会引发GC,更少的GC会使你的APP运行得更加流畅。5.0及其以上系统,相比之下,内存管理有了很大改进,所以Bitmap缓存直接位于Java的heap上。
另外,磁盘缓存还可以通过代码来设置不同手机的缓存容量:
public void initFresco(Context context, String diskCacheUniqueName){
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
.setMaxCacheSize(DISK_CACHE_SIZE_HIGH)
.setMaxCacheSizeOnLowDiskSpace(DISK_CACHE_SIZE_LOW)
.setMaxCacheSizeOnVeryLowDiskSpace(DISK_CACHE_SIZE_VERY_LOW)
.build();
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
.setMainDiskCacheConfig(diskCacheConfig)
.build();
Fresco.initialize(context, config);
}
Glide缓存(比较,有兴趣的人也可以使用这个,个人认为对于目前手机内存来说Fresco更合适)
Glide虽然只有内存和磁盘缓存,在性能上比不上Fresco;但他也有另外的优点, Fresco缓存的时候,只会缓存原始图像,而Glide则会根据ImageView控件尺寸获得对应的大小的bitmap来展示,从而缓存也可以针对不同的对象:原始图像(source),结果图像(result); 可以通过.diskCacheStrategy()方法设置