您好,登錄后才能下訂單哦!
這篇文章主要介紹“Flutter中怎么使用AnimatedSwitcher實現場景切換動畫”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Flutter中怎么使用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實現場景切換動畫”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。