最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter 用自定義轉場動畫實現(xiàn)頁面切換

 更新時間:2021年06月22日 09:45:06   作者:島上碼農(nóng)  
本篇介紹了 fluro 導航到其他頁面的自定義轉場動畫實現(xiàn),F(xiàn)lutter本身提供了不少預定義的轉場動畫,可以通過 transitionBuilder 參數(shù)設計多種多樣的轉場動畫,也可以通過自定義的 AnimatedWidget實現(xiàn)個性化的轉場動畫效果。

fluro 轉場動畫源碼 在使用自定義轉場動畫前,先扒一扒 fluro 的源碼,通過源碼可以發(fā)現(xiàn)這么一個標準的轉場方法:

RouteTransitionsBuilder _standardTransitionsBuilder(
      TransitionType? transitionType) {
    return (BuildContext context, Animation<double> animation,
        Animation<double> secondaryAnimation, Widget child) {
      if (transitionType == TransitionType.fadeIn) {
        return FadeTransition(opacity: animation, child: child);
      } else {
        const Offset topLeft = const Offset(0.0, 0.0);
        const Offset topRight = const Offset(1.0, 0.0);
        const Offset bottomLeft = const Offset(0.0, 1.0);

        Offset startOffset = bottomLeft;
        Offset endOffset = topLeft;
        if (transitionType == TransitionType.inFromLeft) {
          startOffset = const Offset(-1.0, 0.0);
          endOffset = topLeft;
        } else if (transitionType == TransitionType.inFromRight) {
          startOffset = topRight;
          endOffset = topLeft;
        } else if (transitionType == TransitionType.inFromBottom) {
          startOffset = bottomLeft;
          endOffset = topLeft;
        } else if (transitionType == TransitionType.inFromTop) {
          startOffset = Offset(0.0, -1.0);
          endOffset = topLeft;
        }

        return SlideTransition(
          position: Tween<Offset>(
            begin: startOffset,
            end: endOffset,
          ).animate(animation),
          child: child,
        );
      }
    };
  }

從源碼可以看出,根據(jù)不同枚舉返回了不同的動畫(即 transitionBuilder),其中TransitionType.fadeIn使用的是Flutter 自帶的 FadeTransition,通過改變透明度來完成動畫。而其他的左滑入、右滑入、下滑入和上滑入都是從初始偏移位置滑動到結束位置,使用的是 SlideTransition。Flutter 除了上述的 FadeTransition、SlideTransition 之外,還有如下的常用轉場形式:

  • RotationTransition:旋轉轉場
  • ScaleTransition:縮放轉場

既然是這樣,我們可以依葫蘆畫瓢,先用系統(tǒng)其他的轉場效果做一個自定義的轉場看看。

旋轉轉場動畫

先來看看旋轉的轉場RotationTransition,RotationTransition 的構造方法定義如下:

const RotationTransition({
    Key? key,
    required Animation<double> turns,
    this.alignment = Alignment.center,
    this.child,
  })  : assert(turns != null),
        super(key: key, listenable: turns);

其中 turns 是動畫控制,表示旋轉的弧度數(shù),等于動畫控制值乘以2π。alignment 表示旋轉圍繞的中心位置,默認是居中的。旋轉的弧度不要太大,否則動畫過快,導致不太好看,經(jīng)過驗證,推薦的起始值0.2至0.3之間,結束值為0表示回到正常位置。起始值如果為負,則是順時針;如果為正則是逆時針,示例代碼如下:

//逆時針圍繞中心旋轉
RouterManager.router.navigateTo(
  context,
  RouterManager.transitionPath,
  transition: TransitionType.custom,
  transitionBuilder:
      (context, animation, secondaryAnimation, child) {
    return RotationTransition(
      turns: Tween<double>(
        begin: 0.25,
        end: 0.0,
      ).animate(animation),
      child: child,
    );
  },
);

//...
//順時針圍繞左下角旋轉
RouterManager.router.navigateTo(
  context,
  RouterManager.transitionPath,
  transition: TransitionType.custom,
  transitionBuilder:
      (context, animation, secondaryAnimation, child) {
    return RotationTransition(
      alignment: Alignment.bottomLeft,
      turns: Tween<double>(
        begin: -0.25,
        end: 0.0,
      ).animate(animation),
      child: child,
    );
  },
);

其中 Tween 是系統(tǒng)自帶的線性插值方法。

縮放轉場動畫

縮放轉場這類在圖片預覽會比較常見,一般是從較小的比例縮放到1:1比例。使用方式和旋轉轉場類似,示例代碼如下:

RouterManager.router.navigateTo(
  context,
  RouterManager.transitionPath,
  transition: TransitionType.custom,
  transitionBuilder:
      (context, animation, secondaryAnimation, child) {
    return ScaleTransition(
      scale: Tween<double>(
        begin: 0.5,
        end: 1.0,
      ).animate(animation),
      child: child,
    );
  },
);

自定義轉場動畫

通過閱讀源碼,其實可以發(fā)現(xiàn)RotationTransition、ScaleTransition 都是繼承自 AnimatedWidget,因此我們可以自己寫一個自定義的 Transition 繼承自 AnimatedWidget,在 build方法中返回一個 Transform 對象即可。通過這種方式可以做自定義的轉場動畫效果。我們以變形為例,可以利用 Matrix4的 skew 方法,在 x 和 y 軸進行變形,就可以得到轉場類似卡片變形的效果。也可以只在 X 軸或 Y 軸變形(skewX和 skewY 方法)。這里以 x,y 軸同時變形定義了一個轉場動畫:

class SkewTransition extends AnimatedWidget {
  const SkewTransition({
    Key key,
    Animation<double> turns,
    this.alignment = Alignment.center,
    this.child,
  })  : assert(turns != null),
        super(key: key, listenable: turns);

  Animation<double> get turns => listenable as Animation<double>;

  final Alignment alignment;

  final Widget child;

  @override
  Widget build(BuildContext context) {
    final double turnsValue = turns.value;
    final Matrix4 transform =
        Matrix4.skew(turnsValue * pi * 2.0, turnsValue * pi * 2.0);
    return Transform(
      transform: transform,
      alignment: alignment,
      child: child,
    );
  }
}

使用方式和 RotationTransition 類似:

RouterManager.router.navigateTo(
  context,
  RouterManager.transitionPath,
  transition: TransitionType.custom,
  transitionBuilder:
      (context, animation, secondaryAnimation, child) {
    return SkewTransition(
      turns: Tween<double>(
        begin: -0.05,
        end: 0.0,
      ).animate(animation),
      child: child,
    );
  },
);

實際也可以嘗試使用圍繞 X 軸旋轉,圍繞 Y 軸旋轉,以及變更中心點位置(alignment)來實現(xiàn)不同的動畫轉場效果。如果需要更為復雜的動畫效果,則可以研究動畫的實現(xiàn),后續(xù)篇章將有對應動畫的介紹。

運行效果

運行效果如下圖所示:

以上就是Flutter 用自定義轉場動畫實現(xiàn)頁面切換的詳細內(nèi)容,更多關于Flutter 自定義轉場動畫的資料請關注腳本之家其它相關文章!

相關文章

  • Android實現(xiàn)為圖片添加水印

    Android實現(xiàn)為圖片添加水印

    這篇文章主要為大家詳細介紹了Android實現(xiàn)為圖片添加水印的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 詳解Android Handler機制和Looper Handler Message關系

    詳解Android Handler機制和Looper Handler Message關系

    Handler是Android線程之間的消息機制,主要的作用是將一個任務切換到指定的線程中去執(zhí)行,準確的說是切換到構成Handler的looper所在的線程中去出處理。本文將詳細介紹Android Handler機制和Looper Handler Message關系。
    2021-06-06
  • Android 6.0動態(tài)權限申請教程

    Android 6.0動態(tài)權限申請教程

    本文主要介紹了Android 6.0動態(tài)權限申請的教程,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Android中AsyncTask詳細介紹

    Android中AsyncTask詳細介紹

    這篇文章主要介紹了Android中AsyncTask詳細介紹,AsyncTask是一個很常用的API,尤其異步處理數(shù)據(jù)并將數(shù)據(jù)應用到視圖的操作場合,需要的朋友可以參考下
    2015-01-01
  • Android如何實現(xiàn)接收和發(fā)送短信

    Android如何實現(xiàn)接收和發(fā)送短信

    這篇文章主要為大家詳細介紹了Android如何實現(xiàn)接收和發(fā)送短信,具有一定的實用性,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android開發(fā)教程之調(diào)用攝像頭功能的方法詳解

    Android開發(fā)教程之調(diào)用攝像頭功能的方法詳解

    這篇文章主要介紹了Android調(diào)用攝像頭功能的方法,詳細分析了Android調(diào)用攝像頭功能的權限設置、功能代碼與實現(xiàn)步驟,需要的朋友可以參考下
    2016-06-06
  • Android開發(fā)中的數(shù)據(jù)庫事務用法分析

    Android開發(fā)中的數(shù)據(jù)庫事務用法分析

    這篇文章主要介紹了Android開發(fā)中的數(shù)據(jù)庫事務用法,分析了Android數(shù)據(jù)庫事務的功能、使用方法與相關注意事項,需要的朋友可以參考下
    2016-06-06
  • Android手勢識別器GestureDetector使用詳解

    Android手勢識別器GestureDetector使用詳解

    這篇文章主要為大家詳細介紹了Android手勢識別器GestureDetector的使用方法解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android自定義控件ViewGroup實現(xiàn)標簽云

    Android自定義控件ViewGroup實現(xiàn)標簽云

    這篇文章主要為大家詳細介紹了Android自定義控件ViewGroup實現(xiàn)標簽云,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android studio git創(chuàng)建與刪除標簽(Tag)的教程詳解

    Android studio git創(chuàng)建與刪除標簽(Tag)的教程詳解

    這篇文章主要介紹了Android studio git創(chuàng)建與刪除標簽(Tag)的教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

兴义市| 台江县| 高邑县| 保山市| 广水市| 琼结县| 吉安市| 凯里市| 贺兰县| 枣庄市| 咸丰县| 北海市| 博野县| 冀州市| 清镇市| 德钦县| 南木林县| 桂阳县| 桃源县| 彭水| 疏附县| 湖州市| 诏安县| 宁陵县| 湘潭县| 通许县| 桃江县| 义乌市| 威海市| 奈曼旗| 达孜县| 合作市| 思茅市| 大渡口区| 西峡县| 封丘县| 唐海县| 韩城市| 贵港市| 高淳县| 开远市|