W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
我們在第二章“路由管理”一節(jié)中講過:Material 組件庫中提供了一個MaterialPageRoute
組件,它可以使用和平臺風(fēng)格一致的路由切換動畫,如在 iOS 上會左右滑動切換,而在 Android 上會上下滑動切換?,F(xiàn)在,我們?nèi)绻?Android 上也想使用左右切換風(fēng)格,該怎么做?一個簡單的作法是可以直接使用CupertinoPageRoute
,如:
Navigator.push(context, CupertinoPageRoute(
builder: (context)=>PageB(),
));
CupertinoPageRoute
是 Cupertino 組件庫提供的 iOS 風(fēng)格的路由切換組件,它實現(xiàn)的就是左右滑動切換。那么我們?nèi)绾蝸碜远x路由切換動畫呢?答案就是PageRouteBuilder
。下面我們來看看如何使用PageRouteBuilder
來自定義路由切換動畫。例如我們想以漸隱漸入動畫來實現(xiàn)路由過渡,實現(xiàn)代碼如下:
Navigator.push(
context,
PageRouteBuilder(
transitionDuration: Duration(milliseconds: 500), //動畫時間為500毫秒
pageBuilder: (BuildContext context, Animation animation,
Animation secondaryAnimation) {
return new FadeTransition(
//使用漸隱漸入過渡,
opacity: animation,
child: PageB(), //路由B
);
},
),
);
我們可以看到pageBuilder
有一個animation
參數(shù),這是 Flutter 路由管理器提供的,在路由切換時pageBuilder
在每個動畫幀都會被回調(diào),因此我們可以通過animation
對象來自定義過渡動畫。
無論是MaterialPageRoute
、CupertinoPageRoute
,還是PageRouteBuilder
,它們都繼承自 PageRoute 類,而PageRouteBuilder
其實只是PageRoute
的一個包裝,我們可以直接繼承PageRoute
類來實現(xiàn)自定義路由,上面的例子可以通過如下方式實現(xiàn):
FadeRoute
class FadeRoute extends PageRoute {
FadeRoute({
@required this.builder,
this.transitionDuration = const Duration(milliseconds: 300),
this.opaque = true,
this.barrierDismissible = false,
this.barrierColor,
this.barrierLabel,
this.maintainState = true,
});
final WidgetBuilder builder;
@override
final Duration transitionDuration;
@override
final bool opaque;
@override
final bool barrierDismissible;
@override
final Color barrierColor;
@override
final String barrierLabel;
@override
final bool maintainState;
@override
Widget buildPage(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) => builder(context);
@override
Widget buildTransitions(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
return FadeTransition(
opacity: animation,
child: builder(context),
);
}
}
FadeRoute
Navigator.push(context, FadeRoute(builder: (context) {
return PageB();
}));
雖然上面的兩種方法都可以實現(xiàn)自定義切換動畫,但實際使用時應(yīng)優(yōu)先考慮使用 PageRouteBuilder,這樣無需定義一個新的路由類,使用起來會比較方便。但是有些時候PageRouteBuilder
是不能滿足需求的,例如在應(yīng)用過渡動畫時我們需要讀取當前路由的一些屬性,這時就只能通過繼承PageRoute
的方式了,舉個例子,假如我們只想在打開新路由時應(yīng)用動畫,而在返回時不使用動畫,那么我們在構(gòu)建過渡動畫時就必須判斷當前路由isActive
屬性是否為true
,代碼如下:
@override
Widget buildTransitions(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
//當前路由被激活,是打開新路由
if(isActive) {
return FadeTransition(
opacity: animation,
child: builder(context),
);
}else{
//是返回,則不應(yīng)用過渡動畫
return Padding(padding: EdgeInsets.zero);
}
}
關(guān)于路由參數(shù)的詳細信息讀者可以自行查閱 API 文檔,比較簡單,不再贅述。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: