基于Flutter實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)效的示例代碼
前言
動(dòng)畫(huà)經(jīng)常會(huì)用于場(chǎng)景切換,比如滑動(dòng),縮放,尺寸變化,為應(yīng)對(duì)這樣的場(chǎng)景轉(zhuǎn)換需要,F(xiàn)lutter 提供了 Transition 系列的動(dòng)畫(huà)組件,可以讓場(chǎng)景轉(zhuǎn)換動(dòng)畫(huà)變得更加簡(jiǎn)單。本篇為你整理了常用的 Transition 組件的應(yīng)用。
CupertinoFullscreenDialogTransition
名稱顯示是蘋(píng)果風(fēng)格的全屏對(duì)話轉(zhuǎn)換動(dòng)效,構(gòu)造方法如下:
CupertinoFullscreenDialogTransition({
??Key??key,
??required?Animation<double>?primaryRouteAnimation,
??required?Animation<double>?secondaryRouteAnimation,
??required?this.child,
??required?bool?linearTransition,
})?
從源碼可以看到實(shí)際上是基于 SlideTransition 實(shí)現(xiàn)的,其 build 方法定義如下,使用了兩個(gè) SlideTransition 實(shí)現(xiàn)了該動(dòng)效??梢钥闯墒菍?shí)現(xiàn)了兩個(gè)方向的移動(dòng),如果只移動(dòng)一個(gè)方向的話,將secondaryRouteAnimation的動(dòng)畫(huà)值begin 和 end 設(shè)置為相同即可。
Widget?build(BuildContext?context)?{
??assert(debugCheckHasDirectionality(context));
??final?TextDirection?textDirection?=?Directionality.of(context);
??return?SlideTransition(
????position:?_secondaryPositionAnimation,
????textDirection:?textDirection,
????transformHitTests:?false,
????child:?SlideTransition(
??????position:?_positionAnimation,
??????child:?child,
????),
??);
}
下面是我們實(shí)現(xiàn)的一個(gè)示例動(dòng)畫(huà),Column 的子組件中,上下各使用了1個(gè)CupertinoFullscreenDialogTransition組件,使得有種下面彈出來(lái)后將上面的擠上去一樣。

屏幕錄制2021-11-04 下午9.29.10.gif
CupertinoPageTransition
CupertinoPageTransition和CupertinoFullscreenDialogTransition很相似,只是CupertinoPageTransition是橫向的。構(gòu)造方法的參數(shù)也一樣:
CupertinoPageTransition({
??Key??key,
??required?Animation<double>?primaryRouteAnimation,
??required?Animation<double>?secondaryRouteAnimation,
??required?this.child,
??required?bool?linearTransition,
})
我們用CupertinoPageTransition實(shí)現(xiàn)了一個(gè)類似側(cè)邊抽屜的動(dòng)效。

屏幕錄制2021-11-04 下午9.45.24.gif
DecoratedBoxTransition
這個(gè)顧名思義,就知道是更改 子組件的外框的特性來(lái)實(shí)現(xiàn)動(dòng)效的,實(shí)際做起來(lái)還是挺有趣的,下面是官方的一個(gè)示例代碼:
class?_MyStatefulWidgetState?extends?State<MyStatefulWidget>
????with?TickerProviderStateMixin?{
??final?DecorationTween?decorationTween?=?DecorationTween(
????begin:?BoxDecoration(
??????color:?const?Color(0xFFFFFFFF),
??????border:?Border.all(style:?BorderStyle.none),
??????borderRadius:?BorderRadius.circular(60.0),
??????shape:?BoxShape.rectangle,
??????boxShadow:?const?<BoxShadow>[
????????BoxShadow(
??????????color:?Color(0x66666666),
??????????blurRadius:?10.0,
??????????spreadRadius:?3.0,
??????????offset:?Offset(0,?6.0),
????????)
??????],
????),
????end:?BoxDecoration(
??????color:?const?Color(0xFFFFFFFF),
??????border:?Border.all(
????????style:?BorderStyle.none,
??????),
??????borderRadius:?BorderRadius.zero,
??????//?No?shadow.
????),
??);
??late?final?AnimationController?_controller?=?AnimationController(
????vsync:?this,
????duration:?const?Duration(seconds:?3),
??)..repeat(reverse:?true);
??@override
??void?dispose()?{
????_controller.dispose();
????super.dispose();
??}
??@override
??Widget?build(BuildContext?context)?{
????return?Container(
??????color:?Colors.white,
??????child:?Center(
????????child:?DecoratedBoxTransition(
??????????position:?DecorationPosition.background,
??????????decoration:?decorationTween.animate(_controller),
??????????child:?Container(
????????????width:?200,
????????????height:?200,
????????????padding:?const?EdgeInsets.all(10),
????????????child:?const?FlutterLogo(),
??????????),
????????),
??????),
????);
??}
}
實(shí)現(xiàn)的效果如下,有一種從扁平到實(shí)物過(guò)渡的感覺(jué),而且動(dòng)效變化得很平滑。

屏幕錄制2021-11-04 下午9.50.02.gif
FadeTransition
FadeTransition 看名字就知道是一個(gè)漸現(xiàn)的動(dòng)畫(huà)效果了,示例很簡(jiǎn)單,通過(guò)一個(gè) Animation控制透明度就可以實(shí)現(xiàn)對(duì)應(yīng)的動(dòng)效了。
Widget?build(BuildContext?context)?{
??return?Container(
????color:?Colors.white,
????child:?FadeTransition(
??????opacity:?_animation,
??????child:?const?Padding(padding:?EdgeInsets.all(8),?child:?FlutterLogo()),
????),
??);
}
PositionedTransition
和AnimatedPositioned有點(diǎn)類似,用于更改組件在 Stack 的位置來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果。下面是官方的示例代碼。
@override
Widget?build(BuildContext?context)?{
??const?double?smallLogo?=?100;
??const?double?bigLogo?=?200;
??return?LayoutBuilder(
????builder:?(BuildContext?context,?BoxConstraints?constraints)?{
??????final?Size?biggest?=?constraints.biggest;
??????return?Stack(
????????children:?<Widget>[
??????????PositionedTransition(
????????????rect:?RelativeRectTween(
??????????????begin:?RelativeRect.fromSize(
??????????????????const?Rect.fromLTWH(0,?0,?smallLogo,?smallLogo),?biggest),
??????????????end:?RelativeRect.fromSize(
??????????????????Rect.fromLTWH(biggest.width?-?bigLogo,
??????????????????????biggest.height?-?bigLogo,?bigLogo,?bigLogo),
??????????????????biggest),
????????????).animate(CurvedAnimation(
??????????????parent:?_controller,
??????????????curve:?Curves.elasticInOut,
????????????)),
????????????child:?const?Padding(
????????????????padding:?EdgeInsets.all(8),?child:?FlutterLogo()),
??????????),
????????],
??????);
????},
??);
}
運(yùn)行效果如下,不僅可以更改位置還可以更改大小。

屏幕錄制2021-11-04 下午10.03.37.gif
RotationTransition
旋轉(zhuǎn)動(dòng)畫(huà)效果,然后讓組件圍繞 Z 軸旋轉(zhuǎn)。構(gòu)造方法如下,其中 turns 即旋轉(zhuǎn)控制動(dòng)畫(huà)對(duì)象,alignment 是確定開(kāi)始旋轉(zhuǎn)的相對(duì)位置。
RotationTransition({
??Key??key,?
??required?Animation<double>?turns,?
??Alignment?alignment,?
??FilterQuality??filterQuality,?
??Widget??child
})
ScaleTransition
縮放動(dòng)效,我們?cè)?a href="http://m.fzitv.net/article/244838.htm" rel="external nofollow" target="_blank">吹吧吹吧!來(lái)吹個(gè)大大的氣球!已經(jīng)介紹過(guò)了,這里不再重復(fù)介紹,大家看之前的文章即可。
SizeTransition
尺寸變化動(dòng)效,可以參考超人飛來(lái)!滿屏的力量感動(dòng)畫(huà)!這一篇文章。
SlideTransition
滑動(dòng)動(dòng)效,可以實(shí)現(xiàn)組件的滑入滑出效果,具體可以看來(lái),滑動(dòng)切換到下一個(gè)小姐姐!這一篇。
到此這篇關(guān)于基于Flutter實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)效的示例代碼的文章就介紹到這了,更多相關(guān)Flutter轉(zhuǎn)場(chǎng)動(dòng)效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Flutter 用自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)實(shí)現(xiàn)頁(yè)面切換
- Flutter 使用fluro的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)進(jìn)行頁(yè)面切換
- Android Flutter實(shí)現(xiàn)3D動(dòng)畫(huà)效果示例詳解
- Android Flutter實(shí)現(xiàn)五種酷炫文字動(dòng)畫(huà)效果詳解
- Flutter實(shí)現(xiàn)心動(dòng)的動(dòng)畫(huà)特效
- 基于Flutter制作一個(gè)心碎動(dòng)畫(huà)特效
相關(guān)文章
Android用于加載xml的LayoutInflater源碼超詳細(xì)分析
今天不想去聊一些Android的新功能,新特性之類的東西,特別想聊一聊這個(gè)老生常談的話題:LayoutInflater,感興趣的朋友來(lái)看看吧2022-08-08
Android 再按一次退出程序的實(shí)現(xiàn)方法
抽空研究了一下"再按一次退出程序"的實(shí)現(xiàn)方式,直接上代碼(請(qǐng)自動(dòng)忽略無(wú)關(guān)代碼)2014-01-01
Android開(kāi)發(fā)自定義實(shí)時(shí)圖表控件實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Android自定義實(shí)時(shí)圖表控件實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問(wèn)題
今天小編就為大家分享一篇關(guān)于Android解決ScrollView下嵌套ListView和GridView中內(nèi)容顯示不全的問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
android表格效果之ListView隔行變色實(shí)現(xiàn)代碼
首先繼承SimpleAdapter再使用重載的Adapter來(lái)達(dá)到效果,其實(shí)主要是需要重載SimpleAdapter,感興趣的朋友可以研究下,希望本文可以幫助到你2013-02-02
android圖像繪制(四)自定義一個(gè)SurfaceView控件
自定義控件(類似按鈕等)的使用,自定義一個(gè)SurfaceView。如某一塊的動(dòng)態(tài)圖(自定義相應(yīng)),或者類似UC瀏覽器下面的工具欄,感興趣的朋友可以了解下2013-01-01
Android實(shí)現(xiàn)WebView點(diǎn)擊攔截跳轉(zhuǎn)原生
這篇文章主要介紹了Android實(shí)現(xiàn)WebView點(diǎn)擊攔截跳轉(zhuǎn)原生,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

