解密 iOS 类库iOS 开发每天分享优质文章iOS Developer

iOS 播放动图的第三方框架简单调研

2016-12-01  本文已影响330人  阿瑟李

SDWebImage

在使用SDWebImage 作为图片加载缓存框架的时候 支持 gif 和 webp 格式的图片
优点就是集成在图片缓存库中 简单实用

GIF

利用 CGImageSourceCreateWithData 解析图片数据
然后 利用 CGImageSourceGetCount 分析图片资源帧数
如果帧数大于 1, 则获取每一帧的图片与持续时间, 得到图片数组和总时长
最后使用

+ (nullable UIImage *)animatedImageWithImages:(NSArray<UIImage *> *)images duration:(NSTimeInterval)duration 

生成动画 image

缺陷是每一张图片的时长平均分配, 性能低, 占用内存
优点是系统 API 简单

webp

使用了 libwebp 框架, 分析图片数据, 如果图片数据有效, 解析出 WebPDecoderConfig
对象, 然后通过 CGImageCreate 方法重绘图片

FLAnimatedImage

专注于显示 GIF 的第三方框架 功能强大 支持GIF 帧级别的缓存 优化 显示GIF 内存 优化了拖动时候的显示效果 支持 GIF 的属性 (每帧的 delay/ 循环次数 等等)
缺点就是使用的自定义控件 只能支持 GIF

实现原理

获取GIF 数据
根据 NSData 生成 FLAnimatedImage 对象
使用NSHashTable作为图片的简单缓存 收到内存警告的时候 clean
也是通过数据 获取 CGImageSourceRef 并且获取每一帧图片(只缓存要显示的第一张图片) 获取每一帧的 delay time
FLAnimatedImage 对象 赋值给 FLAnimatedImageView 对象 显示 GIF
FLAnimatedImageView 是 UIImageView 的子类
FLAnimatedImageView 使用的是 CADisplayLink 执行动画 并且可以自定义 runloop Mode
CADisplayLink 根据每帧的时长显示切换图片

YYImage

强大的功能, 几乎支持所有类型的图片

Display/encode/decode animated image with these types:

    WebP, APNG, GIF.

Display/encode/decode still image with these types:

    WebP, PNG, GIF, JPEG, JP2, TIFF, BMP, ICO, ICNS.

Baseline/progressive/interlaced image decode with these types:

    PNG, GIF, JPEG, BMP.

显示动图

YYAnimatedImageView 是 UIImageView 的子类, YYAnimatedImage
当赋值的 image 满足 YYAnimatedImage 协议的话 则显示动画

YYAnimatedImageView 显示的基本逻辑与FLAnimatedImageView基本相同
但是 YYAnimatedImageView 的优点就是更好的封装 基本使用起来和原生毫无区别 满足原生的动画播放 高亮 普通图片等多种原生的功能
在线程安全上也更加严谨 使用了锁和队列来控制

实现图片动画

YYSpriteSheetImage 类实现了 YYAnimatedImage 协议 可以通过设置图片和图片帧 content
rect 信息和图片帧持续时间信息 来实现一张图片的动画变换效果

实现类gif效果(可以自定义每帧时长)的图片组动画

YYFrameImage 类实现了 YYAnimatedImage 协议 可以通过设置图片(或者路径) 和 每张图片的持续时间 来实现 动画切换动画

     NSArray *paths = @[@"/ani/frame1.png", @"/ani/frame2.png", @"/ani/frame3.png"];
     NSArray *times = @[@0.1, @0.2, @0.1];
     YYFrameImage *image = [YYFrameImage alloc] initWithImagePaths:paths frameDurations:times repeats:YES];
     YYAnimatedImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
     [view addSubView:imageView];

类的介绍

YYImage 是 UIImage 的子类, 基础类, 实现了 YYAnimatedImage 协议, 通过 data 解析出图片类型 YYImageType

YYImage 的核心类, YYImageCoder, 图片编码/解码器, YYImage 的核心, 也是最大的一个类 有约 3000 行的代码

YYImageFrame 图片帧对象 提供图片帧的基本信息
YYImageDecoder 图片解码器 解析 NSData
YYImageEncoder 图片编码器 把UIImage 编码程某一种格式的文件

**

上一篇下一篇

猜你喜欢

热点阅读