引导页Gif动画调研

在app的引导页中,经常需要动态展示加载和交互过程,本文主要是对Gif动画的调研,技术要求如下:

  1. 支持复杂的动态效果
  2. 易于维护
  3. 易于开发
  4. 兼容iOS7和小屏
  5. 高性能

Gif动画

优点

使用Gif动画方式展示动态效果,具有很多优点,开发维护比较简单,工作量小,只需设计师提供动画即可,相比原生制作动画效率很高。Gif还能够实现很复杂、酷炫的动画特效,甚至有些是原生无法实现的。Gif对系统版本,对屏幕尺寸没有什么要求,兼容性较好。

缺点

当然Gif也存在一些缺点,它仅支持单页动画,对于连续性的多页面动画则无能为力,比如随着引导页滑动,一个按钮将从第一页飞到第二页。它的cpu使用率也比较高,每个Gif动画增加了26%的cpu利用率(模拟器iphone 5,ios10.3)。

对于开源的引导页类库,我们以EAIntroView为例,它的实现原理实际上是在一个scrollView容器上,平铺四个imageView和一个指式条,划动时切换到上/下一个页面。当使用Gif动画时,实际上将同时播放四个gif,因此造成CPU使用率较高,真机测试iOS10.3,iphone 6,cpu使用率70%左右。

优化

由于引导页的实现方式是将多个imageView同时放到scrollView上,造成几个Gif动画同时播放,CPU使用率较高。为了解决这个问题,现引入FLAnimatedImage库。这个库支持停止、播放动画。当划到某页时,才会去播放当前页的Gif动画,这样就降低了资源消耗情况,优化后cpu利用率降低到32%。

Gif实例

写了一个Demo,基于EAIntroView,功能尚不完善,仅仅用于验证实际效果。地址:https://github.com/superzcj/ZCJGifInIntroDemo

    self.gifArr = [NSMutableArray new];
    NSMutableArray *views = [NSMutableArray new];
    for (int i=0; i<4; i++) {
        
        NSString *imageName = [NSString stringWithFormat:@"guideImage_%d", i + 1];
        NSURL *url1 = [[NSBundle mainBundle] URLForResource:imageName withExtension:@"gif"];
        NSData *data1 = [NSData dataWithContentsOfURL:url1];
        
        FLAnimatedImage *image = [FLAnimatedImage animatedImageWithGIFData:data1];
        
        FLAnimatedImageView *imageView = [[FLAnimatedImageView alloc] initWithFrame:self.view.bounds];
        imageView.backgroundColor = [UIColor clearColor];
        imageView.animatedImage = image;
        
        UIView *bgView = [[UIView alloc] initWithFrame:self.view.bounds];
        [bgView addSubview:imageView];
        [views addObject:bgView];
        [self.gifArr addObject:imageView];
        
    }

代码如上,首先从本地读取Gif动画图片,生成FLAnimatedImage图片对象,再传递给FLAnimatedImageView以显示。为了在后面控制每个Gif对象的播放与停止,将Gif动画容器放入gifArr数组中。


    EAIntroPage *page1 = [EAIntroPage pageWithCustomView:views[0]];
    EAIntroPage *page2 = [EAIntroPage pageWithCustomView:views[1]];
    EAIntroPage *page3 = [EAIntroPage pageWithCustomView:views[2]];
    EAIntroPage *page4 = [EAIntroPage pageWithCustomView:views[3]];
    
    EAIntroView *intro = [[EAIntroView alloc] initWithFrame:self.view.bounds andPages:@[page1,page2,page3,page4]];
    [intro.skipButton setTitle:@"跳过" forState:UIControlStateNormal];
    [intro setDelegate:self];
    intro.tapToNext = YES;
    
    [intro showInView:self.view animateDuration:0.3];

创建四个引导页页面,将上面生成的页面内容传递进来,最后将引导页添加到页面上。


- (void)intro:(EAIntroView *)introView pageAppeared:(EAIntroPage *)page withIndex:(NSUInteger)pageIndex {
    NSLog(@"Current page index = %lu", (unsigned long)pageIndex);
    
    for (FLAnimatedImageView *iv in self.gifArr) {
        [iv stopAnimating];
    }
    FLAnimatedImageView *imageView = self.gifArr[pageIndex];
    [imageView startAnimating];
    
}

滑动引导页时,停止所有的Gif动画,只播放新出现的当前页动画。

FLAnimatedImage

FLAnimatedImage是由Flipboard开源的iOS平台上播放GIF动画的一个优秀解决方案,在内存占用和播放体验都有不错的表现。它在Github上的Star有5461个,被Facebook、Dropbox等应用引用。

FLAnimatedImage的实现原理很简单,只有两个类,FLAnimatedImage负责解析GIF动画数据,读取Gif中的每一帧图片,FLAnimatedImageView则展示FLAnimatedImage处理后的动画数据,控制Gif动画的播放、停止等。

FLAnimatedImage利用CGImageSource获取图像对象、图片属性信息等,调用CGImageSourceCopyProperties方法获取到Gif动画循环次数,调用CGImageSourceCreateImageAtIndex取得帧图片,然后根据GIF图的大小和缓存策略判断需要缓存的单帧图片数量,缓存起来。

FLAnimatedImageView是UIImageView的子类,完全兼容UIImageView的各个方法。它设置GIF动画的封面帧图片,当前帧索引,GIF动画的循环播放次数,播放时间累加器,更新是否发起动画的标志位,判断是否启动GIF动画。

第三方库动态引导页

使用第三方的动态引导页类库,能大大提升开发效率。

JazzHands是一个动态引导页类库,它是基于关键帧的动画框架, 可以用于手势,滚动视图,KVO或者ReactiveCocoa, 十分方便。它在Github上star数有6102,在引导页类库中最受欢迎。

官方提供了一个很酷炫的Demo,地址:https://github.com/IFTTT/JazzHands

总结

Gif动画 第三方库(JazzHands) 动画
开发工作量 极高
维护工作量 极高
cpu利用率和内存占用 高(26%的cpu利用率) 低(cpu使用率在10%)
兼容性 支持iOS7,支持小屏幕 支持ios7,支持小屏幕 支持
适用性 仅支持单页动画 支持多种类型动画 无限制
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 如何找寻自己内在的力量 一、信任 信任灵魂的旅程,相信自己内在的力量,相信自己值得被爱,相信生命会带我们体验最适合...
  • 其实说真的,我是一个与外界断了联系的人,免费的聊天工具例如那什么qq呀,微信呀,基本是零聊天内容,更别谈那需要钱的...
    简又杂阅读 239评论 0 1
  • 这是我在上海的第一套房子,住了4年不到,还剩三张照片,再见
    相山遐阅读 154评论 0 0
  • 朋友诉苦,刚刚下班就和他夫人大吵了一架。 “真是没事找事,累了一天还要经受她的摧残,本来什么事没有但是不知哪根筋不...
    冷小贱阅读 304评论 0 1