Flutter - 具有 3D 效果的页面之间的过渡

标签 flutter dart

如何在具有 3D/Cube 效果的页面之间进行转换?我需要这样的过渡 enter image description here

最佳答案

enter image description here

import 'dart:math';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter 3D transition',
        theme: ThemeData(
          backgroundColor: Colors.white,
          primarySwatch: Colors.green,
        ),
        home: Page1());
  }
}

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blue[50],
      body: Center(
        child: RaisedButton(
          onPressed: () => Navigator.of(context).pushReplacement(
            Pseudo3dRouteBuilder(this, Page2()),
          ),
          child: Text('change the page'),
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.pink[50],
      body: Center(
        child: RaisedButton(
          onPressed: () => Navigator.of(context).pushReplacement(
            Pseudo3dRouteBuilder(this, Page1()),
          ),
          child: Text('change the page'),
        ),
      ),
    );
  }
}

class Pseudo3dRouteBuilder extends PageRouteBuilder {
  final Widget enterPage;
  final Widget exitPage;
  Pseudo3dRouteBuilder(this.exitPage, this.enterPage)
      : super(
          pageBuilder: (context, animation, secondaryAnimation) => enterPage,
          transitionsBuilder: _transitionsBuilder(exitPage, enterPage),
        );

  static _transitionsBuilder(exitPage, enterPage) =>
      (context, animation, secondaryAnimation, child) {
        return Stack(
          children: <Widget>[
            SlideTransition(
              position: Tween<Offset>(
                begin: Offset.zero,
                end: Offset(-1.0, 0.0),
              ).animate(animation),
              child: Container(
                color: Colors.white,
                child: Transform(
                  transform: Matrix4.identity()
                    ..setEntry(3, 2, 0.003)
                    ..rotateY(pi / 2 * animation.value),
                  alignment: FractionalOffset.centerRight,
                  child: exitPage,
                ),
              ),
            ),
            SlideTransition(
              position: Tween<Offset>(
                begin: Offset(1.0, 0.0),
                end: Offset.zero,
              ).animate(animation),
              child: Container(
                color: Colors.white,
                child: Transform(
                  transform: Matrix4.identity()
                    ..setEntry(3, 2, 0.003)
                    ..rotateY(pi / 2 * (animation.value - 1)),
                  alignment: FractionalOffset.centerLeft,
                  child: enterPage,
                ),
              ),
            )
          ],
        );
      };
}

关于Flutter - 具有 3D 效果的页面之间的过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649977/

相关文章:

charts - Flutter Google Chart Gauge - 将标签放在中心

android-studio - 这个常量表达式的计算抛出一个表达式

sdk - flutter 包失败取决于来自 sdk 的 flutter_test any,它需要 SDK 版本 <2.0.0,版本解决失败

Flutter 3.7 基于此命令 `flutter create --template=package <package_name>` 创建与之前(3.3)和文档不同的结果

flutter - 使用 ScrollNotification 滚动出 SliverList 子项时获取该子项的索引

dart - Flutter - 选择项目后折叠 ExpansionTile

flutter - 如何在本地存储/外部 Flutter 中创建文件夹?

flutter - flutter 测试应该保存在哪里

android - 如何为 flutter 绘图应用程序实现橡皮擦功能

android - 更改 CustomPaint 的颜色会更改所有先前的点