12月4日的Flutter Live中,Flare動畫宣佈了支援Flutter!但是這麼久過去了,並沒有相關的完的善中文教程出現,所以斗膽來寫一下。主要分成兩個部分來說說Flare:一是簡單講下怎麼在2dimensions
上製作Flare動畫,二是怎麼在Flutter中使用Flare動畫。劃重點!!!:如果你是程式設計師,並且對設計沒興趣,那麼直接目錄跳到第二部分就OK了。
先說下什麼是Flare呢?其實就是一個線上的動畫設計網站,可以為App、遊戲和網頁製作向量動畫模型,網址是: www.2dimensions.com 。其實After Effects也有相關的實踐,像是我們熟知的Lottie
和Bodymovin
,一套設計,就可以在iOS和Android雙端實現複雜又好看的動畫效果。
Flare的製作
新建Flare動畫
首先開啟2dimensions
網站:www.2dimensions.com,自行註冊賬號。註冊完畢後,將滑鼠移動到右上角的使用者頭像左邊Your Files
選單,就可以看到製作動畫的入口啦:

- Flare:Insanely Fast Vector Animation,為App和Web構建實時、快速的動畫,同樣也可以用於遊戲設計。
- Nima:Powerful raster graphics animation tool,主要是為遊戲引擎和應用構建2D動畫。
工作皮膚介紹
簡而言之,Flare更偏向於App和Web使用,Nima更偏向於遊戲引擎使用。我們以建立Flare為例,初始的空白工作區長這個樣子:

- SETUP模式是用來繪製、匯入向量元素的;
- ANIMATE模式是用來將向量元素動起來的。
Hierarchy用樹狀圖的形式展示了所有控制元件的等級關係,一般頂級結點是一個artboard,可以定義scene的尺寸、背景顏色等屬性。你也可以有多個artboard,但是一個flare檔案至少需要包含一個artboard。所有型別的控制元件都可以擁有自己的子控制元件,子空間會繼承父控制元件的所有變換。
SETUP模式下會出現“+”號選單,用來新增向量元素,可以看到有預置的畫筆、形狀等等,我們先隨便新建一個形狀來作為講解例子,這裡我就匯入一個五角星吧:



AUTOKEY按鈕預設選中就可以了,後邊三個藍色按鈕分別表示:是否展示選中項、預覽是否迴圈播放、是否展示動畫工作區間:


屬性動畫
(屬性動畫這個名字是我自己起的)屬性包括了縮放、旋轉、位移、透明度、顏色等等,只要右側屬性皮膚中帶小菱形標誌,我都歸納到了這一型別中。
接下來,我們試著給五角星新增一個放大的動畫:首先選中五角星,然後在下邊的時間軸上選擇一個動畫開始時間點(以2s為例),再點選右邊屬性皮膚scale屬性x、y右邊的透明小菱形(點選後變藍色),底下皮膚就會多處一個scale動畫了:






Node和Solo控制元件
Node顧名思義就是結點,其實就是控制點,調整node的值可以控制某部分畫面的動畫,它擁有基礎的變換屬性(移動、旋轉和縮放),如果使用node作為容易,那麼可以為控制元件新增額外的變換(比如旋轉一張圖片、一組圖片、或者自定義旋轉中心)。接下來我們都以Google Live上的玩手機小人動畫為例來講解:

eye_close_right
、eye_right
、eye_close_let
、eye_left
等等都是結點,一個結點控制一個或多個控制元件的動畫,比如我現在選中的這個eye_right
,它同時控制了兩個shape:右眼外邊的框和裡面的眼白,調整這個node,右眼外邊的框和裡面的眼白的屬性都會跟著一起變化:

pupil_right
來控制的,調整它的屬性,瞳孔就會相應變化。它和node的區別就是下邊這張圖中表示的了,solo的每一個子控制元件前都有一個radio button,你可以隨時切換這個solo控制哪一個子控制元件(只會控制被選中的,其他的會被標記為de-activate):

從上邊的圖中我們可以看到,Node和Solo都是有自己的座標軸的,座標軸的方向並不是隨機的,二是遵循了外部包含的bone的座標;如果沒有bone控制,那麼預設情況下是標準的直角座標系:


Bone控制元件
Bone,顧名思義就是骨架,所以這個控制元件,一般畫小人的時候用,我們以小人的左腿為例來分析一下:

畫一組bone很簡單,點選菱形,然後多次單擊連成一組bone就可以了,右鍵單擊表示繪製結束:

contected bones
,然後在左側控制元件樹中選擇需要關聯的bone,就可以啦。

我們還可以為bone新增約束,將右側的屬性選單欄拉到最底部,會有一個新增constraints屬性的選單,可以為bone新增target等:


關於Freeze屬性
我們最開始講了,一般來說,子控制元件會繼承父控制元件的變換,那麼有沒有辦法讓父控制元件的變換不影響子控制元件呢?這個時候我們可以使用Freeze控制元件將這些變換“凍住”。具體的可以看下這個例子:Freeze,操作很簡單,就是選中控制元件,然後修改它的freeze屬性就可以了。
flr檔案輸出
設計稿畫好之後,點選右上角的export按鈕,就可以匯出.flr
格式的資原始檔啦:

Flare的使用
最基礎的,將flr
檔案放到工程目錄,然後使用FlareActor
控制元件來展示就可以了:
import 'package:flare_flutter/flare_actor.dart';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return new FlareActor("assets/Filip.flr", alignment:Alignment.center, fit:BoxFit.contain, animation:"idle");
}
}
複製程式碼
但其實Flare很強大、很靈活的,flr檔案裡邊的每一個結點,都是可以獲取到的,方便我們精確地控制動畫。使用artboard.getNode(String name)
可以得到一個ActorNode
物件,使用play(String animationName)
可以播放指定動畫。所以知道為什麼讓你們取名不要瞎取了吧,不然你寫出來的程式碼可讀性會很差。
如果你想要自己去控制動畫,那麼自定義一個controller繼承自FlareControls
就可以了。注意,是FlareControls
,不是FlareController
,FlareControls
繼承自FlareController
,擁有一些基礎的play/mix
方法,用起來簡單很多。你的自定義controller需要重寫三個方法:initialize()
、advance()
和 setViewTransform()
。
initialize()
一般是做初始化操作,此時FlareActor
控制元件已經built好了,我們可以在此獲取node:
_faceControl = artboard.getNode("ctrl_face");
play("idle");
複製程式碼
setViewTransform()
在動畫的每一幀處都會被呼叫;advance()
是在每一次artboard即將重新整理的時候被呼叫(還沒有開始draw的時候)
關於Nima
Nima的製作和使用其實和Flare大差不差的,所以就不重複寫了。
寫在最後
2dimensions explore 上有很多現成的動畫可供參考,大家可以去上邊看看,有很多有意思的idea。
參考文章: