Animation 如何使用颤振更改导航动画

Animation 如何使用颤振更改导航动画,animation,flutter,navigation,Animation,Flutter,Navigation,在颤振中导航到页面或从页面导航到页面时,是否有任何方法可以更改默认动画?您可以使用。 请检查下面的代码 import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildConte

在颤振中导航到页面或从页面导航到页面时,是否有任何方法可以更改默认动画?

您可以使用。 请检查下面的代码

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';


void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Transition Animation Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new FirstPage(),
    );
  }
}

class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => new _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('First Page'),
      ),
      body: new Center(
        child: new RaisedButton(
          child: new Text('Goto Second Page'),
          onPressed: () {
            Navigator.of(context).push(new SecondPageRoute());
          },
        ),
      ),
    );
  }
}

class SecondPageRoute extends CupertinoPageRoute {
  SecondPageRoute()
      : super(builder: (BuildContext context) => new SecondPage());


  // OPTIONAL IF YOU WISH TO HAVE SOME EXTRA ANIMATION WHILE ROUTING
  @override
  Widget buildPage(BuildContext context, Animation<double> animation,
      Animation<double> secondaryAnimation) {
    return new FadeTransition(opacity: animation, child: new SecondPage());
  }
}

class SecondPage extends StatefulWidget {
  @override
  _SecondPageState createState() => new _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Second Page'),
      ),
      body: new Center(
        child: new Text('This is the second page'),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
进口“包装:颤振/cupertino.dart”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“过渡动画演示”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新建第一页(),
);
}
}
类FirstPage扩展StatefulWidget{
@凌驾
_FirstPageState createState()=>新建_FirstPageState();
}
类_FirstPageState扩展了状态{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“第一页”),
),
正文:新中心(
孩子:新升起的按钮(
子项:新文本(“转到第二页”),
已按下:(){
Navigator.of(context.push)(新的SecondPageRoute());
},
),
),
);
}
}
类SecondPageRoute扩展了CupertinoPageRoute{
第二页路由()
:super(builder:(BuildContext context)=>newsecondpage());
//如果希望在布线时有一些额外的动画,则为可选
@凌驾
小部件构建页面(构建上下文、动画、,
动画(二级动画){
返回新的FadeTransition(不透明度:动画,子项:新建第二页());
}
}
类SecondPage扩展StatefulWidget{
@凌驾
_SecondPageState createState()=>new_SecondPageState();
}
类_SecondPageState扩展状态{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“第二页”),
),
正文:新中心(
子项:新文本(“这是第二页”),
),
);
}
}
有些人玩动画

  // OPTIONAL IF YOU WISH TO HAVE SOME EXTRA ANIMATION WHILE ROUTING
  @override
  Widget buildPage(BuildContext context, Animation<double> animation,
      Animation<double> secondaryAnimation) {
    return new RotationTransition(
        turns: animation,
        child: new ScaleTransition(
          scale: animation,
          child: new FadeTransition(
            opacity: animation,
            child: new SecondPage(),
          ),
        ));
  }
//如果您希望在路由时有一些额外的动画,则此选项是可选的
@凌驾
小部件构建页面(构建上下文、动画、,
动画(二级动画){
返回新的旋转过渡(
转向:动画,
子:新的ScaleTransition(
比例:动画,
儿童:新时尚转换(
不透明度:动画,
子项:新建第二页(),
),
));
}
您可以对buildTransitions进行子类化和重写

例如:


用动画替换淡入淡出过渡

我通过在
pageTransitionsTheme
中为应用程序级主题提供我自己的
构建器
和自定义地图来实现这一点

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator Tile',
      home: RandomWords(),
      theme: new ThemeData(
        primaryColor: Colors.white,
        // Add the line below to get horizontal sliding transitions for routes.
        pageTransitionsTheme: PageTransitionsTheme(builders: {TargetPlatform.android: CupertinoPageTransitionsBuilder(),}),
      ),
    );
  }
}

当然,我没有为ios添加地图条目,因为我只为
TargetPlatform
使用android

您可以使用
PageRouteBuilder

以下示例显示导航到第二个屏幕时的
FadeTransition

Navigator.push(
  context,
  PageRouteBuilder(
    pageBuilder: (c, a1, a2) => Page2(),
    transitionsBuilder: (c, anim, a2, child) => FadeTransition(opacity: anim, child: child),
    transitionDuration: Duration(milliseconds: 2000),
  ),
);

您还可以从中查看
page\u transition
package。此包包含以下不同的转换。 褪色 右向左, 左向右, 上下, 低头, 刻度(带校准), 旋转(对齐), 尺寸(带对齐), 右至左逐渐消失,
leftToRightWithFade

感谢您的回答。在我现有的应用程序代码中,我用
CupertinoPageRoute
替换了
MaterialPageRoute
,并获得了滑动动画。@n接着这个。我已经测试过了,效果很好:谢谢你的回答。我检查了flatter文档中的
buildTransitions
(),似乎我必须从头开始为我的动画编写代码。在这种情况下,我认为使用
CupertinoPageRoute
会更简单。尽管如此,这个解决方案还是很有帮助的。只是用我们的动画替换淡入淡出对我们没有帮助,因为不同的动画有不同的参数。如何在导航的名称中使用它?很好,谢谢!谢谢,请您也建议如何更改动画样式。@Sandepsing您可以在
transitionsBuilder
中执行此操作,我使用了
FadeTransition
,您可以选择自己的动画并播放it@CopsOnRoad当然,让我试试,谢谢你的快速回复!它正在工作,我在CopsOnRoad做得不对
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator Tile',
      home: RandomWords(),
      theme: new ThemeData(
        primaryColor: Colors.white,
        // Add the line below to get horizontal sliding transitions for routes.
        pageTransitionsTheme: PageTransitionsTheme(builders: {TargetPlatform.android: CupertinoPageTransitionsBuilder(),}),
      ),
    );
  }
}
Navigator.push(
  context,
  PageRouteBuilder(
    pageBuilder: (c, a1, a2) => Page2(),
    transitionsBuilder: (c, anim, a2, child) => FadeTransition(opacity: anim, child: child),
    transitionDuration: Duration(milliseconds: 2000),
  ),
);