Flutter 1.17 新 Material motion 規範的預構建動畫

来源:https://www.cnblogs.com/mengqd/archive/2020/07/09/13275974.html
-Advertisement-
Play Games

老孟導讀:在 Flutter 1.17 發佈大會上,Flutter 團隊還發佈了新的 Animations 軟體包,該軟體包提供了實現新的 Material motion 規範的預構建動畫。 軟體包 pub 地址:https://pub.dev/packages/animations Materia ...


老孟導讀:在 Flutter 1.17 發佈大會上,Flutter 團隊還發佈了新的 Animations 軟體包,該軟體包提供了實現新的 Material motion 規範的預構建動畫。

軟體包 pub 地址:https://pub.dev/packages/animations

Material motion 規範:https://material.io/design/motion/the-motion-system.html

引入插件,版本號請到 pub 上查看最新版本號:

animations: ^1.1.1

Container transform

容器轉換模式設計用於包含容器的UI元素之間的轉換。此模式在兩個UI元素之間創建可見連接。

案例:構建GridView,點擊其中一項時跳轉到期詳情頁面:

GridView.builder(
  padding: EdgeInsets.all(8),
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
      crossAxisCount: 2, crossAxisSpacing: 2, mainAxisSpacing: 4),
  itemBuilder: (context, index) {
    return OpenContainer(
      transitionDuration: _duration,
      closedBuilder: (BuildContext _, VoidCallback openContainer) {
        return Container(
          child: Image.asset(
            'assets/images/b.jpg',
            fit: BoxFit.fitWidth,
          ),
        );
      },
      openBuilder: (BuildContext context, VoidCallback _) {
        return _DetailPage();
      },
    );
  },
  itemCount: 50,
)

使用 OpenContainer 組件,closedBuilder 表示關閉狀態時到組件,在這裡表示 GridView Item,openBuilder 表示點擊要跳轉的頁面,這裡表示詳情頁面。

詳情頁面代碼如下:

class _DetailPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Container(
        width: double.infinity,
        height: double.infinity,
        child: Image.asset(
          'assets/images/b.jpg',
          fit: BoxFit.cover,
        ),
      ),
    );
  }
}

構建ListView

ListView.builder(
  itemBuilder: (context, index) {
    return OpenContainer(
      transitionDuration: _duration,
      closedBuilder: (BuildContext _, VoidCallback openContainer) {
        return Card(
          child: Container(
            height: 45,
            alignment: Alignment.center,
            child: Text('$index'),
          ),
        );
      },
      openBuilder: (BuildContext context, VoidCallback _) {
        return _DetailPage();
      },
    );
  },
  itemCount: 50,
)

也可以是一個按鈕,比如 floatingActionButton

Scaffold(
  body: _buildListView(),
  floatingActionButton: OpenContainer(
    openBuilder: (BuildContext context, VoidCallback _) {
      return _DetailPage();
    },
    transitionDuration: _duration,
    closedElevation: 6.0,
    closedShape: const RoundedRectangleBorder(
      borderRadius: BorderRadius.all(
        Radius.circular(50),
      ),
    ),
    closedColor: Theme.of(context).colorScheme.secondary,
    closedBuilder: (BuildContext context, VoidCallback openContainer) {
      return SizedBox(
        height: 50,
        width: 50,
        child: Center(
          child: Icon(
            Icons.add,
            color: Theme.of(context).colorScheme.onSecondary,
          ),
        ),
      );
    },
  ),
)

頂部輸入框

Scaffold(
  appBar: AppBar(
    title: OpenContainer(
      transitionDuration: _duration,
      closedBuilder: (BuildContext _, VoidCallback openContainer) {
        return Container(
          width: 300,
          height: 45,
          padding: EdgeInsets.only(left: 5),
          decoration: BoxDecoration(
              border: Border.all(color: Colors.grey.withOpacity(.5))),
          alignment: Alignment.centerLeft,
          child: Icon(Icons.search,color: Colors.black,),
        );
      },
      openBuilder: (BuildContext context, VoidCallback _) {
        return _DetailPage();
      },
    ),
  ),
)

Shared axis

共用軸模式用於具有空間或導航關係的UI元素之間的過渡。此模式在x,y或z軸上使用共用的變換來加強元素之間的關係。

底部導航案例:

@override
Widget build(BuildContext context) {
  Widget _child = _OnePage();
  switch (_currentIndex) {
    case 1:
      _child = _TwoPage();
      break;
  }
  return Scaffold(
    body: PageTransitionSwitcher(
      duration: const Duration(milliseconds: 1500),
      reverse: false,
      transitionBuilder: (
        Widget child,
        Animation<double> animation,
        Animation<double> secondaryAnimation,
      ) {
        return SharedAxisTransition(
          child: child,
          animation: animation,
          transitionType: SharedAxisTransitionType.horizontal,
          secondaryAnimation: secondaryAnimation,
        );
      },
      child: _child,
    ),
    bottomNavigationBar: BottomNavigationBar(
      onTap: (int index) {
        setState(() {
          _currentIndex = index;
        });
      },
      currentIndex: _currentIndex,
      items: <BottomNavigationBarItem>[
        BottomNavigationBarItem(title: Text('首頁'), icon: Icon(Icons.home)),
        BottomNavigationBarItem(
            title: Text('我的'), icon: Icon(Icons.perm_identity)),
      ],
    ),
  );
}

類型為 y 軸:

transitionType: SharedAxisTransitionType.vertical,

類型為 z 軸:

transitionType: SharedAxisTransitionType.scaled,

Fade through

淡入模式用於彼此之間沒有密切關係的UI元素之間的過渡。

下麵案例來源於官方Demo:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('Fade through')),
    body: PageTransitionSwitcher(
      transitionBuilder: (
          Widget child,
          Animation<double> animation,
          Animation<double> secondaryAnimation,
          ) {
        return FadeThroughTransition(
          animation: animation,
          secondaryAnimation: secondaryAnimation,
          child: child,
        );
      },
      child: pageList[pageIndex],
    ),
    bottomNavigationBar: BottomNavigationBar(
      currentIndex: pageIndex,
      onTap: (int newValue) {
        setState(() {
          pageIndex = newValue;
        });
      },
      items: const <BottomNavigationBarItem>[
        BottomNavigationBarItem(
          icon: Icon(Icons.photo_library),
          title: Text('Albums'),
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.photo),
          title: Text('Photos'),
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.search),
          title: Text('Search'),
        ),
      ],
    ),
  );
}

效果適用於:

  1. 底部導航切換。
  2. 刷新列表。
  3. 切換器。

Fade

淡入淡出模式用於在屏幕範圍內進入或退出的UI元素,例如在屏幕中央淡入淡出的對話框。

彈出對話框案例:

Scaffold(
  body: Center(
    child: RaisedButton(
      onPressed: () {
        showModal<void>(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              content: const Text('對話框'),
              actions: <Widget>[
                FlatButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: const Text('取消'),
                ),
                FlatButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: const Text('確定'),
                ),
              ],
            );
          },
        );
      },
      color: Theme.of(context).colorScheme.primary,
      textColor: Theme.of(context).colorScheme.onPrimary,
      child: const Text('彈出對話框'),
    ),
  ),
)

適用場景:

  1. dialog
  2. menu
  3. snackbar
  4. FloatingActionButton

交流

老孟Flutter博客地址(330個控制項用法):http://laomengit.com

歡迎加入Flutter交流群(微信:laomengit)、關註公眾號【老孟Flutter】:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文源碼:GitHub·點這裡 || GitEE·點這裡 一、分散式事務簡介 1、轉賬經典案例 跨地區和機構的轉賬的業務在實際生活中非常常見,基礎流程如下: 賬戶01通過一系列服務和支付的流程,把錢轉入賬戶02,在這一過程中,如果賬戶01出現出賬成功,但是賬戶02沒有入賬,這就導致數據不一致,違反了 ...
  • 在解釋這兩個函數之前,為了方便大家更容易理解,我們先來講講下麵的這幅圖。 ​ 這個圖中的例子其實很簡單,我們就是把題目通過輸入設備(例如鍵盤滑鼠)傳輸到電腦中,然後讓電腦進行運算得出結果,再然後把結果通過輸出設備(例如顯示器)反饋給我們,這是一個簡單的人機的交互過程。 在 C 語言中其實也是一樣 ...
  • 一篇文章掌握 Python 內置 zip() 的全部內容 zip() 是 Python 中最好用的內置類型之一,它可以接收多個可迭代對象參數,再返回一個迭代器,可以把不同可迭代對象的元素組合起來。 我之前寫迭代器系列的時候,在《Python進階:設計模式之迭代器模式》中簡單地介紹過它,前幾天翻譯了 ...
  • 1 前言 Helm是優秀的基於Kubernetes的包管理器。利用Helm,可以快速安裝常用的Kubernetes應用,可以針對同一個應用快速部署多套環境,還可以實現運維人員與開發人員的職責分離。現在讓我們安裝並體現一下,如何通過Helm安裝MongoDB吧。 Kubernetes環境搭建可參考:M ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:嚴小樣兒 分佈分析法,一般是根據分析目的,將數據進行分組,研究各組別分佈規律的一種分析方法。數據分組方式有兩種:等距或不等距分組。 分佈分析在實際的數據分析實踐中應用非 ...
  • 裝飾流也稱為處理流 1.緩衝流: 1、提升性能 2、任何處理流底層都是節點流 3、釋放外層流,內層流自動釋放,手動釋放則是從裡到外層層釋放 1.位元組緩衝流 1.BufferedInputStream 2.BufferedOutputStream 2.字元緩衝流 1.BufferedReader 2. ...
  • 對於 Java 數組的初始化,有以下兩種方式: 靜態初始化:初始化時由程式員顯式指定每個數組元素的初始值,由系統決定數組長度,如: //只是指定初始值,並沒有指定數組的長度,但是系統為自動決定該數組的長度為4 String[] computers = {"Dell", "Lenovo", "Appl ...
  • sleep 的源碼: pub1ic class Thread imp1 ements Runnable { //native 表示調用操作系統底層實現的方法 pub1ic static native void sleep(1ong millis) throws InterruptedExceptio ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...