KingFisher源码分析--- 拓展

ImageTransition

在使用Kingfiser加载图片的时候setImage方法有一个回调


KingFisher源码分析--- 拓展_第1张图片
image.png

发现有一个执行动画的代码
这个动画属性是在KingfisherOptionsInfoItem里面有一个case transition(ImageTransition)成员。
查看源码发现ImageTransition是一个动画枚举


KingFisher源码分析--- 拓展_第2张图片
image.png

动画执行的方法是由于是写在KingfisherWrapper这个接口的拓展里所有UIimageView和UIImage都享有这个方法,r如果是他限制好了的4个只需要调用并限制时间,否则可以自定义UIView.AnimationOptions实现各种效果


KingFisher源码分析--- 拓展_第3张图片
image.png

图片处理Processor

KignFisher提供了一套图片处理机制可以图片倒角部分区域倒角,添加各种滤镜、并设置相应的属性,可以说功能十分强大满足一些非图片处理软件的日常需求

KingFisher源码分析--- 拓展_第4张图片
image.png

并且他将各个特效的实现写成了extension KingfisherWrapper where Base: Image { 意思是只有image的对象才可以实现这些效果而ImageProcessor则是实现组合了这些特效

imageDrawing

  1. 创建倒角和倒角方向的image对象


    KingFisher源码分析--- 拓展_第5张图片
    image.png
  2. 调整图片大小并设置相关contengmode


    KingFisher源码分析--- 拓展_第6张图片
    image.png

...

Provider

上回说当我们设置setimage的时候会设计到一个Source枚举里面包含两个东西一个是URL叫network这个目标图像是从远程网络获取,还有一个是provider 来自本地存储或任何其他编码格式(如base64)。


KingFisher源码分析--- 拓展_第7张图片
image.png

来自本地存储或任何其他编码格式(如base64)。

KingFisher源码分析--- 拓展_第8张图片
image.png

KingFisher源码分析--- 拓展_第9张图片
image.png

KingFisher源码分析--- 拓展_第10张图片
image.png

所以只要自定义的图像符合上述要求即可成功加载到imageview控件上,并设置cachekey缓存起来

Gif图

当设置gif图的时候可以发现根据KingfisherOptionsInfoItem的preloadAllAnimationData值来判断设置加载方式如果是UIImage则只加载gif的第一张 如果是animationview可以设置加载gif图

所有的动画资源都应该被预加载,默认是不加载的,或者符合下面哪一个框架。当需要被加载的时候,如果该选项为true,所有的动画图像数据和解码将被加载到内存。这个操作主要是设置背式兼容性,不应该直接设置为true,应该选择imageview的类去加在gif数据,在KingFisher里有两个类支持绘制Gif图,AnimatedImageView,不预加载所有数据,他花费更少的内存。但是当cpu绘制的时候,uiimageview会加载完所有的数据,它使用更多的内存,但只有一帧的解码图像。
意思是如果使用预加载数据那么将使用UIImageVIew进行绘制,如果不适用预加载数据那么将会使用AnimationView来绘制这个Gif

KingFisher源码分析--- 拓展_第11张图片
image.png

image.png

image.png

UIimageVIew预加载所有数据,而AnimationView不预加载所有数据这就说明当绘制Gif时候用AnimationView更加高效

KingFisher源码分析--- 拓展_第12张图片
image.png

AnimatedImageView

他和UIImageView的区别是 UIImageView不能控制进度暂停等操作

看KingFisher的下载流程最后一步是 将 base的image设置成了 返回值 可以发现 Animation的image属性被重写了当被赋值时会调用 reset方法当 Animator 对象为nil 那么会生成一个Animator对象


KingFisher源码分析--- 拓展_第13张图片
image.png

Animator对象是一个Gif构造器:

KingFisher源码分析--- 拓展_第14张图片
image.png

animationFrames 是由一个一个 AnimatedFrame构成这个结构体里有帧的图像对象和停留时间
然后通过 Animator 里的 prepareFramesAsynchronously方法和 setupAnimatedFrames来获得数据, setupAnimatedFrames是通过 GIFAnimatedImage这个类工作,他将imageSource里的数据转成了 duration 和 image对象 并一帧一帧队列起来。
KingFisher源码分析--- 拓展_第15张图片
image.png

根据这些参数可以构成一个Gif对象,最后通过displayLink来进行渲染执行该动画。

这里将Proxy 设置target来防止内存泄漏


KingFisher源码分析--- 拓展_第16张图片
image.png

你可能感兴趣的:(KingFisher源码分析--- 拓展)