Airbnb 開(kāi)源動(dòng)畫(huà)庫(kù) Lottie 介紹以及詳細(xì)示例

前沿

該文章主要介紹了 Lottie是什么妄壶,如何為 Lottie 制作動(dòng)畫(huà)摔握,以及 Lottie的應(yīng)用場(chǎng)景。適合設(shè)計(jì)師和開(kāi)發(fā)者閱讀以及結(jié)對(duì)實(shí)踐丁寄。


Lottie 介紹

Lottie 是 Airbnb 開(kāi)源的一個(gè)動(dòng)畫(huà)渲染庫(kù)氨淌,同時(shí)支持 Android、iOS伊磺、React Native 平臺(tái)盛正。Lottie 目前只支持渲染播放 After Effects 動(dòng)畫(huà)。 Lottie 使用從 bodymovin (開(kāi)源的 After Effects 插件)導(dǎo)出的json數(shù)據(jù)來(lái)作為動(dòng)畫(huà)數(shù)據(jù)屑埋。所以從動(dòng)畫(huà)制作到動(dòng)畫(huà)使用的整個(gè)工作流程如下:

此圖引用自http://cdn.trojx.me/blog_pic/lottie_sum.png
  1. 設(shè)計(jì)師使用 After Effects 制作動(dòng)畫(huà)豪筝,并導(dǎo)出json文件給開(kāi)發(fā)者
  2. 各端的開(kāi)發(fā)者通過(guò) Lottie 渲染播放動(dòng)畫(huà)

截止目前,各平臺(tái)的 Lottie 支持的 After Effects 特性可從下面網(wǎng)頁(yè)獲得:

http://airbnb.io/lottie/supported-features.html

所以雀彼,設(shè)計(jì)師在使用 After Effects 制作動(dòng)畫(huà)時(shí)壤蚜,建議先預(yù)覽上述網(wǎng)頁(yè),以知道應(yīng)該使用哪些特性制作動(dòng)畫(huà)徊哑,因?yàn)槿羰褂?Lottie 還不支持的特性袜刷,如3D圖層,則 Lottie 會(huì)無(wú)法正確渲染莺丑。

為了推廣Lottie著蟹,Airbnb 還建立了一個(gè)Lottie動(dòng)畫(huà)網(wǎng)站墩蔓,供網(wǎng)友分享自己制作的動(dòng)畫(huà)。網(wǎng)站地址為:

https://www.lottiefiles.com


為 Lottie 制作動(dòng)畫(huà)

為 Lottie 制作動(dòng)畫(huà)萧豆,需要: After Effects + bodymovin奸披。After Effects制作好動(dòng)畫(huà)后,通過(guò)插件 bodymovin 導(dǎo)出一份 json文件涮雷,然后使用 Lottie 進(jìn)行渲染播放阵面。下面將會(huì)介紹如何安裝該插件以及如何導(dǎo)出json文件。

安裝 After Effects

PS: 已經(jīng)安裝好 After Effects 的童鞋可以忽略此環(huán)節(jié)

After Effects 可以從Adobe官網(wǎng)下載安裝試用洪鸭,其目前售價(jià)為:3499¥/年样刷,相對(duì)來(lái)說(shuō)還是很貴的。對(duì)于負(fù)擔(dān)不起的童鞋來(lái)說(shuō)览爵,也可以考慮破解版本置鼻。以下是Mac 的破解版本的下載鏈接:

百度云盤(pán):https://pan.baidu.com/s/1eRMCL26
提取密碼:xyu5

下載的文件夾中包含安裝文件After Effects CC 2017.dmg以及破解文件Adobe Zii cc2017.app壓縮包。安裝好 After Effects 后蜓竹,解壓運(yùn)行Adobe Zii cc2017.app 即可免費(fèi)使用 After Effects 箕母。但是,建議負(fù)擔(dān)的起的童鞋還是購(gòu)買(mǎi)正版服務(wù)俱济,始終可以得到各種升級(jí)服務(wù)嘶是。

安裝 After Effects 插件 bodymovin

1. 下載插件 bodymovin.zxp

2. 安裝插件

  • 下載 After Effects 插件安裝器 ZXP Installer(有 Windows 和 Mac 版本)

  • 運(yùn)行 ZXP Installer姨蝴,按照指示拖動(dòng)bodymovin.zxp 到其窗口俊啼,即可安裝完成

    拖動(dòng)安裝bodymovin.zxp.png

    安裝成功后,如圖所示:

bodymovin.zxp安裝成功.png

3. 重啟 After Effects左医,然后修改 AE 的設(shè)置,在 'After Effects CC -> Preferences -> General' 中打開(kāi)
'Allow Scripts to Write Files and Access Network'

打開(kāi) 'Allow Scripts to Write Files and Access Network'.png

現(xiàn)在可以開(kāi)始制作你的動(dòng)畫(huà)了同木,制作完畢后浮梢,需要使用 bodymovin 時(shí),前往 'window -> extensions' 即可找到 bodymovin:

bodymovin.png

使用 After Effects 制作動(dòng)畫(huà)

此處請(qǐng)開(kāi)始你的表演~

使用 bodymovin 導(dǎo)出 json文件

當(dāng)動(dòng)畫(huà)制作完畢后彤路,運(yùn)行 bodymovin秕硝,選擇你要導(dǎo)出的動(dòng)畫(huà),以及保存json文件的目錄洲尊,點(diǎn)擊 'Render' 即可導(dǎo)出远豺,具體流程如圖所示:

導(dǎo)出 json文件流程.png

在線預(yù)覽動(dòng)畫(huà)效果

制作好 After Effects 動(dòng)畫(huà),導(dǎo)出json文件坞嘀,當(dāng)然要驗(yàn)證一下 Lottie 能否正確渲染播放了躯护。

Airbnb 提供了 iOS APP Android APP 以及 Lottie 動(dòng)畫(huà)在線預(yù)覽網(wǎng)站 供設(shè)計(jì)師進(jìn)行動(dòng)畫(huà)預(yù)覽丽涩。

在網(wǎng)站預(yù)覽的話棺滞,設(shè)計(jì)師只要把導(dǎo)出后的 json 文件裁蚁,拖動(dòng)到網(wǎng)頁(yè)的預(yù)覽框,即可在線看到 Lottie 渲染播放的動(dòng)畫(huà)效果继准。

使用 APP 預(yù)覽的話枉证,則需要上傳 json 文件到服務(wù)端,通過(guò)鏈接進(jìn)行預(yù)覽移必。建議設(shè)計(jì)師上傳文件到 Airbnb 建立的分享網(wǎng)站 lottiefiles.com室谚。


哪些場(chǎng)景適宜使用 Lottie?

Lottie 作為一個(gè)動(dòng)畫(huà)渲染庫(kù)崔泵,在探索過(guò)程中舞萄,筆者認(rèn)為其比較適宜解決以下場(chǎng)景的問(wèn)題:

  • 啟動(dòng)(splash)動(dòng)畫(huà):典型場(chǎng)景是APP logo動(dòng)畫(huà)的播放
  • 上下拉刷新動(dòng)畫(huà):所有APP都必備的功能,利用 Lottie 可以做的更加簡(jiǎn)單酷炫了
  • 加載(loading)動(dòng)畫(huà):典型場(chǎng)景是網(wǎng)絡(luò)請(qǐng)求的loading動(dòng)畫(huà)
  • 提示(tips)動(dòng)畫(huà):典型場(chǎng)景是空白頁(yè)的提示
  • 按鈕(button)動(dòng)畫(huà):典型場(chǎng)景如switch按鈕管削、編輯按鈕倒脓、播放按鈕等按鈕的切換過(guò)渡動(dòng)畫(huà)
  • 禮物(gift)動(dòng)畫(huà):典型場(chǎng)景是直播類APP的高級(jí)動(dòng)畫(huà)播放
  • 視圖轉(zhuǎn)場(chǎng)動(dòng)畫(huà)

各場(chǎng)景的示例如下:(以iOS平臺(tái)為例)

啟動(dòng)(splash)動(dòng)畫(huà).gif
上下拉刷新動(dòng)畫(huà).gif
加載(loading)動(dòng)畫(huà)+提示(tips)動(dòng)畫(huà).gif
按鈕(button)動(dòng)畫(huà)+禮物(gift)動(dòng)畫(huà).gif
轉(zhuǎn)場(chǎng)動(dòng)畫(huà).gif

接入 Lottie

制作好動(dòng)畫(huà),導(dǎo)出json文件后含思,iOS崎弃、Android、React Native的開(kāi)發(fā)者們就可以像使用靜態(tài)資源一樣使用動(dòng)畫(huà)了含潘。接入教程可以看官網(wǎng)教程或者 各平臺(tái)的 Lottie 項(xiàng)目的github:

lottie-iOS 的應(yīng)用示例(包括上述所有例子)可訪問(wèn):
https://github.com/YK-Unit/LottieExample


lottie-ios 極速上手手冊(cè)

安裝 Lottie

可通過(guò) Cocoapods 或者 Carthage 導(dǎo)入 Lottie饲做。

  • Cocoapods:pod 'lottie-ios'
  • Carthage: github "airbnb/lottie-ios" "master"

加載 Lottie 動(dòng)畫(huà)

Lottie 動(dòng)畫(huà)支持從本地或者服務(wù)器的json文件加載。

//從本地json加載
LOTAnimationView *animationView = [LOTAnimationView animationNamed:@"Lottie"];
//從本地指定的bundle的json加載
LOTAnimationView *animationView = [LOTAnimationView animationNamed:@"Lottie" inBundle:[NSBundle YOUR_BUNDLE]];
//從服務(wù)器的json加載
LOTAnimationView *animationView = [[LOTAnimationView alloc] initWithContentsOfURL:[NSURL URLWithString:URL_TO_JSON]];

animationView.frame = CGRectMake(20, 20, 400, 300);
[self.view addSubview:animationView];

播放 Lottie 動(dòng)畫(huà)

Lottie 動(dòng)畫(huà)的播放控制遏弱,除了常規(guī)的控制盆均,還支持進(jìn)度播放、幀播放漱逸。

  • 播放泪姨、暫停、停止

    LOTAnimationView *animationView = [LOTAnimationView animationNamed:@"Lottie"];
    
    //從上一次的動(dòng)畫(huà)位置開(kāi)始播放
    [animationView play];
    
    ...
    //暫停動(dòng)畫(huà)播放
    [animationView pause];
    
    ....
    //停止動(dòng)畫(huà)播放饰抒,此時(shí)動(dòng)畫(huà)進(jìn)度重置為0
    [animationView stop];
    
  • 控制進(jìn)度播放:可參考示例的上下拉刷新動(dòng)畫(huà)

    LOTAnimationView *animationView = [LOTAnimationView animationNamed:@"RefreshHeaderAnim"];
    
    //直接播放到指定進(jìn)度
    [animationView playToProgress:0.8 withCompletion:^(BOOL animationFinished) {
    // do something
    }];
    
    //從進(jìn)度A播放到進(jìn)度B
    [animationView playFromProgress:0 toProgress:0.8 withCompletion:^(BOOL animationFinished) {
    // do something
    }];
    
    //直接設(shè)置當(dāng)前進(jìn)度
    animationView.animationProgress = currentProgress;
    
  • 控制幀播放:可參考示例的switch按鈕動(dòng)畫(huà)

    LOTAnimationView *animationView = [LOTAnimationView animationNamed:@"Switch"];
    
    //直接播放到指定幀
    [animationView playToFrame:@(40) withCompletion:^(BOOL animationFinished) {
    
     }];
    
    //從A幀播放到B幀
    [animationView playFromFrame:@(20) toFrame:@(40) withCompletion:^(BOOL animationFinished) {
    
    }];
    
  • 循環(huán)播放動(dòng)畫(huà):可參考示例的Play-Pause按鈕動(dòng)畫(huà)

    LOTAnimationView *animationView = [LOTAnimationView animationNamed:@"Play-Pause"];
    //設(shè)置循環(huán)播放
    animationView.loopAnimation = YES;
    //設(shè)置自動(dòng)倒退播放
    animationView.autoReverseAnimation = YES;
    [animationView playFromFrame:@(90) toFrame:@(180) withCompletion:^(BOOL animationFinished) {
    
    }];
    
  • 編輯某幀的動(dòng)畫(huà)對(duì)象的屬性:可參考示例的switch按鈕動(dòng)畫(huà)

    [self.switchButton setValue:[UIColor orangeColor] forKeypath:@"Background 2.Shape 1.Fill 1.Color" atFrame:@(0)];
    [self.switchButton setValue:[UIColor blueColor] forKeypath:@"Background 2.Shape 1.Fill 1.Color" atFrame:@(13)]; 
    

    要修改對(duì)象的屬性肮砾,需要知道屬性的路徑(Keypath)。獲取屬性的路徑的方法有:

    • 直接打印對(duì)象的所有層級(jí)屬性袋坑,從日志中獲日檀Α:
      [animationView logHierarchyKeypaths];

      logHierarchyKeypaths日志.png
    • 通過(guò)AE文件獲得:Background 2.Shape 1.Fill 1.Color

      Keypath.png
  • 視圖控制器轉(zhuǎn)場(chǎng)動(dòng)畫(huà)(View Controller Transitions):可參考示例的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
    Lottie 提供了 LOTAnimationTransitionController生成 id <UIViewControllerAnimatedTransitioning> 對(duì)象。

    #pragma mark - UIViewControllerTransitioningDelegate
    - (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
         
         LOTAnimationTransitionController *animationController = [[LOTAnimationTransitionController alloc] initWithAnimationNamed:@"vcTransition1"
                                                                                                                   fromLayerNamed:@"outLayer"
                                                                                                                     toLayerNamed:@"inLayer"
                                                                                                          applyAnimationTransform:NO];
         return animationController;
     }
         
     - (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
         LOTAnimationTransitionController *animationController = [[LOTAnimationTransitionController alloc] initWithAnimationNamed:@"vcTransition2"
                                                                                                                   fromLayerNamed:@"outLayer"
                                                                                                                     toLayerNamed:@"inLayer"
                                                                                                          applyAnimationTransform:NO];
         return animationController;
     }
         
    

添加視圖到 Layer 層:可參考“添加 View 到 Layer 示例”

Lottie 除了支持動(dòng)畫(huà)播放枣宫,還支持添加自定義的視圖到指定的 Layer :

添加視圖到Layer層.gif
NSArray *layerNames = @[@"Green Solid 1",@"Shape Layer 1",@"Shape Layer 2",@"Shape Layer 3",@"Shape Layer 4"];
for (NSString *layerName in layerNames) {
    CGRect subRectViewFrame = CGRectMake(0, 0, 15, 15);
    UIView *subRectView = [[UIView alloc] initWithFrame:subRectViewFrame];
    subRectViewFrame = [self.rectView convertRect:subRectViewFrame toLayerNamed:layerName];
    subRectView.frame = subRectViewFrame;
    subRectView.backgroundColor = [UIColor whiteColor];
    [self.rectView addSubview:subRectView toLayerNamed:layerName applyTransform:YES];
}

在AE中婆誓,我們一般會(huì)用到2種類型的 Layer 來(lái)制作動(dòng)畫(huà):Solid Layer(固態(tài)圖層)和 Shape Layer(形狀圖層)。圖中也颤,綠色的視圖元素就是Solid Layer洋幻,藍(lán)色、紅色歇拆、黃色鞋屈、棕色的視圖元素就是 Shape Layer范咨。

細(xì)心的讀者可以發(fā)現(xiàn),添加同一個(gè) subRectView 到 不同的 Layer 厂庇,subRectView 的繪制位置不一樣渠啊,這是因?yàn)椴煌愋偷?Layer 其坐標(biāo)系統(tǒng)不一樣:

  • Solid Layer 的坐標(biāo)原點(diǎn)在左上角位置,向右是X軸正方向权旷,向下是Y軸正方向

  • Shape Layer 的坐標(biāo)原點(diǎn)由ShapeLayer-Contents-layer-AnchorPoint(內(nèi)容圖層的錨點(diǎn)位置)決定替蛉,X軸和Y軸的正方向則取決于其ShapeLayer-Transform-Scale的值的正負(fù),具體如圖所示:

Shape Layer坐標(biāo)系統(tǒng).jpg

在上面演示的Gif圖中拄氯,Shape Layer 1躲查、Shape Layer 2Shape Layer 3译柏、Shape Layer 4的坐標(biāo)原點(diǎn)都在圖層中心位置镣煮,不同的是其X軸和Y軸的正方向位置。感興趣的同學(xué)鄙麦,可以下載打開(kāi) Demo 里的 RectComp.aep 文件典唇,查看對(duì)應(yīng) Layer 的坐標(biāo)系統(tǒng)數(shù)據(jù),然后你也可以嘗試編輯修改對(duì)應(yīng)圖層的坐標(biāo)原點(diǎn)位置和XY軸方向胯府,導(dǎo)出動(dòng)畫(huà)數(shù)據(jù)進(jìn)行試驗(yàn)介衔。

總得來(lái)說(shuō),若你要添加視圖到Layer骂因,在添加前炎咖,最好打開(kāi)AE文件,查看對(duì)應(yīng)的 Layer 的坐標(biāo)系統(tǒng)信息寒波。當(dāng)然乘盼,更好的做法還是和AE設(shè)計(jì)師結(jié)對(duì)開(kāi)發(fā)動(dòng)畫(huà),這樣可以更方便知道各個(gè)Layer的信息影所。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹦肴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猴娩,更是在濱河造成了極大的恐慌,老刑警劉巖勺阐,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卷中,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡渊抽,警方通過(guò)查閱死者的電腦和手機(jī)蟆豫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)懒闷,“玉大人十减,你說(shuō)我怎么就攤上這事栈幸。” “怎么了帮辟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵速址,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我由驹,道長(zhǎng)芍锚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任蔓榄,我火速辦了婚禮并炮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甥郑。我一直安慰自己逃魄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布澜搅。 她就那樣靜靜地躺著伍俘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪店展。 梳的紋絲不亂的頭發(fā)上养篓,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音赂蕴,去河邊找鬼柳弄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛概说,可吹牛的內(nèi)容都是我干的碧注。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糖赔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼萍丐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起放典,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逝变,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后奋构,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壳影,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年弥臼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宴咧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡径缅,死狀恐怖掺栅,靈堂內(nèi)的尸體忽然破棺而出烙肺,到底是詐尸還是另有隱情,我是刑警寧澤氧卧,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布桃笙,位于F島的核電站,受9級(jí)特大地震影響假抄,放射性物質(zhì)發(fā)生泄漏怎栽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一宿饱、第九天 我趴在偏房一處隱蔽的房頂上張望熏瞄。 院中可真熱鬧谬以,春花似錦、人聲如沸为黎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剪廉。三九已至炕檩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛质,已是汗流浹背泉沾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妇押,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓俊马,卻偏偏與公主長(zhǎng)得像肩杈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锋恬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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