面向前端的 Lottie & AE 動畫手把手入門教學

六面體混凝土移動師發表於2019-03-01

因為我一直比較關注 Web 領域的設計趨勢, 很早之前就聽很說了 Lottie 這個專案, 但是一直沒時間和機會去嘗試, 最近終於有時間機會於是嘗試了一把, 在這裡分享一下。

一. Intro to Lottie

Lottie 是 Airbnb 開源的一個支援 Web、Android、iOS 以及 ReactNative等平臺的動畫庫,它可以結合 AE 和 Bodymovin 來快速實現跨平臺動畫。

其實對於普通的動效和簡單動畫, 使用原生程式碼實現已經足夠, Lottie 是為了複雜動畫而生的, 下面來看幾個 Lottie 實現的幾個動畫例子:

面向前端的 Lottie & AE 動畫手把手入門教學
這種複雜的動畫, 如果需要手寫程式碼來實現, 將會很繁瑣且效率低下, 這正是 Lottie 大展身手的地方。

面向前端的 Lottie & AE 動畫手把手入門教學
要使用 Lottie, 需要在藉助 Bodymovin 外掛將動畫工程檔案從 AE 中匯出成 JSON。Lottie 分別為每個平臺實現了一套 Player, 只需載入JSON動畫檔案就可播放。 值得一提的是, Lottie 在 Web 上是藉助 Canvas 或者 SVG 來渲染動畫的, 動畫的關鍵幀在匯出時已經被計算好了, 除了解析JSON之外基本沒有效能損耗, 因此效率非常高!

二. 繪製動畫

先 Show 一下完成的效果, 這個動畫只需要5分鐘便可繪製完成!

面向前端的 Lottie & AE 動畫手把手入門教學

首先, 開啟 AE, 新建合成, 引數如下:

面向前端的 Lottie & AE 動畫手把手入門教學

然後進入AE, 預設會看到這個介面:

面向前端的 Lottie & AE 動畫手把手入門教學

每個區域的作用分別是:

  • 專案: 管理當前專案以及一些專案引數的預覽
  • 資源: 匯入到 AE 中的所有外部資源如影象等在這裡進行統一管理
  • 圖層: 在這裡為每一個圖層新增/編輯關鍵幀和屬性
  • 時間軸: 在這裡可以編輯動畫的關鍵幀和曲線
  • 預覽: 動畫和編輯實時預覽/編輯視窗
  • 工具: 各種工具的集合, 如文字工具、圖形工具等
  • 屬性: 在這裡編輯元素的屬性

首先, 選擇我們新建的合成, 點選工具欄的圓角矩形按鈕, 同時按住shift, 在預覽區域繪製一個矩形。

面向前端的 Lottie & AE 動畫手把手入門教學
OK, 這裡我們的基礎圖形已經繪製完畢了, 是不是 So easy?

現在我們需要給其新增關鍵幀讓其動起來。 AE 裡的關鍵幀跟 CSS 裡的 keyframe 屬性沒有什麼區別, 我們只需要對其運動過程中的某一些節點新增關鍵屬性, 這個元素將會在相鄰兩個關鍵幀之間進行關鍵屬性的平滑變換。

在我們開始之前, 先分析一下動畫效果, 可以分成三部分:

  • 位移動畫: Y 軸方向的往復運動
  • 形狀動畫: 矩形和圓形之間的往復變換
  • 顏色動畫: 藍色和品紅色的突變

OK, 讓我們先來完成位移動畫: 首先, 選中我們的圖層, 點選圖層左側三角, 展開變換選項, 選中位置屬性, 同時把時間軸移動到0:

面向前端的 Lottie & AE 動畫手把手入門教學

這時進行最重要的一步, 新增關鍵幀: 首先, 點選圖層區域中位置屬性左側的小時鐘圖示, 開始記錄關鍵幀, 如圖:

面向前端的 Lottie & AE 動畫手把手入門教學
然後, 將時間軸移到20幀的位置, 點選左側的菱形啟用當前位置的關鍵幀屬性記錄, 同時更改位置屬性中的Y座標, 如圖:
面向前端的 Lottie & AE 動畫手把手入門教學
這麼做的意思是: 讓圖層的Y軸座標屬性, 在0幀到20幀的過程中, 從150動畫到380, 是不是很容易理解? 現在按下空格鍵, 預覽效果! BIngo, 你會發現, 矩形動了起來, 雖然只是動了20幀, 但這是我們完成的第一個關鍵幀動畫! 鼓勵一下自己~ 然後如法炮製, 完成餘下的幾個關鍵幀的記錄, 如圖:
面向前端的 Lottie & AE 動畫手把手入門教學
面向前端的 Lottie & AE 動畫手把手入門教學

OK, 現在我們已經新增完了所有的位移關鍵幀, 按空格再次預覽, 如圖:

面向前端的 Lottie & AE 動畫手把手入門教學
這時, 因為我們的動畫都是勻速運動, 看起來會很生硬, 因為真實世界中物理運動是有加速度的。 我們把矩形看作是自由落體後再次反彈, 因此在Y軸座標最低點和最高點速度應該為0, 整個下降過程是勻加速運動, 上升過程是勻減速運動。 因此我們需要給我們的動畫設定曲線, 讓其符合真實世界的物理規律。

點選圖層皮膚的右上角, 顯示曲線皮膚, 如圖:

面向前端的 Lottie & AE 動畫手把手入門教學
曲線皮膚的X軸是時間, Y軸是屬性值, 最低點為0, 最高點為設定的最大值, 曲線的便是屬性的變化, 曲線的斜率便是加速度的值。

按住ctrl同時點選選擇我們的動畫路徑, 點選右下角的轉換為貝塞爾曲線按鈕。

面向前端的 Lottie & AE 動畫手把手入門教學
但是這時什麼都不會發生。。。 因為目前的位移屬性實際上是集合和X軸位移和Y軸位移兩個屬性的, 從曲線也能反映出來, 下面那條平行於X軸的直線表示X軸位移。我們無法同時為兩個屬性設定曲線, 需要將X和Y方向的位移屬性分開, 右鍵點選圖層皮膚的位置屬性, 選擇選擇單獨尺寸, 然後我們就可以單獨為Y方向的位移屬性設定曲線了, 如圖:
面向前端的 Lottie & AE 動畫手把手入門教學
選中Y方向的位移屬性曲線, 點選轉換為貝塞爾曲線。這時曲線的每一個拐點將會多出一個錨點和兩個方向的控制器, 曲線將會與其中一個控制器相切, 並且曲線與控制器相切處的半徑等於控制器的長度。 因此我們只需要拖動控制器便可以控制曲線。
面向前端的 Lottie & AE 動畫手把手入門教學
同時, 點選工具欄中的鋼筆工具, 便可以在曲線任意位置額外新增錨點進行更進一步的曲線控制。 按住 ALT 同時點選點選錨點可以將之前轉換為曲線。 另外, 按住 Command/CTRL 的同時可以直接拖動曲線中的錨點。

我們編輯完的第一條曲線是這樣的:

面向前端的 Lottie & AE 動畫手把手入門教學
為了達到速度突變的效果, 所以我們在這裡把時間軸往後移動1幀或者2幀(讓變換的時間很短, 肉眼看不出過程, 就是突變啦~), 再調整曲線, 如圖:
面向前端的 Lottie & AE 動畫手把手入門教學
重複之前的步驟編輯剩下的幾個關鍵幀曲線, 最後, 編輯完的曲線如圖:
面向前端的 Lottie & AE 動畫手把手入門教學
按空格鍵預覽, 如圖:
面向前端的 Lottie & AE 動畫手把手入門教學
Yooooo! 比剛剛自然多了!

讓我們進行下一步, 新增形狀變換的關鍵幀。 首先, 點選圖層左側三角, 展開變換選項, 依次展開: 內容、矩形、矩形路徑。將時間軸移到0, 圓度屬性設定為0, 點選圓度左側的時鐘小圖示, 開始紀錄該屬性關鍵幀。

面向前端的 Lottie & AE 動畫手把手入門教學
然後將時間軸移到下一次Y軸座標的最低點, 與位移動畫的第二個關鍵幀對齊, 點選圓度屬性左側的菱形啟用當前圓度的關鍵幀屬性記錄。
面向前端的 Lottie & AE 動畫手把手入門教學
將時間軸移到下一個關鍵幀, 也就是速度第一次突變後的關鍵幀, 再次點選圓度屬性左側的菱形紀錄關鍵幀, 同時把圓度屬性設為100%。便完成了矩形到圓形的突變動畫。
面向前端的 Lottie & AE 動畫手把手入門教學
重複上述步驟, 將時間軸移到圓形下一次運動到Y軸的最低點, 再次新增關鍵幀讓圓形變換成矩形, 最終的關鍵幀曲線如圖:
面向前端的 Lottie & AE 動畫手把手入門教學
預覽一下效果:
面向前端的 Lottie & AE 動畫手把手入門教學

現在進行最後一步, 顏色變換。顏色屬性在圖層皮膚的內容、矩形、填充裡更改, 其他地方跟上述一樣, 無非是再次新增幾個關鍵幀。相信聰明的你已經學會了, 這裡就不再贅述啦。 最終的曲線如圖:

面向前端的 Lottie & AE 動畫手把手入門教學
最終完成效果:
面向前端的 Lottie & AE 動畫手把手入門教學
Yooooooooooooooooooo! 是不是感覺自己很厲害~

三. 渲染動畫

現在動畫的繪製工作已經完成, 我們可以匯出我們的動畫了。首先需要在 AE 裡安裝 Bodymovin,參考 GitHub - airbnb/lottie-web: Render After Effects animations natively on Web, Android and iOS, and React Native. http://airbnb.io/lottie/

安裝後選擇該外掛:

面向前端的 Lottie & AE 動畫手把手入門教學
安裝後選擇我們的合成和匯出路徑, 點選 Render:
面向前端的 Lottie & AE 動畫手把手入門教學

匯出檔案後, 新建一個專案, 把 data.json 移到專案目錄, 安裝所需依賴。 這裡我們使用 Lottie 的 React Binding, 執行 npm install -S react react-dom react-lottie babel-core babel-plugin-transform-class-properties parcel-bundler。 新建 index.html:

<body>
    <div id="root"></div>
    <script src="./index.js"></script>
</body>
複製程式碼

新建 index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import Lottie from 'react-lottie';
import * as animationData from './data.json'

class App extends React.Component {
  state = {
    isStopped: false,
    isPaused: false
  };

  defaultOptions = {
    loop: true,
    autoplay: true,
    animationData: animationData,
    renderer: 'canvas'
  };

  play = () => this.setState({isStopped: false, isPaused: false});
  stop = () => this.setState({isStopped: true});
  pause = () => this.setState({isPaused: !this.state.isPaused});

  render() {
    const buttonStyle = {
      display: 'block',
      margin: '10px auto'
    };

    return <div>
      <Lottie
        options={this.defaultOptions}
        width={600}
        isStopped={this.state.isStopped}
        isPaused={this.state.isPaused}
      />
      <button style={buttonStyle} onClick={this.stop}>停止</button>
      <button style={buttonStyle} onClick={this.play}>播放</button>
      <button style={buttonStyle} onClick={this.pause}>暫停</button>
    </div>
  }
}

ReactDOM.render(<App/>, document.getElementById('root'));
複製程式碼

然後執行parcel ./index.html, 開啟瀏覽器, 將會看到我們的動畫, 是不是非常酷~

除了能夠播放和暫停, Lottie 還為我們提供了更加精細的動畫控制方法和事件鉤子, 有興趣的小夥伴參考: GitHub - airbnb/lottie-web: Render After Effects animations natively on Web, Android and iOS, and React Native. http://airbnb.io/lottie/

本教程的所有原始碼和AE工程檔案都在我的 GitHub: HuQingyang (胡青楊) · GitHub 歡迎關注、交流、拍磚、搞基

相關文章