KingFisher源码分析---|KingFisher源码分析--- 拓展
ImageTransition
在使用Kingfiser加载图片的时候setImage方法有一个回调
文章图片
image.png 发现有一个执行动画的代码
这个动画属性是在KingfisherOptionsInfoItem里面有一个case transition(ImageTransition)成员。
查看源码发现ImageTransition是一个动画枚举
文章图片
image.png 动画执行的方法是由于是写在KingfisherWrapper这个接口的拓展里所有UIimageView和UIImage都享有这个方法,r如果是他限制好了的4个只需要调用并限制时间,否则可以自定义UIView.AnimationOptions实现各种效果
文章图片
image.png 图片处理Processor
KignFisher提供了一套图片处理机制可以图片倒角部分区域倒角,添加各种滤镜、并设置相应的属性,可以说功能十分强大满足一些非图片处理软件的日常需求
文章图片
image.png 并且他将各个特效的实现写成了extension KingfisherWrapper where Base: Image { 意思是只有image的对象才可以实现这些效果而ImageProcessor则是实现组合了这些特效
imageDrawing
- 创建倒角和倒角方向的image对象
文章图片
image.png - 调整图片大小并设置相关contengmode
文章图片
image.png
Provider 上回说当我们设置setimage的时候会设计到一个Source枚举里面包含两个东西一个是URL叫network这个目标图像是从远程网络获取,还有一个是provider 来自本地存储或任何其他编码格式(如base64)。
文章图片
image.png
来自本地存储或任何其他编码格式(如base64)。
文章图片
image.png
文章图片
image.png
文章图片
image.png
所以只要自定义的图像符合上述要求即可成功加载到imageview控件上,并设置cachekey缓存起来
Gif图 当设置gif图的时候可以发现根据KingfisherOptionsInfoItem的preloadAllAnimationData值来判断设置加载方式如果是UIImage则只加载gif的第一张 如果是animationview可以设置加载gif图
所有的动画资源都应该被预加载,默认是不加载的,或者符合下面哪一个框架。当需要被加载的时候,如果该选项为true,所有的动画图像数据和解码将被加载到内存。这个操作主要是设置背式兼容性,不应该直接设置为true,应该选择imageview的类去加在gif数据,在KingFisher里有两个类支持绘制Gif图,AnimatedImageView,不预加载所有数据,他花费更少的内存。但是当cpu绘制的时候,uiimageview会加载完所有的数据,它使用更多的内存,但只有一帧的解码图像。
意思是如果使用预加载数据那么将使用UIImageVIew进行绘制,如果不适用预加载数据那么将会使用AnimationView来绘制这个Gif
文章图片
image.png
文章图片
image.png
文章图片
image.png
UIimageVIew预加载所有数据,而AnimationView不预加载所有数据这就说明当绘制Gif时候用AnimationView更加高效
文章图片
image.png AnimatedImageView 他和UIImageView的区别是 UIImageView不能控制进度暂停等操作
看KingFisher的下载流程最后一步是 将 base的image设置成了 返回值 可以发现 Animation的image属性被重写了当被赋值时会调用 reset方法当 Animator 对象为nil 那么会生成一个Animator对象
文章图片
image.png Animator对象是一个Gif构造器:
文章图片
image.png
animationFrames 是由一个一个 AnimatedFrame构成这个结构体里有帧的图像对象和停留时间
然后通过 Animator 里的 prepareFramesAsynchronously方法和 setupAnimatedFrames来获得数据, setupAnimatedFrames是通过 GIFAnimatedImage这个类工作,他将imageSource里的数据转成了 duration 和 image对象 并一帧一帧队列起来。
文章图片
image.png
根据这些参数可以构成一个Gif对象,最后通过displayLink来进行渲染执行该动画。
【KingFisher源码分析---|KingFisher源码分析--- 拓展】这里将Proxy 设置target来防止内存泄漏
文章图片
image.png
推荐阅读
- 如何寻找情感问答App的分析切入点
- D13|D13 张贇 Banner分析
- 自媒体形势分析
- 2020-12(完成事项)
- Android事件传递源码分析
- Python数据分析(一)(Matplotlib使用)
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- 泽宇读书会——如何阅读一本书笔记
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)