Flutter路由动画

Flutter路由动画

在我们实际的开发中,这个动画还是比较必要的。因为我们要求有效果的实现,总不能一下子就覆盖了原来的内容,所以我们就需要动画来实现这界面跳转的效果。这里我只说一个移动端最常用的一个就是侧滑的效果。

我们定义两个界面,没个界面中间都有一个按钮,能够实现页面的跳转。
代码如下:

##  main.dart ##
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {



  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FirstPage(),
    );
  }
}

## FirstPage.dart  ##
class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("FirstPage"),
      ),
      body: Center(
        child: MaterialButton(
          child: Icon(Icons.navigate_next,size: 50,color: Colors.redAccent,),
          onPressed: (){
            Navigator.of(context).push(
              MaterialPageRoute(builder: (BuildContext context){
                return SecondPage();
              })
            );
          },
        ),
      ),
    );
  }
}


## SecondPage.dart ##
class SecondPage extends StatefulWidget {
  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("SecondPage"),
      ),
      body: Center(
        child: MaterialButton(
          child: Icon(Icons.navigate_before,size: 50,color: Colors.redAccent,),
          onPressed: (){
            Navigator.of(context).pop();  //返回上一级界面 直接可以使用 pop()
          },
        ),        
      ),
    );
  }
}

这就是我们定义的界面。

效果:

这就是实现的效果(过程脑洞自补)。

这样我们功能实现了,但是总觉得还是缺少点什么,因为这是一下子展开到这个界面没有过程,所以我们需要添加一些动画的效果,比如左进右出,右进左出,快进慢出,慢进快出等等。Flutter的相关内容已经在枚举类里列举好了,要想知道就自己多尝试吧。

我们新建一个类作为动画效果类。
代码如下:

class CustomRouteAnimation extends PageRouteBuilder{

  final Widget widget;
  CustomRouteAnimation(this.widget)
      : super(
    transitionDuration: const Duration(seconds: 1),
    pageBuilder: (BuildContext context,Animation<double> animation1,Animation<double> animation2){
      return widget;
    },
    transitionsBuilder: (BuildContext context,Animation<double> animation1,Animation<double> animation2,Widget child){
      return SlideTransition(
          position: Tween<Offset>(
              begin: Offset(-1.0,0.0),
              end: Offset(0.0,0.0)
          ).animate(CurvedAnimation(
            parent: animation1,
            curve: Curves.fastOutSlowIn
          )),
        child: child,
      );
    },
  );

然后我们只需要在我们路由跳转哪里改一下:

Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context){return SecondPage();}  //原来的路由跳转
Navigator.of(context).push(CustomRouteAnimation(SecondPage()));  //改为现在

好了就这样实现了,我就不放图了,自己脑补。如果自己写麻烦就直接复制一下就行了。

最后说一下为什么还要在自定义动画的下面加上child呢,是为了有多个效果重叠的。我就不多说了,基本用不到,这是最常用的,当然你是做游戏的当我没说!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
想要在 Flutter 中为不同的路由(页面)设置不同的转场动画,可以通过自定义路由来实现。下面是一个简单的示例,演示如何创建一个自定义路由并为其设置不同的转场动画: 1. 创建一个自定义路由类 MyCustomRoute,继承自 MaterialPageRoute。 ```dart class MyCustomRoute extends MaterialPageRoute { MyCustomRoute({WidgetBuilder builder, RouteSettings settings}) : super(builder: builder, settings: settings); @override Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) { // 这里可以为不同的路由设置不同的转场动画 if (settings.name == '/page1') { return FadeTransition(opacity: animation, child: child); } else if (settings.name == '/page2') { return ScaleTransition(scale: animation, child: child); } else { // 默认的转场动画 return super.buildTransitions(context, animation, secondaryAnimation, child); } } } ``` 2. 在 MaterialApp 中使用自定义路由 ```dart class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'MyApp', initialRoute: '/', onGenerateRoute: (RouteSettings settings) { switch (settings.name) { case '/page1': return MyCustomRoute(builder: (_) => Page1(), settings: settings); case '/page2': return MyCustomRoute(builder: (_) => Page2(), settings: settings); default: return MyCustomRoute(builder: (_) => HomePage(), settings: settings); } }, ); } } ``` 在上面的示例中,我们为两个页面(/page1 和 /page2)设置了不同的转场动画,而对于其他页面则使用了默认的转场动画。 需要注意的是,这里的转场动画只是示例,你可以根据自己的需要来自定义转场动画。同时,建议在自定义路由类中重写 buildPage 方法,以便于在每次进入新页面时执行一些初始化操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值