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

Slide Widget Under Another Animated Builder Flutter

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

@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. 用堆栈替换行
  2. 调换AnimatedBuilder的位置

请看下面的代码。您也可以尝试 DartPad https://dartPad.dev/790dd8c7ef8119d0b560419fdca1727b

上的代码
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,
    );
  }
}