上篇文章讲了fresco图片最基本的加载方式,这篇讲讲他的进阶
基本概念:
Drawees
Drawee是图片的渲染控件,有三部分组成,类似MVC框架.
DraweeView
继承自Android的View类.
我们应当在app的XML或java代码使用SimpleDraweeView类,调用其setImageURI方法,加载图片的URL。
DraweeView的其他xml属性介绍,后面再补充。
DraweeHierarchy
DraweeHierarchy是实质上渲染图片内容的类,可以把它当作MVC中的Model,并且我们可以通过它在java代码里设置图片的属性。
DraweeController
DraweeController类负责框架底层的图片加载,如果我们不仅仅是需要一个简单的URI来指定要显示的图片,那么我们就会用到这个类。
DraweeControllerBuilder
DraweeController一旦创建便不可更改,他们通过建造者模式创建。
Listener
只要用了builder指定了一个Listener,那么可以利用数据从服务器传输到客户端的传输比率。
The Image Pipeline
Fresco通过Image Pipeline(图形管道)完成图片的获取,不管是通过网络、本地文件、content provider 还是本地资源,它都把图片压缩并缓存到本地,并且把内存作为第二缓存存储着解压后的图片。
图形管道使用pinned purgeable技术将图片存储到java堆中,当管道的任务完成时,需要调用者 close图片。
SimpleDraweeView自动为我们做了这些,因此,这个View应该是我们的首选,只有很少的app需要直接的使用图形管道。
1,首先初始化,规定不同图片大小质量存储在不同的保存方式
(一)在Appliaction中进行初始化
Fresco.initialize(this, FrescoConfig.getImagePipelineConfig(this));
(二)对于fresco进行初始化配置;
ImagePipelineConfig:本身就是一个图片加载组件;
大致流程如下:
检查内存缓存,如有,返回
后台线程开始后续工作
检查是否在未解码内存缓存中。如有,解码,变换,返回,然后缓存到内存缓存中。
检查是否在文件缓存中,如果有,变换,返回。缓存到未解码缓存和内存缓存中。
从网络或者本地加载。加载完成后,解码,变换,返回。存到各个缓存中。
图片加载组件
public static ImagePipelineConfig getImagePipelineConfig(Context context) {
if (sImagePipelineConfig == null) {
sImagePipelineConfig = configureCaches(context);
}
return sImagePipelineConfig;
}
基本控件配置
private static ImagePipelineConfig configureCaches(Context context) {
final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams(
FrescoConfig.MAX_MEMORY_CACHE_SIZE, // Max total size of elements in the cache
Integer.MAX_VALUE, // Max entries in the cache
FrescoConfig.MAX_MEMORY_CACHE_SIZE, // Max total size of elements in eviction queue
Integer.MAX_VALUE, // Max length of eviction queue
Integer.MAX_VALUE); // Max cache entry size
//修改内存图片缓存数量
Supplier<MemoryCacheParams> mSupplierMemoryCacheParams = new Supplier<MemoryCacheParams>() {
@Override
public MemoryCacheParams get() {
return bitmapCacheParams;
}
};
//小图片的磁盘配置
DiskCacheConfig diskSmallCacheConfig = DiskCacheConfig.newBuilder(context)
.setBaseDirectoryPath(FileUtil.getExternalCacheDir(context))
.setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR)
.setMaxCacheSize(FrescoConfig.MAX_DISK_CACHE_SIZE)
.setMaxCacheSizeOnLowDiskSpace(MAX_SMALL_DISK_LOW_CACHE_SIZE)
.setMaxCacheSizeOnVeryLowDiskSpace(MAX_SMALL_DISK_VERYLOW_CACHE_SIZE)
.build();
//默认图片的磁盘配置
DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
.setBaseDirectoryPath(Environment.getExternalStorageDirectory().getAbsoluteFile())
.setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)
.setMaxCacheSize(FrescoConfig.MAX_DISK_CACHE_SIZE)
.setMaxCacheSizeOnLowDiskSpace(MAX_DISK_CACHE_LOW_SIZE)
.setMaxCacheSizeOnVeryLowDiskSpace(MAX_DISK_CACHE_VERYLOW_SIZE)
.build();
//缓存图片配置
ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context)
.setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams)
.setMainDiskCacheConfig(diskCacheConfig)
.setSmallImageDiskCacheConfig(diskSmallCacheConfig);
return configBuilder.build();
}
以上操作完成之后,就开始可以使用fresco进行图片加载了,当然你也不需要在activity或者fragment里面进行初始化咯。下面正式开始:
1,xml中定义
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/simpleDraweeView"
android:layout_width="150dp"
android:layout_height="150dp"/>
2,加载普通图片,两种方式(simpleDraweeView 表示显示图片的控件,url 图片链接)
(1)直接设置
simpleDraweeView.setImageURI(Uri.parse(url));
(2)添加控制器
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
.setUri(Uri.parse(url))
.setAutoPlayAnimations(true)
.build();
simpleDraweeView.setController(controller);
上述方法的确满足图片加载,但是有些情况如果需要一个占位图,图片显示错误图片肯定就没有办法满足了。
DraweeHierarchy是实质上渲染图片内容的类,可以把它当作MVC中的Model,并且我们可以通过它在java代码里设置图片的属性。:
public static GenericDraweeHierarchy getGenericDraweeHierarchy(Context context) {
GenericDraweeHierarchy gdh = new GenericDraweeHierarchyBuilder(context.getResources())
.setFailureImage(context.getResources().getDrawable(R.mipmap.icon_failure), ScalingUtils.ScaleType.FIT_XY)//fresco:failureImage="@drawable/error"失败图
.setPlaceholderImage(context.getResources().getDrawable(R.mipmap.ic_placeholder), ScalingUtils.ScaleType.FIT_XY)//fresco:placeholderImage="@color/wait_color"占位图
.reset()//重置
.setActualImageColorFilter(colorFilter)//颜色过滤
.setActualImageFocusPoint(focusPoint)//focusCrop, 需要指定一个居中点
.setActualImageMatrix(actualImageMatrix)
.setActualImageScaleType(actualImageScaleType)//fresco:actualImageScaleType="focusCrop"缩放类型
.setBackground(background)//fresco:backgroundImage="@color/blue"背景图片
.setBackgrounds(backgrounds)
.setFadeDuration(fadeDuration)//fresco:fadeDuration="300"加载图片动画时间
.setOverlay(overlay)//fresco:overlayImage="@drawable/watermark"叠加图
.setOverlays(overlays)
.setPressedStateOverlay(drawable)//fresco:pressedStateOverlayImage="@color/red"按压状态下的叠加图
.setProgressBarImage(new ProgressBarDrawable())//进度条fresco:progressBarImage="@drawable/progress_bar"进度条
.setProgressBarImage(progressBarImage, progressBarImageScaleType)//fresco:progressBarImageScaleType="centerInside"进度条类型
.setRetryImage(retryDrawable)//fresco:retryImage="@drawable/retrying"点击重新加载
.setRetryImage(retryDrawable, retryImageScaleType)//fresco:retryImageScaleType="centerCrop"点击重新加载缩放类型
.setRoundingParams(RoundingParams.asCircle())//圆形/圆角fresco:roundAsCircle="true"圆形
.build();
return gdh;
}
simpleDraweeView图片设置属性
simpleDraweeView.setHierarchy(getGenericDraweeHierarchy(context));
以上就可以满足,即可以正常显示图片,当图片出现问题的情况下也可以正常显示