亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flutter中怎么使用AnimatedSwitcher實現場景切換動畫

發布時間:2022-03-24 19:30:41 來源:億速云 閱讀:516 作者:iii 欄目:開發技術

這篇文章主要介紹“Flutter中怎么使用AnimatedSwitcher實現場景切換動畫”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Flutter中怎么使用AnimatedSwitcher實現場景切換動畫”文章能幫助大家解決問題。

AnimatedSwitcher 介紹

AnimatedSwitcher 通過動效完成其子組件的切換,默認的效果是 FadeTransition。當其子組件發生改變的時候,就會按設定的轉變效果進行轉換。AnimatedSwitcher的構造方法如下:

const AnimatedSwitcher({
  Key? key,
  this.child,
  required this.duration,
  this.reverseDuration,
  this.switchInCurve = Curves.linear,
  this.switchOutCurve = Curves.linear,
  this.transitionBuilder = AnimatedSwitcher.defaultTransitionBuilder,
  this.layoutBuilder = AnimatedSwitcher.defaultLayoutBuilder,
})

與之前其他的動畫組件不同,AnimatedSwitcher的參數除了 duration 之外,其他的有所不同,具體如下:

  • reverseDuration:反向時長,也就是切換為舊組件的時長,不設置的話就和 duration 一致。

  • switchInCurve:切入動畫曲線,也就是新組件切換進入的曲線;

  • switchOutCurve:切出動畫曲線,也就是舊組件切換出去時的曲線;

  • transitionBuilder:切換轉變動畫構建,是一個函數,定義如下,可以用這個方法來構建自己的切換動效。

typedef AnimatedSwitcherTransitionBuilder = Widget Function(Widget child, Animation<double> animation);
  • layoutBuilder:可以設置新組件在組件樹中的布局,也是一個函數:

typedef AnimatedSwitcherLayoutBuilder = Widget Function(Widget? currentChild, List<Widget> previousChildren);

默認布局為 defaultLayoutBuilder,也就是將當前組件放置在最頂層:

static Widget defaultLayoutBuilder(Widget? currentChild, List<Widget> previousChildren) {
  return Stack(
    children: <Widget>[
      ...previousChildren,
      if (currentChild != null) currentChild,
    ],
    alignment: Alignment.center,
  );
}

關于AnimatedSwitcher有一個地方需要特別注意,那就是如果切換的兩個組件相同的話,AnimatedSwitcher會以為組件沒有改變,而不會進行動效切換。文檔說明如下:

The child is considered to be "new" if it has a different type or [Key]

實際上是根據 Widget 的 canUpdate 判斷的:

static int _debugConcreteSubtype(Widget widget) {
  return widget is StatefulWidget ? 1 :
         widget is StatelessWidget ? 2 :
         0;
}

因此,如果兩個組件類型相同,需要使用不同的 Key 來區分,通常是使用 ValueKey

應用

下面我們來實現開篇的動效,這個使用的是 SizeTransition 尺寸變化轉變動效完成兩張圖片的切換,這樣會讓組件的尺寸從小變到大,有一種掀開面紗的感覺。代碼如下:

class AnimatedSwitcherDemo extends StatefulWidget {
  AnimatedSwitcherDemo({Key? key}) : super(key: key);

  @override
  _AnimatedSwitcherDemoState createState() => _AnimatedSwitcherDemoState();
}

class _AnimatedSwitcherDemoState extends State<AnimatedSwitcherDemo> {
  Widget? _animatedWidget;
  bool test = false;

  @override
  void initState() {
    super.initState();
    _animatedWidget = ClipOval(
      child: Image.asset('images/beauty.jpeg'),
      key: ValueKey(1),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimatedSwticher'),
        brightness: Brightness.dark,
        backgroundColor: Colors.black,
      ),
      backgroundColor: Colors.black,
      body: Center(
        child: Container(
          padding: EdgeInsets.all(10.0),
          child: AnimatedSwitcher(
            child: _animatedWidget,
            duration: const Duration(milliseconds: 1000),
            transitionBuilder: (child, animation) {
              return SizeTransition(
                sizeFactor: animation,
                child: child,
              );
            },
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.play_arrow),
        onPressed: () {
          setState(() {
            test = !test;
            _animatedWidget = test
                ? ClipOval(
                    child: Image.asset('images/beauty2.jpeg'),
                    key: ValueKey(2),
                  )
                : ClipOval(
                    child: Image.asset('images/beauty.jpeg'),
                    key: ValueKey(1),
                  );
          });
        },
      ),
    );
  }
}

關于“Flutter中怎么使用AnimatedSwitcher實現場景切換動畫”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

饶平县| 临城县| 绥宁县| 徐汇区| 古蔺县| 灵川县| 晴隆县| 皋兰县| 和林格尔县| 正宁县| 奎屯市| 哈巴河县| 潮安县| 霞浦县| 富锦市| 绥滨县| 赣州市| 美姑县| 顺义区| 郧西县| 邻水| 财经| 永安市| 马公市| 鞍山市| 海丰县| 冕宁县| 博湖县| 洛扎县| 乐山市| 古蔺县| 龙川县| 团风县| 东莞市| 湘乡市| 丹阳市| 宁乡县| 吴桥县| 鸡泽县| 新竹县| 珠海市|