美文网首页
YYImage之YYSpriteSheetImage

YYImage之YYSpriteSheetImage

作者: MaZengyi | 来源:发表于2017-01-08 02:10 被阅读269次

SpriteSheetImage 从一张大图片上面提取多个小图片来组成一个动画,将多个小图片集成到大图片的好处是可以节省多张图片占据的容量,优化安装包大小。

YYSpriteSheetImage 初始化方法只有一个

- (nullable instancetype)initWithSpriteSheetImage:(UIImage *)image
                                     contentRects:(NSArray<NSValue *> *)contentRects
                                   frameDurations:(NSArray<NSNumber *> *)frameDurations
                                        loopCount:(NSUInteger)loopCount;

需要传入一张完整的大图,每张小图的 rect ,动画时间,动画循环次数。

- (instancetype)initWithSpriteSheetImage:(UIImage *)image
                            contentRects:(NSArray *)contentRects
                          frameDurations:(NSArray *)frameDurations
                               loopCount:(NSUInteger)loopCount {
    if (!image.CGImage) return nil;
    if (contentRects.count < 1 || frameDurations.count < 1) return nil;
    if (contentRects.count != frameDurations.count) return nil;
    
    self = [super initWithCGImage:image.CGImage scale:image.scale orientation:image.imageOrientation];
    if (!self) return nil;
    
    _contentRects = contentRects.copy;
    _frameDurations = frameDurations.copy;
    _loopCount = loopCount;
    return self;
}

在内部只是持有这个图片的 image 对象,而在展示的时候才会去截取相应的 rect 的图片。

在来看如何实现 YYAnimatedImage 的协议来播放动画。

返回帧数

- (NSUInteger)animatedImageFrameCount {
    return _contentRects.count;
}

返回循环次数

- (NSUInteger)animatedImageLoopCount {
    return _loopCount;
}

返回每一帧的图片

- (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index {
    return self;
}

每一帧播放的时间

- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index {
    if (index >= _frameDurations.count) return 0;
    return ((NSNumber *)_frameDurations[index]).doubleValue;
}

这个方法与其他不同,它返回每一帧的 rect,也就是每一帧图片显示的范围,配合 animatedImageFrameAtIndex 一起来组成 SpriteSheet

- (CGRect)animatedImageContentsRectAtIndex:(NSUInteger)index {
    if (index >= _contentRects.count) return CGRectZero;
    return ((NSValue *)_contentRects[index]).CGRectValue;
}

相关文章

  • YYImage之YYSpriteSheetImage

    SpriteSheetImage 从一张大图片上面提取多个小图片来组成一个动画,将多个小图片集成到大图片的好处是可...

  • YYImage之YYImage

    YYImage 是框架对图片的封装对象,它支持 GIF, APNG,WebP 格式的动画图片。 初始化图片 生成一...

  • YYImage

    YYImage 一、源码分析 1、来到YYImage.m的+ (nullable YYImage *)imageN...

  • YYImage之YYFrameImage

    YYFrameImage 代表是一组图片组合而成的动态图片对象。首先我们来看初始化方法。YYFrameImage ...

  • YYImage之YYImageDecoder

    YYImageDecoder 这个类是 YYImage 底层对图片处理的解码库,它会对图片解析成 YYImageF...

  • YYImage之YYAnimatedImageView

    本文是 YYImage 的最后一篇。主要探究一下 YYAnimatedImageView 如何显示一个动画图片,将...

  • YYImage源码解析<一> 简单使用

    YYImage学习笔记<一> 简单使用 前言 YYImage开源库包含5个类文件,分别为:YYImage、YYF...

  • YYImage 源码剖析:图片处理技巧

    YYImage 源码剖析:图片处理技巧 YYImage 源码剖析:图片处理技巧

  • YBImageBrowser ,YYImage iOS 14 兼

    YBImageBrowser 框架图片加载不出来,YYImage框架加载图片黑屏解决 pod 'YYImage',...

  • YYImage源码浅析

    简介 YYImage是与UIImage完全兼容的子类,YYImage扩展了UIImage使其支持WebP,GIF,...

网友评论

      本文标题:YYImage之YYSpriteSheetImage

      本文链接:https://www.haomeiwen.com/subject/vdlqbttx.html