公司换Fresco框架,叫我负责去调研和封装,查了Fresco的官方中文文档总结如下,
1,整体框架图
DraweeView:
Xml中不支持wrap_content属性,但是使用viewAspectRatio
固定宽高比可以使用wrap_content
使用:
mSimpleDraweeView.setImageURI(uri);
代码中设置:
创建一个 builder 然后设置给 DraweeView:
GenericDraweeHierarchyBuilder builder =
new GenericDraweeHierarchyBuilder(getResources());
GenericDraweeHierarchy hierarchy = builder
.setFadeDuration(300)
.setPlaceholderImage(new MyCustomDrawable())
.setBackgrounds(backgroundList)
.setOverlays(overlaysList)
.build();
mSimpleDraweeView.setHierarchy(hierarchy);
注意点:
1,创建 DraweeHierarchy 耗时,同一个View不要多次调用setHierarchy,一个DraweeHierarchy 不可以被多个 View 共用,
2,可以运行时修改 DraweeHierarchy的属性(比如占位图,失败图之类的)
3,进度条hierarchy .setProgressBarImage(new ProgressBarDrawable()),
4,圆角显示方式hierarchy.setRoundingParams(roundingParams);
ControllerBuilder:对加载图片更多控制
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setTapToRetryEnabled(true)//点击重新加载
.setOldController(mSimpleDraweeView.getController())
.setControllerListener(listener)
.build();
mSimpleDraweeView.setController(controller);
注意:指定一个新的controller的时候,使用setOldController,这可节省不必要的内存分配
controller.setControllerListener(listener):监听图片下载事件,可处理加载完和加载中加载失败的逻辑,这里无法修改图片,修改图片可以在后处理器Postprocessor中
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setPostprocessor(myPostprocessor)
.build();
Postprocessor :重写process方法,可以对bitmap做出操作
不要重写多于 1 个的 process 方法。这么做可能造成无法预测的结果。
controller.setImageRequest(request);
process(Bitmap bitmap) ,
1,图片在进入后处理器(postprocessor)的图片是原图的一个完整拷贝,原来图片不受修改的影响。
2,后处理器现在不支持 动图加载 。
3,在开始一个图片显示时,即使是反复显示同一个图片,在每次进行显示时,都需要指定后处理器。对于同一个图片,每次显示可以使用不同的后处理器
process(Bitmap destBitmap, Bitmap sourceBitmap)
1,源图片和目标图片具有相同的大小。
2,不要修改源图片。在未来的版本中这会抛出一个异常。
3,不要保存对任何一个图片的引用。它们的内存会由 image pipeline 进行管理,目标图片会在 Drawee 或 DataSource 中正常地销毁。
process(Bitmap sourceBitmap,PlatformBitmapFactory bitmapFactory)
1,如果处理后的图片大小需要和原图片不同,可以使用这个
2,不要使用 Android 中 Bitmap.createBitmap() 方法,它会在 Java 堆内存中产生一个 bitmap 对象。
渐进式加载
request.setProgressiveRenderingEnabled(true)
动画支持: 支持GIF 和 WebP
controller.setAutoPlayAnimations(true)//图片下载完自动播放,view移除,停止播放
1,更多情况可设置下载监听灵活运用
controller .setControllerListener(controllerListener);
1,动画现在还不支持 postprocessors
先后分别显示两个分辨率的图(先显示低分辨率的图后高分辨率的图)
.setLowResImageRequest(ImageRequest.fromUri(lowResUri))
.setImageRequest(ImageRequest.fromUri(highResUri))
注意:动图无法在低分辨率那一层显示。
加载最先可用的图片
Uri uri1, uri2;
ImageRequest request = ImageRequest.fromUri(uri1);
ImageRequest request2 = ImageRequest.fromUri(uri2);
ImageRequest[] requests = { request1, request2 };
controller.setFirstAvailableImageRequests(requests)
按顺序去加载,第一个加载到的显示
缩放和旋转图片
Scaling 是一种画布操作,通常是由硬件加速的。图片实际大小保持不变,它只不过在绘制时被放大或缩小。
Resizing 是一种软件执行的管道操作。它返回一张新的,尺寸不同的图片。
Downsampling 同样是软件实现的管道操作。它不是创建一张新的图片,而是在解码时改变图片的大小。
ImageRequestBuilder:配置更多的request设置
ImageRequest request = ImageRequestBuilder
.newBuilderWithSource(uri)
.setImageDecodeOptions(decodeOptions)
.setAutoRotateEnabled(true)
.setLocalThumbnailPreviewsEnabled(true)
.setLowestPermittedRequestLevel(RequestLevel.FULL_FETCH)
.setProgressiveRenderingEnabled(false)
.setResizeOptions(new ResizeOptions(width, height))
.build();
· uri - 唯一的必选的成员. 参考 支持的URIs
· autoRotateEnabled - 是否支持自动旋转.
· progressiveEnabled - 是否支持渐进式加载.
· postprocessor - 后处理器(postprocess).
· resizeOptions - 图片缩放选项,用前请先阅读缩放和旋转.