【问题标题】:Flutter - Effect of flip cardFlutter - 翻牌效果
【发布时间】:2017-07-08 20:59:24
【问题描述】:

我正在尝试制作翻转卡,获得效果的最佳方法是什么

【问题讨论】:

  • 这是一个不恰当的问题。说请离开这个网站,去别的地方,弄清楚我在问什么,然后回来回答的问题在这里是题外话。如果您想知道异地的某人是如何做某事的,请前往那里查看页面源或联系该站点的某人并请他们分享。
  • 我已编辑问题以将 YouTube 视频转换为动画 GIF。

标签: dart flutter


【解决方案1】:

我会使用AnimatedBuilderAnimatedWidgetTransform 小部件的值设置动画。 ScaleTransition 几乎可以为您做到这一点,但它可以双向缩放,而您只需要一个。

import 'package:flutter/material.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePageState createState() => new MyHomePageState();
}

class MyCustomCard extends StatelessWidget {
  MyCustomCard({ this.colors });

  final MaterialColor colors;

  Widget build(BuildContext context) {
    return new Container(
      alignment: FractionalOffset.center,
      height: 144.0,
      width: 360.0,
      decoration: new BoxDecoration(
        color: colors.shade50,
        border: new Border.all(color: new Color(0xFF9E9E9E)),
      ),
      child: new FlutterLogo(size: 100.0, colors: colors),
    );
  }
}

class MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
  AnimationController _controller;
  Animation<double> _frontScale;
  Animation<double> _backScale;

  @override
  void initState() {
    super.initState();
    _controller = new AnimationController(
      vsync: this,
      duration: const Duration(seconds: 1),
    );
    _frontScale = new Tween(
      begin: 1.0,
      end: 0.0,
    ).animate(new CurvedAnimation(
      parent: _controller,
      curve: new Interval(0.0, 0.5, curve: Curves.easeIn),
    ));
    _backScale = new CurvedAnimation(
      parent: _controller,
      curve: new Interval(0.5, 1.0, curve: Curves.easeOut),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    ThemeData theme = Theme.of(context);

    return new Scaffold(
      appBar: new AppBar(),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.flip_to_back),
        onPressed: () {
          setState(() {
            if (_controller.isCompleted || _controller.velocity > 0)
              _controller.reverse();
            else
              _controller.forward();
          });
        },
      ),
      body: new Center(
        child: new Stack(
          children: <Widget>[
            new AnimatedBuilder(
              child: new MyCustomCard(colors: Colors.orange),
              animation: _backScale,
              builder: (BuildContext context, Widget child) {
                final Matrix4 transform = new Matrix4.identity()
                  ..scale(1.0, _backScale.value, 1.0);
                return new Transform(
                  transform: transform,
                  alignment: FractionalOffset.center,
                  child: child,
                );
              },
            ),
            new AnimatedBuilder(
              child: new MyCustomCard(colors: Colors.blue),
              animation: _frontScale,
              builder: (BuildContext context, Widget child) {
                final Matrix4 transform = new Matrix4.identity()
                  ..scale(1.0, _frontScale.value, 1.0);
                return new Transform(
                  transform: transform,
                  alignment: FractionalOffset.center,
                  child: child,
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

【讨论】:

    【解决方案2】:

    我使用简单的方法,在 X 轴上旋转它。这是完整的代码。

    void main() => runApp(MaterialApp(home: HomePage()));
    
    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin {
      AnimationController _controller;
      bool _flag = true;
      Color _color = Colors.blue;
    
      @override
      void initState() {
        super.initState();
        _controller = AnimationController(vsync: this, duration: Duration(seconds: 1), value: 1);
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
          floatingActionButton: FloatingActionButton(
            child: Icon(Icons.crop_rotate),
            onPressed: () async {
              if (_flag) {
                await _controller.reverse();
                setState(() {
                  _color = Colors.orange;
                });
                await _controller.forward();
              } else {
                await _controller.reverse();
                setState(() {
                  _color = Colors.blue;
                });
                await _controller.forward();
              }
    
              _flag = !_flag;
            },
          ),
          body: Center(
            child: AnimatedBuilder(
              animation: _controller,
              builder: (context, child) {
                return Transform(
                  transform: Matrix4.rotationX((1 - _controller.value) * math.pi / 2),
                  alignment: Alignment.center,
                  child: Container(
                    height: 100,
                    margin: EdgeInsets.symmetric(horizontal: 20),
                    padding: EdgeInsets.symmetric(vertical: 12),
                    alignment: Alignment.center,
                    decoration: BoxDecoration(color: _color.withOpacity(0.2), border: Border.all(color: Colors.grey)),
                    child: FlutterLogo(colors: _color, size: double.maxFinite),
                  ),
                );
              },
            ),
          ),
        );
      }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用flip_card Flutter 包。它可以让您定义一个前后小部件,并且可以水平或垂直翻转。

      【讨论】:

      • 它在使用悬停时不起作用。 Inkwell 的 onHover 方法并执行 FlipCardController.toggleCard()... 这不起作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2023-01-17
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多