12月4日的Flutter Live中,Flare動畫宣佈了支持Flutter!可是這麼久過去了,並無相關的完的善中文教程出現,因此斗膽來寫一下。主要分紅兩個部分來講說Flare:一是簡單講下怎麼在2dimensions
上製做Flare動畫,二是怎麼在Flutter中使用Flare動畫。劃重點!!!:若是你是程序員,而且對設計沒興趣,那麼直接目錄跳到第二部分就OK了。
先說下什麼是Flare呢?其實就是一個在線的動畫設計網站,能夠爲App、遊戲和網頁製做矢量動畫模型,網址是: www.2dimensions.com 。其實After Effects也有相關的實踐,像是咱們熟知的Lottie
和Bodymovin
,一套設計,就能夠在iOS和Android雙端實現複雜又好看的動畫效果。node
首先打開2dimensions
網站:www.2dimensions.com,自行註冊帳號。註冊完畢後,將鼠標移動到右上角的用戶頭像左邊Your Files
菜單,就能夠看到製做動畫的入口啦:android
簡而言之,Flare更偏向於App和Web使用,Nima更偏向於遊戲引擎使用。咱們以建立Flare爲例,初始的空白工做區長這個樣子:程序員
左上角有兩個tab,分別是SETUP和ANIMATE: Hierarchy用樹狀圖的形式展現了全部控件的等級關係,通常頂級結點是一個artboard,能夠定義scene的尺寸、背景顏色等屬性。你也能夠有多個artboard,可是一個flare文件至少須要包含一個artboard。全部類型的控件均可以擁有本身的子控件,子控件會繼承父控件的全部變換。
SETUP模式下會出現「+」號菜單,用來添加矢量元素,能夠看到有預置的畫筆、形狀等等,咱們先隨便新建一個形狀來做爲講解例子,這裏我就導入一個五角星吧: bash
(屬性動畫這個名字是我本身起的)屬性包括了縮放、旋轉、位移、透明度、顏色等等,只要右側屬性面板中帶小菱形標誌,我都概括到了這一類型中。
接下來,咱們試着給五角星添加一個放大的動畫:首先選中五角星,而後在下邊的時間軸上選擇一個動畫開始時間點(以2s爲例),再點擊右邊屬性面板scale屬性x、y右邊的透明小菱形(點擊後變藍色),底下面板就會多處一個scale動畫了: app
Node顧名思義就是結點,其實就是控制點,調整node的值能夠控制某部分畫面的動畫,它擁有基礎的變換屬性(移動、旋轉和縮放),若是使用node做爲容易,那麼能夠爲控件添加額外的變換(好比旋轉一張圖片、一組圖片、或者自定義旋轉中心)。接下來咱們都以Google Live上的玩手機小人動畫爲例來說解:ide
結點是一個像全屏同樣的四角圖標,上圖中的eye_close_right
、
eye_right
、
eye_close_let
、
eye_left
等等都是結點,一個結點控制一個或多個控件的動畫,好比我如今選中的這個
eye_right
,它同時控制了兩個shape:右眼外邊的框和裏面的眼白,調整這個node,右眼外邊的框和裏面的眼白的屬性都會跟着一塊兒變化:
Solo也是控制點,和node很像,也是用來控制一個或多個控件,好比上圖中瞳孔的屬性則是經過solo控件
pupil_right
來控制的,調整它的屬性,瞳孔就會相應變化。
Bone,顧名思義就是骨架,因此這個控件,通常畫小人的時候用,咱們以小人的左腿爲例來分析一下:動畫
很明顯,這條腿上有三根骨頭,就是紅色數字標識的地方。有了bone,咱們能夠很直觀地爲各個相關聯的部件作動畫(像人物的手臂啦、旗幟啦、樹枝啦)。contected bones
,而後在左側控件樹中選擇須要關聯的bone,就能夠啦。
更多關於bone的操做請點擊:
Bone
咱們最開始講了,通常來講,子控件會繼承父控件的變換,那麼有沒有辦法讓父控件的變換不影響子控件呢?這個時候咱們可使用Freeze控件將這些變換「凍住」。具體的能夠看下這個例子:Freeze,操做很簡單,就是選中控件,而後修改它的freeze屬性就能夠了。網站
設計稿畫好以後,點擊右上角的export按鈕,就能夠導出.flr
格式的資源文件啦: ui
2019.08更新:
根據最新的2dimensions編輯頁面,導出文件的時候會有export和downloadFile兩種選項,請必定要選擇export。前者導出的是.flr
文件,然後者是.flr2d
文件,.flr2d
文件Flare暫時不支持。idea
最基礎的,將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的製做和使用其實和Flare大差不差的,因此就不重複寫了。
2dimensions explore 上有不少現成的動畫可供參考,你們能夠去上邊看看,有不少有意思的idea。
參考文章: