Flutter 在另一个动画生成器颤振下滑动小部件

Flutter 在另一个动画生成器颤振下滑动小部件,flutter,dart,flutter-animation,Flutter,Dart,Flutter Animation,我有一个有两个小部件的页面,我正在寻找动画。我目前已经创建了我正在寻找的粗略动画,唯一的问题是我希望两个小部件中较大的一个滑动到另一个之下,而不是顶部。我已包括以下代码: @override Widget build(BuildContext context) { return Scaffold( body: Row( children: <Widget>[ AnimatedBuilder( anim

我有一个有两个小部件的页面,我正在寻找动画。我目前已经创建了我正在寻找的粗略动画,唯一的问题是我希望两个小部件中较大的一个滑动到另一个之下,而不是顶部。我已包括以下代码:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Row(
        children: <Widget>[
          AnimatedBuilder(
            animation: transitionAnimation,
            builder: (context, child) {
              return SlideTransition(
                  position: Tween<Offset>(
                    begin: Offset(-1, 0),
                    end: Offset(0, 0),
                  ).animate(CurvedAnimation(
                      curve: Interval(.01, 0.25, curve: Curves.easeInExpo),
                      parent: transitionAnimation)),
                  child: child);
            },
            child: Container(
              width: MediaQuery.of(context).size.width * 0.15,
              color: Colors.black,
            ),
          ),
          AnimatedBuilder(
            animation: transitionAnimation,
            builder: (context, child) {
              return SlideTransition(
                  position: Tween<Offset>(
                    begin: Offset(-2, 0),
                    end: Offset(0, 0),
                  ).animate(CurvedAnimation(
                      curve: Interval(0, 1, curve: Curves.easeIn),
                      parent: transitionAnimation)),
                  child: child);
            },
            child: Container(
              width: MediaQuery.of(context).size.width * 0.85,
              color: Colors.orange,
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(MaterialPageRoute(
            builder: (context) => FirstPage(),
          ));
        },
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
    );
@覆盖
小部件构建(构建上下文){
返回脚手架(
正文:世界其他地区(
儿童:[
动画生成器(
动画:过渡动画,
生成器:(上下文,子对象){
返回幻灯片转换(
位置:吐温(
开始:偏移量(-1,0),
结束:偏移量(0,0),
).动画(曲线动画)(
曲线:间隔(.01,0.25,曲线:曲线.o),
父项:转换(动画),
儿童:儿童);
},
子:容器(
宽度:MediaQuery.of(context).size.width*0.15,
颜色:颜色,黑色,
),
),
动画生成器(
动画:过渡动画,
生成器:(上下文,子对象){
返回幻灯片转换(
位置:吐温(
开始:偏移量(-2,0),
结束:偏移量(0,0),
).动画(曲线动画)(
曲线:间隔(0,1,曲线:Curves.easeIn),
父项:转换(动画),
儿童:儿童);
},
子:容器(
宽度:MediaQuery.of(context).size.width*0.85,
颜色:颜色。橙色,
),
),
],
),
浮动操作按钮:浮动操作按钮(
已按下:(){
导航器.of(上下文).push(MaterialPageRoute(
生成器:(上下文)=>FirstPage(),
));
},
),
浮动ActionButtonLocation:浮动ActionButtonLocation.centerFloat,
);
我对动画的速度和方向感到满意,唯一的问题是,正如我所说的,我希望橙色小部件滑到黑色的下方而不是上方。我曾尝试使用堆栈,但我没有成功地将橙色小部件放在页面的右侧


如果您有任何想法,我们将不胜感激。

要从黑色小部件下方滑动橙色小部件,您可以尝试执行以下操作:

  • 用堆栈替换行
  • 交换AnimatedBuilder的位置
  • 请参阅下面的代码。您也可以在上尝试该代码

    导入“包装:颤振/材料.省道”;
    void main()=>runApp(MyApp());
    类MyApp扩展了无状态小部件{
    @凌驾
    小部件构建(构建上下文){
    返回材料PP(
    标题:“颤振演示”,
    debugShowCheckedModeBanner:false,
    主题:主题数据(
    主样本:颜色。蓝色,
    ),
    主页:const MyHomePage(标题:“颤振演示主页”),
    );
    }
    }
    类MyHomePage扩展StatefulWidget{
    constMyHomepage({Key,this.title}):super(Key:Key);
    最后的字符串标题;
    @凌驾
    _MyHomePageState createState()=>\u MyHomePageState();
    }
    类_MyHomePageState扩展状态
    使用SingleTickerProviderStateMixin{
    动画控制器转换动画;
    @凌驾
    void initState(){
    super.initState();
    transitionAnimation=动画控制器(
    持续时间:常数持续时间(秒数:5),
    vsync:这个,,
    );
    transitionAnimation.forward();
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    主体:堆栈(
    儿童:[
    定位(
    左:MediaQuery.of(context).size.width*0.15,
    子对象:动画生成器(
    动画:过渡动画,
    生成器:(上下文,子对象){
    返回幻灯片转换(
    位置:吐温(
    开始:常量偏移(-2,0),
    结束:常量偏移量(0,0),
    ).动画(曲线动画)(
    曲线:常数间隔(0,1,曲线:Curves.easeIn),
    父项:转换(动画),
    儿童:儿童);
    },
    子:容器(
    高度:MediaQuery.of(context).size.height,
    宽度:MediaQuery.of(context).size.width*0.85,
    颜色:颜色。橙色,
    ),
    ),
    ),
    定位(
    左:0,,
    子对象:动画生成器(
    动画:过渡动画,
    生成器:(上下文,子对象){
    返回幻灯片转换(
    位置:吐温(
    开始:常量偏移量(-1,0),
    结束:常量偏移量(0,0),
    ).动画(曲线动画)(
    曲线:
    常数间隔(.01,0.25,曲线:Curves.easeinfo),
    父项:转换(动画),
    儿童:儿童);
    },
    子:容器(
    高度:MediaQuery.of(context).size.height,
    宽度:MediaQuery.of(context).size.width*0.15,
    颜色:颜色,黑色,
    ),
    ),
    ),
    ],
    ),
    浮动操作按钮:浮动操作按钮(
    已按下:(){
    transitionAnimation.repeat();
    //导航器.of(上下文).push(MaterialPageRoute(
    //生成器:(上下文)=>FirstPage(),
    //           ));
    },
    ),
    浮动ActionButtonLocation:浮动ActionButtonLocation.centerFloat,
    );
    }
    }
    
    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: const MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      const MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage>
        with SingleTickerProviderStateMixin {
      AnimationController transitionAnimation;
      @override
      void initState() {
        super.initState();
        transitionAnimation = AnimationController(
          duration: const Duration(seconds: 5),
          vsync: this,
        );
        transitionAnimation.forward();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Stack(
            children: <Widget>[
              Positioned(
                left: MediaQuery.of(context).size.width * 0.15,
                child: AnimatedBuilder(
                  animation: transitionAnimation,
                  builder: (context, child) {
                    return SlideTransition(
                        position: Tween<Offset>(
                          begin: const Offset(-2, 0),
                          end: const Offset(0, 0),
                        ).animate(CurvedAnimation(
                            curve: const Interval(0, 1, curve: Curves.easeIn),
                            parent: transitionAnimation)),
                        child: child);
                  },
                  child: Container(
                    height: MediaQuery.of(context).size.height,
                    width: MediaQuery.of(context).size.width * 0.85,
                    color: Colors.orange,
                  ),
                ),
              ),
              Positioned(
                left: 0,
                child: AnimatedBuilder(
                  animation: transitionAnimation,
                  builder: (context, child) {
                    return SlideTransition(
                        position: Tween<Offset>(
                          begin: const Offset(-1, 0),
                          end: const Offset(0, 0),
                        ).animate(CurvedAnimation(
                            curve:
                                const Interval(.01, 0.25, curve: Curves.easeInExpo),
                            parent: transitionAnimation)),
                        child: child);
                  },
                  child: Container(
                    height: MediaQuery.of(context).size.height,
                    width: MediaQuery.of(context).size.width * 0.15,
                    color: Colors.black,
                  ),
                ),
              ),
            ],
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              transitionAnimation.repeat();
    //           Navigator.of(context).push(MaterialPageRoute(
    //             builder: (context) => FirstPage(),
    //           ));
            },
          ),
          floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
        );
      }
    }