Flutter進階:在應用中實現 Hero(飛行) 動畫

Meandni發表於2019-01-27

Flutter進階:在應用中實現 Hero(飛行) 動畫

hero 動畫介紹

Hero 指的是可以在路由(頁面)之間“飛行”的 widget,從一個頁面開啟另一個頁面時產生一個簡單的過渡動畫,看下圖例項:

Flutter進階:在應用中實現 Hero(飛行) 動畫

Flutter進階:在應用中實現 Hero(飛行) 動畫

Hero Animations 採用類似圖示的 widget ,稱為“hero”,一旦觸發頁面過渡,例如單擊圖示,hero 將會“飛”到下一頁。 當使用者導航回到上一頁面時,也將實現原路返回的動畫。

更多介紹,請看官網

這裡我們不僅學習如何使用 hero 動畫,也將會自定義一些我們自己實現的動畫。

構建一個普通的 hero 動畫

hero 動畫允許我們在 Flutter 中用最簡單的方式實現漂亮動畫,無需太多設定。 在上面的例子中,我們可以看到兩個頁面上都存在相同的圖示或者圖片。 我們需要做的只是 讓這兩者以某種方式相關聯

要實現它,我們可以通過在 Hero 元件中包含圖示之類的元件。

Hero(
  tag: "DemoTag",
  child: Icon(
    Icons.add,
    size: 70.0,
  ),
),
複製程式碼

我們需要設定了一個 tag 引數,給這個 hero 一個獨立的名字(類比 Android 中的 ID),因為如果我們在同一頁面上有多個 hero ,每個 hero 都需要知道它們將飛往何處且在各不相同的地方。

現在應用程式有一個 hero 元件想要飛到下一頁。接下來就是要告訴它將要飛向何處。

我們僅需要在第二頁上新增帶有相同標籤的Hero小部件就可實現這個效果。

Hero(
  tag: "DemoTag",
  child: Icon(
    Icons.add,
    size: 150.0,
  ),
),
複製程式碼

例項如下:

Flutter進階:在應用中實現 Hero(飛行) 動畫

自定義 hero 動畫

Hero 元件允許我們自定義各種過渡效果。 有以下幾種方法。

新增佔位符

在元件飛離它曾經處於的位置並且到達目標位置之前,目標處有一處空的地方。 我們可以在此位置新增佔位符

我們現在使用 CircularProgressIndicator 作為佔位符。

Hero(
    tag: "DemoTag",
    child: Icon(
      Icons.add,
      size: 150.0,
    ),
    placeholderBuilder: (context, widget) {
      return Container(
        height: 150.0,
        width: 150.0,
        child: CircularProgressIndicator(),
      );
    },
  ),
複製程式碼

我們使用 placeholderBuilder 來構造佔位符並返回我們希望作為佔位符的元件。

使用佔位符:

Flutter進階:在應用中實現 Hero(飛行) 動畫

更改 hero 元件

Flutter 允許我們更改從一個頁面飛到另一個頁面過程的元件,而無需更改兩個頁面上的元件。

讓我們在不更改 hero 元件的子元件的前提下,使用火箭圖示“飛”而不是 “+” 圖示 。

Flutter進階:在應用中實現 Hero(飛行) 動畫

我們使用 flightShuttleBuilder 引數執行此操作。

Hero(
  tag: "DemoTag",
  child: Icon(
    Icons.add,
    size: 150.0,
  ),
  flightShuttleBuilder: (flightContext, animation, direction,
      fromContext, toContext) {
    return Icon(FontAwesomeIcons.rocket, size: 150.0,);
  },
),
複製程式碼

flightShuttleBuilder 有5個引數,用來設定動畫以及動畫的方向。

目前,兩個方向的火箭圖示大小都保持在 150.0 。 通過使用方法的 direction 引數,我們可以為每個方向配置不同的配置。

if(direction == HeroFlightDirection.push) {
  return Icon(
    FontAwesomeIcons.rocket,
    size: 150.0,
  );
} else if (direction == HeroFlightDirection.pop){
  return Icon(
    FontAwesomeIcons.rocket,
    size: 70.0,
  );
}
複製程式碼

Flutter進階:在應用中實現 Hero(飛行) 動畫

使 hero 動畫可以支援 iOS 返回滑動手勢

預設情況下,當在 iOS 上按後退按鈕時,hero 動畫會有效果,但它們在手勢滑動時並沒有。

使用返回按鈕:

Flutter進階:在應用中實現 Hero(飛行) 動畫

使用滑動手勢

Flutter進階:在應用中實現 Hero(飛行) 動畫

要解決此問題,只需在兩個 Hero 元件上將 transitionOnUserGestures 設定為 true 即可。 預設情況下這裡是 false。

Hero(
  tag: "DemoTag",
  child: Icon(
    Icons.add,
  ),
  transitionOnUserGestures: true,
),

複製程式碼

效果如下:

Flutter進階:在應用中實現 Hero(飛行) 動畫

最後

利用時間整理分析自己所學的知識是件非常有意義的事情,希望這也能幫到其他正在學習的同學。同時我也正在用Flutter寫幾個專案,寫好之後就會開源給大家。

Github:github.com/MeandNi

個人部落格:meandni.com/

歡迎一起交流移動開發的技術!

參考資料:

flutter.io/docs/develo…

medium.com/flutter-com…

標題 連結
Flutter進階:深入探究 ListView 和 ScrollPhysics juejin.im/post/5c4c20…
Flutter進階:深入探究 TextField juejin.im/post/5c4c4e…

相關文章