引導(dǎo)頁Gif動畫調(diào)研

在app的引導(dǎo)頁中咕缎,經(jīng)常需要動態(tài)展示加載和交互過程,本文主要是對Gif動畫的調(diào)研颁虐,技術(shù)要求如下:

  1. 支持復(fù)雜的動態(tài)效果
  2. 易于維護(hù)
  3. 易于開發(fā)
  4. 兼容iOS7和小屏
  5. 高性能

Gif動畫

優(yōu)點(diǎn)

使用Gif動畫方式展示動態(tài)效果,具有很多優(yōu)點(diǎn),開發(fā)維護(hù)比較簡單虾标,工作量小,只需設(shè)計師提供動畫即可灌砖,相比原生制作動畫效率很高璧函。Gif還能夠?qū)崿F(xiàn)很復(fù)雜、酷炫的動畫特效基显,甚至有些是原生無法實(shí)現(xiàn)的蘸吓。Gif對系統(tǒng)版本,對屏幕尺寸沒有什么要求撩幽,兼容性較好库继。

缺點(diǎn)

當(dāng)然Gif也存在一些缺點(diǎn),它僅支持單頁動畫窜醉,對于連續(xù)性的多頁面動畫則無能為力宪萄,比如隨著引導(dǎo)頁滑動,一個按鈕將從第一頁飛到第二頁榨惰。它的cpu使用率也比較高拜英,每個Gif動畫增加了26%的cpu利用率(模擬器iphone 5,ios10.3)读串。

對于開源的引導(dǎo)頁類庫聊记,我們以EAIntroView為例撒妈,它的實(shí)現(xiàn)原理實(shí)際上是在一個scrollView容器上,平鋪四個imageView和一個指式條排监,劃動時切換到上/下一個頁面狰右。當(dāng)使用Gif動畫時,實(shí)際上將同時播放四個gif舆床,因此造成CPU使用率較高棋蚌,真機(jī)測試iOS10.3,iphone 6,cpu使用率70%左右挨队。

優(yōu)化

由于引導(dǎo)頁的實(shí)現(xiàn)方式是將多個imageView同時放到scrollView上谷暮,造成幾個Gif動畫同時播放,CPU使用率較高盛垦。為了解決這個問題湿弦,現(xiàn)引入FLAnimatedImage庫。這個庫支持停止腾夯、播放動畫颊埃。當(dāng)劃到某頁時,才會去播放當(dāng)前頁的Gif動畫蝶俱,這樣就降低了資源消耗情況班利,優(yōu)化后cpu利用率降低到32%。

Gif實(shí)例

寫了一個Demo榨呆,基于EAIntroView罗标,功能尚不完善,僅僅用于驗(yàn)證實(shí)際效果积蜻。地址: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數(shù)組中如输。


    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];

創(chuàng)建四個引導(dǎo)頁頁面鼓黔,將上面生成的頁面內(nèi)容傳遞進(jìn)來,最后將引導(dǎo)頁添加到頁面上不见。


- (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];
    
}

滑動引導(dǎo)頁時澳化,停止所有的Gif動畫,只播放新出現(xiàn)的當(dāng)前頁動畫稳吮。

FLAnimatedImage

FLAnimatedImage是由Flipboard開源的iOS平臺上播放GIF動畫的一個優(yōu)秀解決方案缎谷,在內(nèi)存占用和播放體驗(yàn)都有不錯的表現(xiàn)。它在Github上的Star有5461個灶似,被Facebook列林、Dropbox等應(yīng)用引用瑞你。

FLAnimatedImage的實(shí)現(xiàn)原理很簡單,只有兩個類希痴,F(xiàn)LAnimatedImage負(fù)責(zé)解析GIF動畫數(shù)據(jù)者甲,讀取Gif中的每一幀圖片,F(xiàn)LAnimatedImageView則展示FLAnimatedImage處理后的動畫數(shù)據(jù)砌创,控制Gif動畫的播放虏缸、停止等。

FLAnimatedImage利用CGImageSource獲取圖像對象嫩实、圖片屬性信息等刽辙,調(diào)用CGImageSourceCopyProperties方法獲取到Gif動畫循環(huán)次數(shù),調(diào)用CGImageSourceCreateImageAtIndex取得幀圖片甲献,然后根據(jù)GIF圖的大小和緩存策略判斷需要緩存的單幀圖片數(shù)量宰缤,緩存起來。

FLAnimatedImageView是UIImageView的子類晃洒,完全兼容UIImageView的各個方法撵溃。它設(shè)置GIF動畫的封面幀圖片,當(dāng)前幀索引锥累,GIF動畫的循環(huán)播放次數(shù),播放時間累加器集歇,更新是否發(fā)起動畫的標(biāo)志位桶略,判斷是否啟動GIF動畫。

第三方庫動態(tài)引導(dǎo)頁

使用第三方的動態(tài)引導(dǎo)頁類庫诲宇,能大大提升開發(fā)效率际歼。

JazzHands是一個動態(tài)引導(dǎo)頁類庫,它是基于關(guān)鍵幀的動畫框架, 可以用于手勢姑蓝,滾動視圖鹅心,KVO或者ReactiveCocoa, 十分方便。它在Github上star數(shù)有6102纺荧,在引導(dǎo)頁類庫中最受歡迎旭愧。

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

總結(jié)

Gif動畫 第三方庫(JazzHands) 動畫
開發(fā)工作量 極高
維護(hù)工作量 極高
cpu利用率和內(nèi)存占用 高(26%的cpu利用率) 低(cpu使用率在10%)
兼容性 支持iOS7输枯,支持小屏幕 支持ios7,支持小屏幕 支持
適用性 僅支持單頁動畫 支持多種類型動畫 無限制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末占贫,一起剝皮案震驚了整個濱河市桃熄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌型奥,老刑警劉巖瞳收,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碉京,死亡現(xiàn)場離奇詭異,居然都是意外死亡螟深,警方通過查閱死者的電腦和手機(jī)谐宙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來血崭,“玉大人卧惜,你說我怎么就攤上這事〖腥遥” “怎么了咽瓷?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舰讹。 經(jīng)常有香客問我茅姜,道長,這世上最難降的妖魔是什么月匣? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任钻洒,我火速辦了婚禮,結(jié)果婚禮上锄开,老公的妹妹穿的比我還像新娘素标。我一直安慰自己,他們只是感情好萍悴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布头遭。 她就那樣靜靜地躺著,像睡著了一般癣诱。 火紅的嫁衣襯著肌膚如雪计维。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天撕予,我揣著相機(jī)與錄音鲫惶,去河邊找鬼。 笑死实抡,一個胖子當(dāng)著我的面吹牛欠母,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吆寨,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼艺蝴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸟废?” 一聲冷哼從身側(cè)響起猜敢,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缩擂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼠冕,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年胯盯,在試婚紗的時候發(fā)現(xiàn)自己被綠了懈费。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡博脑,死狀恐怖憎乙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叉趣,我是刑警寧澤泞边,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站疗杉,受9級特大地震影響阵谚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烟具,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一梢什、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朝聋,春花似錦嗡午、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至金度,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間严沥,已是汗流浹背猜极。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留消玄,地道東北人跟伏。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像翩瓜,于是被迫代替她去往敵國和親受扳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫兔跌、插件勘高、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • 如何找尋自己內(nèi)在的力量 一、信任 信任靈魂的旅程,相信自己內(nèi)在的力量华望,相信自己值得被愛蕊蝗,相信生命會帶我們體驗(yàn)最適合...
  • 其實(shí)說真的,我是一個與外界斷了聯(lián)系的人赖舟,免費(fèi)的聊天工具例如那什么qq呀蓬戚,微信呀,基本是零聊天內(nèi)容宾抓,更別談那需要錢的...
    簡又雜閱讀 237評論 0 1
  • 這是我在上海的第一套房子子漩,住了4年不到,還剩三張照片石洗,再見
    相山遐閱讀 150評論 0 0
  • 朋友訴苦劲腿,剛剛下班就和他夫人大吵了一架旭绒。 “真是沒事找事,累了一天還要經(jīng)受她的摧殘焦人,本來什么事沒有但是不知哪根筋不...
    冷小賤閱讀 298評論 0 1